複数のeshellの履歴をマージする


9

eshellに切り替える前に、次のようにzshをセットアップしました。

  • コマンドごとに履歴ファイルに書き出す
  • 履歴ファイルを上書きするのではなく追加するので、複数のシェルを実行しているとき、それらはすべて1つの大きな履歴にマージされます。

両方のzshオプションがここに記載されています(APPEND_HISTORYおよびINC_APPEND_HISTORYを参照)。

これは、コマンドを発行してから数週間後に新しいシェルを開いて履歴で見つけることができるため、大きな履歴サイズと組み合わせると非常に便利です(これらのオプションがないと、最近閉じた履歴のみが含まれるため、大きな履歴は役に立ちません。シェル)。また、新しいシェルを開いて、他のシェルの最新のコマンドをすぐに認識させることもできます。この動作でeshellをセットアップする方法はありますか?最初の箇条書きは十分に簡単に思えますが、追加は注意が必要です...

回答:


3

免責事項:私はeshellを使用しないので、これを塩の粒と一緒に服用してください。

eshelleshell-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))

よろしくお願いします。最初のスニペットには、docstringの最後に引用符がありません。
Joseph Garvin、2015

私はそれをいくつか編集しなければならなかった、リングがring- *関数によって変更される必要があることが判明した、またはエラーが発生した。また、コピーを作成する代わりに、動的バインディングを使用して一時的にeshell-history-ringの定義をオーバーライドします。あなたが答えにここにコードを入れた場合、私はあなたがボールを転がしたので受け入れられたものとしてマークします:pastebin.com/zEE7B6d7
Joseph Garvin

@JosephGarvinできました!
J David Smith、

このソリューションはうまく機能しeshell-exit-hookますが、eshellの起動時に自動的に読み込まれるため、nil に設定する必要もありました(add-hook 'eshell-exit-hook 'eshell-write-history nil t)。そのようにフックをローカルでnilに設定しました(デフォルトではグローバルにnilです):(add-hook 'eshell-mode-hook '(lambda () (setq eshell-exit-hook nil)))
GDP2
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.