Gabungkan riwayat dari beberapa eshell

9

Sebelum beralih ke eshell saya memiliki pengaturan zsh sehingga akan:

  • Tuliskan ke file histori setelah setiap perintah
  • Tambahkan daripada menimpa file histori sehingga ketika menjalankan banyak shell, mereka semua akan digabung menjadi satu histori besar

Kedua opsi zsh didokumentasikan di sini (lihat APPEND_HISTORY dan INC_APPEND_HISTORY).

Ini sangat berguna ketika digabungkan dengan ukuran histori yang besar karena Anda dapat membuka minggu shell baru setelah mengeluarkan perintah dan menemukannya di histori Anda (tanpa opsi ini histori yang besar tidak berguna karena hanya akan berisi histori yang baru saja ditutup kulit). Ini juga berarti Anda dapat membuka shell baru dan minta mereka segera mengetahui perintah terbaru Anda di shell lain. Apakah ada cara untuk mengatur eshell dengan perilaku ini? Peluru pertama tampaknya cukup mudah tetapi menambahkan terlihat lebih rumit ...

Joseph Garvin
sumber

Jawaban:

3

Penafian: Saya tidak menggunakan eshell, jadi ambil ini dengan sebutir garam.

eshelltampaknya memanggil eshell-write-historyuntuk menulis riwayat, yang mengambil argumen opsional appendyang secara default nil. Argumen ini tampaknya tidak digunakan pada eshellsaat ini, tetapi tampaknya berfungsi (ia melewati argumen sampai write-region, yang tidak benar ditambahkan).

Ada beberapa opsi di sini.

  1. (setq eshell-save-history-on-exit nil)dan panggil eshell-write-historydirimu sendiri
  2. Tetapkan ulang eshell-write-historyuntuk memenuhi kebutuhan Anda.

Secara pribadi, saya akan pergi dengan 1.

Sebagai contoh:

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

Terima kasih kepada @ joseph-garvin untuk fungsi yang diperbaiki dan eshell-append-historyberfungsi

Ini tidak menangani secara dinamis memuat konten sejarah baru ke dalam shell (misalnya menjalankan perintah Xdi shell A, dan memiliki itu muncul dalam sejarah di shell B tanpa memuat ulang; seperti SHARE_HISTORY zsh). Saya tidak tahu seberapa efisiennya eshell-read-history, jadi saya akan ragu menjalankannya.

Mungkin juga Anda akan berakhir dengan entri duplikat dengan eshell-append-historyfungsi ini . Anda mungkin perlu melakukan beberapa gangguan dengan menghapus semua entri kecuali yang paling baru eshell-history-ring, kemudian mengatur ulang ke nilai lama setelah menulis sejarah.

Misalnya

(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
sumber
Terima kasih, ini terlihat hebat. Cuplikan pertama Anda tidak memiliki kuotasi di akhir dokumentasi.
Joseph Garvin
Saya harus mengeditnya, ternyata dering perlu dimodifikasi oleh fungsi ring- * atau Anda mengalami kesalahan. Saya juga menggunakan pengikatan dinamis untuk sementara waktu menimpa definisi eshell-history-ring daripada membuat salinan. Jika Anda memasukkan kode di sini ke jawaban Anda, saya akan menandai sebagai diterima sejak Anda mendapatkan bola bergulir: pastebin.com/zEE7B6d7
Joseph Garvin
@ JosephephGarvin selesai!
J David Smith
Solusi ini karya besar, tapi saya juga harus set eshell-exit-hookke nil karena ini secara otomatis akan dimuat ketika eshell dimulai: (add-hook 'eshell-exit-hook 'eshell-write-history nil t). Saya menetapkan hook menjadi nihil lokal seperti itu (secara global nihil secara default):(add-hook 'eshell-mode-hook '(lambda () (setq eshell-exit-hook nil)))
GDP2