Постійна історія командної оболонки


12

Коли я запускаю shell-commandновий сеанс, я не маю доступу до історії команд з останнього сеансу. Як я можу це мати?


1
Ви (savehist-mode)ввімкнули?
waymondo

Якщо ви говорите про M-!, змінна історія, з якої вона читається / записується, є shell-command-historyякою (savehist-mode). Якщо запит стосується збереження постійної історії comint-input-ringбуферів оболонок, я можу допомогти і з цим, але, як я інтерпретую питання, це дозволило б його виконати.
waymondo

@waymondo ні, я цього не зробив. вирішує мою проблему. Будь ласка, дайте відповідь, щоб я міг її прийняти.
RasmusWL

Відповіді:


10

Короткий відповідь увімкнено (savehist-mode)у ваших .emacs. Це дозволить зберегти всі кільця історії мінібуферів за замовчуванням, що включає, shell-command-historyщо використовується M-!/ (shell-command).


Хоча я в цьому, я думаю, я також поясню, як завантажувати / зберігати історії команд з shell-modeпідказок та інших режимів, які випливають із цього comint-mode.

Примітка: це для мого налаштування з bash та OSX, але кишки цього повинні працювати в більшості середовищ.

  • Спочатку потрібно скопіювати історію оболонки bash у середовище вашого emacs. За замовчуванням це зберігається у змінній під назвою "HISTFILE". Я роблю це з таким (exec-path-from-shell)пакетом:

    (exec-path-from-shell-initialize)
    (exec-path-from-shell-copy-env "HISTFILE")
    
  • Тоді вам потрібно зателефонувати (turn-on-comint-history)у відповідному режимі гачками, тобто

    (defun turn-on-comint-history (history-file)
              (setq comint-input-ring-file-name history-file)
              (comint-read-input-ring 'silent))
    
    (add-hook 'shell-mode-hook
              (lambda ()
                (turn-on-comint-history (getenv "HISTFILE"))))
    
    (add-hook 'inf-ruby-mode-hook
              (lambda ()
                (turn-on-comint-history ".pry_history")))
    

Для інтерактивних режимів рубіну ви бачите, що я використовую локальний .pry_historyфайл на основі проекту.

  • Тоді вам потрібно переконатися, що ви зберігаєте файли історії коментувань при знищенні буферів та emacs:

    (add-hook 'kill-buffer-hook #'comint-write-input-ring)
    (add-hook 'kill-emacs-hook
              (lambda ()
                (--each (buffer-list)
                  (with-current-buffer it (comint-write-input-ring)))))
    

Примітка. Я використовую dash.elдля простого (--each)форматування.

Це зробить історію команд оболонки minibuffer стійкою, а також історію команд bash prompt між emacs та іншими умовами.


2

Я впевнений, що це savehistвдається управляти, ось моя установка:

;; Save sessions history
(setq savehist-save-minibuffer-history 1)
(setq savehist-additional-variables
      '(kill-ring search-ring regexp-search-ring compile-history log-edit-comment-ring)
      savehist-file "~/.emacs.d/savehist")
(savehist-mode t)

0

Я думаю, ви можете порадити shell-commandзберегти історію та перезавантажити деякі пов’язані ключові прив’язки, наприклад M-n/p, для виклику цієї історії, або навіть написати свою shell-command, використовуючи, read-from-minibufferякщо хочете.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.