免责声明:我不使用eshell,所以请带一点盐。
eshell
似乎在调用eshell-write-history
写入历史记录,该记录接受一个可选参数append
,默认为nil
。该参数eshell
目前似乎尚未使用,但确实起作用(它将参数传递给write-region
,可以正确追加)。
这里有两个选择。
(setq eshell-save-history-on-exit nil)
给eshell-write-history
自己打电话
- 重新定义
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))