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


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

Это сделает вашу историю команд оболочки минибуфера постоянной, а также историю команд командной строки bash между 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.