Постоянная история команд оболочки

12

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

RasmusWL
источник
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)форматирования.

Это сделает вашу историю команд оболочки минибуфера постоянной, а также историю команд командной строки bash между emacs и другими терминами.

waymondo
источник
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)
yPhil
источник
0

Я думаю, вы можете посоветовать shell-commandсохранить историю и переназначить некоторые связанные привязки клавиш, например M-n/p, для вызова этой истории, или даже написать свою собственную shell-command, используя, read-from-minibufferесли хотите.

xuchunyang
источник