【发布时间】:2014-04-08 22:58:32
【问题描述】:
使用 shell 的一个非常有用的节省时间的方法是您可以使用 Ctrl - r 搜索命令历史记录。 Emacs 在其 shell 模式下具有相同的功能:C-S-r。但是,每次重新启动 emacs 时都会清除 shell 的历史记录。知道如何坚持历史吗?
【问题讨论】:
使用 shell 的一个非常有用的节省时间的方法是您可以使用 Ctrl - r 搜索命令历史记录。 Emacs 在其 shell 模式下具有相同的功能:C-S-r。但是,每次重新启动 emacs 时都会清除 shell 的历史记录。知道如何坚持历史吗?
【问题讨论】:
一般来说答案是:
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 模式会自动遵循这一点。
在我看来,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,所以我无法告诉你这个功能最近是否发生了变化。
【讨论】: