Об’єднайте історію з декількох ешеллів


9

Перед переходом на eshell у мене було встановлено zsh, щоб воно:

  • Випишіть у файл історії після кожної команди
  • Додайте, а не перезаписуйте файл історії, щоб при запуску декількох оболонок вони об'єдналися в одну велику історію

Обидва ЗШ варіанти описані тут (див APPEND_HISTORY і INC_APPEND_HISTORY).

Це дуже корисно в поєднанні з великим розміром історії, оскільки ви можете відкрити нову оболонку тижнів після видачі команди та знайти її у своїй історії (без цих параметрів велика історія марна, оскільки вона буде містити лише історію останнього закритого оболонки). Це також означає, що ви можете відкрити нові оболонки і негайно знати їх останні команди в інших оболонках. Чи є спосіб налаштувати ешел з такою поведінкою? Перша куля здається досить простою, але приваблива виглядає складніше ...

Відповіді:


3

Відмова: Я не використовую ешель, тому прийміть це із зерном солі.

eshellЗдається, закликає eshell-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's 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))

Дякую, це виглядає чудово. У вашому першому фрагменті відсутня цитата в кінці документа.
Джозеф Гарвін

Мені довелося щось відредагувати, виявляється, кільця потрібно модифікувати за функціями ring- * або ви зіткнулися з помилками. Також я використовую динамічне прив'язування, щоб тимчасово змінити визначення eshell-history-ring замість того, щоб робити копію. Якщо ви сюди вкладете код у свою відповідь, я відзначу як прийнятий з моменту, коли ви отримали кульку: pastebin.com/zEE7B6d7
Джозеф Гарвін

@JosephGarvin зроблено!
Дж. Девід Сміт

Це рішення відмінно працює, але я також повинен був набір eshell-exit-hookдо нуля , так як це автоматично завантажується при eshell починається: (add-hook 'eshell-exit-hook 'eshell-write-history nil t). Я встановив гачок, щоб він був локально нульовим так (за замовчуванням це глобально (add-hook 'eshell-mode-hook '(lambda () (setq eshell-exit-hook nil)))
нульове значення
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.