Scal historię z wielu eshells


9

Przed przejściem do eshell miałem konfigurację zsh, aby:

  • Po każdym poleceniu wypisz do pliku historii
  • Dołącz zamiast zastępuj plik historii, aby podczas uruchamiania wielu powłok wszystkie były scalone w jedną dużą historię

Obie opcje zsh są tutaj udokumentowane (patrz APPEND_HISTORY i INC_APPEND_HISTORY).

Jest to bardzo przydatne w połączeniu z dużym rozmiarem historii, ponieważ możesz otworzyć nowy tydzień powłoki po wydaniu polecenia i znaleźć go w swojej historii (bez tych opcji duża historia jest bezużyteczna, ponieważ będzie zawierała tylko historię ostatnio zamkniętych muszla). Oznacza to także, że możesz otwierać nowe powłoki i natychmiast znać ich najnowsze polecenia w innych powłokach. Czy istnieje sposób skonfigurowania eshell za pomocą tego zachowania? Pierwsza kula wydaje się dość łatwa, ale dołączanie wygląda na trudniejsze ...

Odpowiedzi:


3

Oświadczenie: Nie używam skorupy, więc weź to z odrobiną soli.

eshellzdaje się wywoływać eshell-write-historyzapisywanie historii, która przyjmuje opcjonalny argument appenddomyślnie nil. Ten argument wydaje się być eshellobecnie nieużywany , ale wydaje się, że działa (przekazuje argument do write-region, który właściwie dołącza).

Jest tu kilka opcji.

  1. (setq eshell-save-history-on-exit nil)i zadzwoń do eshell-write-historysiebie
  2. Przedefiniuj, eshell-write-historyaby spełnić Twoje wymagania.

Osobiście wybrałbym 1.

Jako przykład:

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

Podziękowania dla @ Joseph-Garvin za poprawioną, działającą eshell-append-historyfunkcję

Nie obsługuje to dynamicznego ładowania nowej zawartości historii do powłoki (np. Uruchom polecenie Xw powłoce A i wyświetlenie jej w historii w powłoce B bez ponownego ładowania; jak SHARE_HISTORY zsh). Nie wiem, jak skuteczny eshell-read-historyjest, więc wahałbym się, żeby go uruchomić.

Możliwe jest również, że dzięki tej eshell-append-historyfunkcji skończą się zduplikowane wpisy . Być może będziesz musiał zrobić kilka shenaniganów, usuwając wszystko oprócz najnowszego wpisu z eshell-history-ring, a następnie resetując go do starej wartości po zapisaniu historii.

Na przykład

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

Dzięki, wygląda świetnie. W pierwszym fragmencie brakuje jednak cytatu na końcu dokumentu.
Joseph Garvin,

Musiałem go trochę edytować, okazuje się, że pierścienie trzeba zmodyfikować za pomocą funkcji ring- * albo napotkasz błędy. Używam również dynamicznego wiązania, aby tymczasowo zastąpić definicję eshell-history-ring zamiast tworzyć kopię. Jeśli umieścisz tutaj kod w odpowiedzi, oznaczę jako zaakceptowany, odkąd masz piłkę: pastebin.com/zEE7B6d7
Joseph Garvin

@JosephGarvin gotowe!
J David Smith,

To rozwiązanie działa świetnie, ale również musiał zestaw eshell-exit-hookdo zera, bo to jest ładowany automatycznie, gdy zaczyna eshell: (add-hook 'eshell-exit-hook 'eshell-write-history nil t). Ustawiam hak na lokalnie zero (domyślnie jest globalnie zero):(add-hook 'eshell-mode-hook '(lambda () (setq eshell-exit-hook nil)))
GDP2
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.