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

3

在处理shell命令时,一个非常有用的时间节省方式是使用Ctrl-r来搜索命令历史记录。Emacs在其shell模式中具有相同的功能:C-S-r。然而,每次重新启动emacs时,Shell的历史记录都会被清除。你有什么办法使历史记录持久化吗?

1个回答

4
通常的答案是:
输入 M-x customize-group RET savehist RET,启用 savehist-mode 并配置您希望在会话之间保留的变量。
但是,在这种情况下,我认为您会发现跟踪命令历史记录的是您的 shell 而不是 Emacs。
例如,对于 bash,命令存储在 $HISTFILE(默认为 ~/.bash_history)中,但是根据您的设置,一个 shell 的历史记录可能会被另一个 shell 覆盖,具体取决于哪个 shell 最后退出。有关 bash,请阅读其手册中的 HISTORY 部分。
编辑:对于 comint-mode 和衍生模式(包括 shell-mode),可以通过 comint-read-input-ring 读取可搜索的历史记录,该函数使用模式钩子中可以设置的 comint-input-ring-file-name。但是,我建议您实际上将您的 HISTFILE 环境变量设置为 ~/.zsh_history,因为 shell-mode 会自动使用它。
对我来说,这似乎有点奇怪,因为 zsh 没有这样做(假设您是从 zsh shell 启动 Emacs?)。另一方面,如果您使用某种 GUI 启动器,则 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更好)。

注意:我使用的是Emacs 24.3版本,快捷键与您描述的不同(在shell模式下搜索历史记录使用M-rC-S-r对我来说未绑定),因此结果可能会有所不同。我总是在ansi-term中运行我的shell,所以我无法告诉您这种功能是否最近有所改变。


我已经让迷你缓冲区历史记录正常工作了。但是,Emacs 中仍然缺少 shell 历史记录。我正在使用 zsh,所以我应该设置 Emacs 指向 ~/.zsh_history 吗?我在哪里可以做到这一点? - Shuo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接