Führen Sie den Verlauf mehrerer Schalen zusammen

9

Bevor ich zu eshell wechselte, hatte ich zsh eingerichtet, damit es:

  • Schreiben Sie nach jedem Befehl in die Verlaufsdatei
  • Hängen Sie die Verlaufsdatei an, anstatt sie zu überschreiben, damit beim Ausführen mehrerer Shells alle zu einem großen Verlauf zusammengeführt werden

Beide zsh-Optionen sind hier dokumentiert (siehe APPEND_HISTORY und INC_APPEND_HISTORY).

Dies ist in Kombination mit einer großen Verlaufsgröße sehr nützlich, da Sie eine neue Shell Wochen nach der Ausgabe eines Befehls öffnen und in Ihrem Verlauf finden können (ohne diese Optionen ist ein großer Verlauf nutzlos, da er nur den Verlauf des zuletzt geschlossenen Verlaufs enthält Schale). Es bedeutet auch, dass Sie neue Shells öffnen und sie sofort Ihre neuesten Befehle in anderen Shells kennen lassen können. Gibt es eine Möglichkeit, eshell mit diesem Verhalten einzurichten? Die erste Kugel scheint einfach zu sein, aber das Anhängen sieht schwieriger aus ...

Joseph Garvin
quelle

Antworten:

3

Haftungsausschluss: Ich benutze keine Schale, also nimm das mit einem Körnchen Salz.

eshellscheint aufzurufen eshell-write-history, um den Verlauf zu schreiben, der ein optionales Argument verwendet, appenddas standardmäßig verwendet wird nil. Dieses Argument scheint eshellderzeit nicht verwendet zu werden, scheint jedoch zu funktionieren (es leitet das Argument an weiter write-region, das ordnungsgemäß angehängt wird).

Hier gibt es einige Möglichkeiten.

  1. (setq eshell-save-history-on-exit nil)und ruf eshell-write-historydich an
  2. Definieren Sie neu eshell-write-history, um Ihre Anforderungen zu erfüllen.

Persönlich würde ich mit 1 gehen.

Als Beispiel:

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

Dank @ joseph-garvin für die korrigierte, eshell-append-historyArbeitsfunktion

Dies behandelt das dynamische Laden des neuen Verlaufsinhalts in eine Shell nicht (z. B. Ausführen eines Befehls Xin Shell A und Anzeigen des Verlaufs in Shell B ohne erneutes Laden; wie z. B. SHARE_HISTORY von zsh). Ich weiß nicht, wie effizient es eshell-read-historyist, also würde ich zögern, es in einem Haken laufen zu lassen.

Es ist auch möglich, dass Sie mit dieser eshell-append-historyFunktion doppelte Einträge erhalten . Möglicherweise müssen Sie einige Spielereien ausführen, indem Sie alle bis auf den letzten Eintrag löschen eshell-history-ringund ihn dann nach dem Schreiben des Verlaufs auf den alten Wert zurücksetzen.

Z.B

(let ((old-ring (copy-list eshell-history-ring)))
  (setq eshell-history-ring (list (car eshell-history-ring)))
  ; write
  (setq eshell-history-ring old-ring))
J David Smith
quelle
Danke, das sieht gut aus. In Ihrem ersten Ausschnitt fehlt jedoch ein Zitat am Ende der Dokumentzeichenfolge.
Joseph Garvin
Ich musste es einige bearbeiten, es stellte sich heraus, dass Ringe durch die ring- * Funktionen modifiziert werden müssen oder Sie auf Fehler stoßen. Außerdem verwende ich die dynamische Bindung, um die Definition von eshell-history-ring vorübergehend zu überschreiben, anstatt eine Kopie zu erstellen. Wenn Sie den Code hier in Ihre Antwort einfügen, werde ich als akzeptiert markieren, da Sie den Ball ins Rollen gebracht haben: pastebin.com/zEE7B6d7
Joseph Garvin
@ JosephGarvin fertig!
J David Smith
Diese Lösung funktioniert großartig, aber ich musste auch eshell-exit-hookauf Null setzen , da diese automatisch geladen wird, wenn eshell startet : (add-hook 'eshell-exit-hook 'eshell-write-history nil t). Ich habe den Haken so eingestellt, dass er lokal null ist (standardmäßig ist er global null):(add-hook 'eshell-mode-hook '(lambda () (setq eshell-exit-hook nil)))
GDP2