合并多个eshell的历史记录


9

在切换到eshell之前,我先进行了zsh设置,以便:

  • 每条命令后写出到历史文件
  • 追加而不是覆盖历史记录文件,因此在运行多个shell时,它们都将合并为一个大历史记录

这两个zsh选项均在此处记录(请参阅APPEND_HISTORY和INC_APPEND_HISTORY)。

当与较大的历史记录大小结合使用时,这非常有用,因为您可以在发出命令后几周内打开一个新的Shell,并在历史记录中找到它(没有这些选项,较大的历史记录将无用,因为它仅包含最近关闭的历史记录贝壳)。这也意味着您可以打开新的Shell,并使它们立即知道其他Shell中的最新命令。有什么办法可以设置这种行为的eshell吗?第一个项目符号似乎很容易,但是追加看起来就比较棘手了。

Answers:


3

免责声明:我不使用eshell,所以请带一点盐。

eshell似乎在调用eshell-write-history写入历史记录,该记录接受一个可选参数append,默认为nil。该参数eshell目前似乎尚未使用,但确实起作用(它将参数传递给write-region,可以正确追加)。

这里有两个选择。

  1. (setq eshell-save-history-on-exit nil)eshell-write-history自己打电话
  2. 重新定义eshell-write-history以满足您的要求。

就个人而言,我会选择1。

举个例子:

(setq eshell-save-history-on-exit nil)
(defun eshell-append-history ()
  "Call `eshell-write-history' with the `append' parameter set to `t'."
  (when eshell-history-ring
    (let ((newest-cmd-ring (make-ring 1)))
      (ring-insert newest-cmd-ring (car (ring-elements eshell-history-ring)))
      (let ((eshell-history-ring newest-cmd-ring))
        (eshell-write-history eshell-history-file-name t)))))
(add-hook eshell-pre-command-hook #'eshell-append-history)

感谢@ joseph-garvin提供更正的工作eshell-append-history功能

这不能将新的历史内容动态地加载到外壳中(例如,X在外壳A中运行命令,而无需重新加载就将其显示在外壳B中的历史中;就像zsh的SHARE_HISTORY一样)。我不知道效率有多高eshell-read-history,所以我很犹豫是否将其挂接到钩子上。

使用此eshell-append-history功能可能还会导致重复的条目。您可能需要执行一些恶作剧,从中清除除最近的条目以外的所有条目eshell-history-ring,然后在写入历史记录后将其重置为旧值。

例如

(let ((old-ring (copy-list eshell-history-ring)))
  (setq eshell-history-ring (list (car eshell-history-ring)))
  ; write
  (setq eshell-history-ring old-ring))

谢谢,这看起来很棒。不过,您的第一个代码片段在文档字符串末尾缺少引号。
约瑟夫·加文2015年

我必须对其进行一些编辑,结果是环需要通过ring- *函数进行修改,否则会遇到错误。另外,我使用动态绑定来临时覆盖eshell-history-ring的定义,而不是进行复制。如果您在此处将代码放入答案中,则自从发生问题以来,我会标记为已接受:pastebin.com/zEE7B6d7
Joseph Garvin 2015年

@JosephGarvin完成了!
J大卫·史密斯

此解决方案效果很好,但我还必须将其设置eshell-exit-hook为nil,因为它会在eshell启动时自动加载:(add-hook 'eshell-exit-hook 'eshell-write-history nil t)。我像这样将钩子设置为本地零(默认情况下全局为零):(add-hook 'eshell-mode-hook '(lambda () (setq eshell-exit-hook nil)))
GDP2
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.