Краткий ответ - это включить (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 и другими терминами.
(savehist-mode)включил?