Emacs shell:重启后命令历史丢失

时间:2014-04-08 22:58:33

标签: shell emacs

使用shell非常有用的节省时间是您可以使用Ctrl-r搜索命令历史记录。 Emacs在shell模式下具有相同的功能:C-S-r。但是,每次重新启动emacs时都会清除shell的历史记录。知道如何坚持历史吗?

1 个答案:

答案 0 :(得分:4)

一般来说,答案是:

M-x customize-group RET savehist RET

启用savehist-mode并配置您希望在会话之间保留的变量。

然而在这种情况下,我认为你会发现它是你的shell跟踪它的命令历史;不是Emacs。

e.g。对于bash,命令存储在$HISTFILE(默认为~/.bash_history),但根据您的设置,一个shell的历史记录可能被另一个shell破坏,具体取决于哪一个退出。对于bash,请阅读其手册页的HISTORY部分。

修改:对于comint-mode和衍生品(包括shell-mode),可搜索的历史记录通过comint-read-input-ring读取,其使用您可以在模式挂钩中设置的comint-input-ring-file-name。但是,我建议您实际将HISTFILE环境变量设置为~/.zsh_history,因为shell模式会自动延迟。{/ p>

对我来说,似乎有点奇怪,zsh还没有这样做,请注意(假设你是从zsh shell启动Emacs的?)。如果你使用某种GUI启动器,OTOH,Emacs启动的环境可能不是你想要的?我不能肯定地说。

如果不这样做,文档表明这应该有效:

(add-hook 'shell-mode-hook 'my-shell-mode-hook)
(defun my-shell-mode-hook ()
  (setq comint-input-ring-file-name "~/.zsh_history")
  (comint-read-input-ring t))

(但使用HISTFILE会更好)。

n.b。我正在使用Emacs 24.3并且键绑定与您描述的不同(M-r以shell模式搜索历史记录; C-S-r对我来说是未绑定的),因此YMMV。我总是在ansi-term内运行我的shell,所以我无法告诉你这个功能最近是否有所改变。