免責事項:私は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))