Birden çok kabuktan geçmişi birleştir


9

Eshell geçmeden önce ben olurdu ki zsh kurulum vardı:

  • Her komuttan sonra geçmiş dosyasına yazın
  • Geçmiş dosyasının üzerine yazmak yerine ekleyin, böylece birden fazla mermi çalıştırırken hepsi büyük bir tarihe karışır

Her iki zsh seçeneği de burada belgelenmiştir (bkz. APPEND_HISTORY ve INC_APPEND_HISTORY).

Bu, büyük bir geçmiş boyutuyla birleştirildiğinde çok kullanışlıdır, çünkü bir komut verdikten haftalar sonra yeni bir kabuk açabilir ve geçmişinizde bulabilirsiniz (bu seçenekler olmadan büyük bir tarih işe yaramaz çünkü yalnızca en son kapatılanların geçmişini içerecektir kabuk). Ayrıca, yeni mermiler açabileceğiniz ve diğer mermilerdeki en son komutlarınızı hemen bilmelerini sağlayabileceğiniz anlamına gelir. Bu davranışla eshell kurmanın bir yolu var mı? İlk mermi yeterince kolay görünüyor ama ekleme daha zor görünüyor ...

Yanıtlar:


3

Yasal Uyarı: Eshell kullanmıyorum, bu yüzden bunu bir tane tuzla alın.

eshellvarsayılan olarak eshell-write-historyisteğe bağlı bir argüman alan geçmiş yazmak için çağırıyor gibi görünüyor . Bu argüman şu anda kullanılmamış gibi görünüyor , ancak işe yarıyor gibi görünüyor (argümanı doğru bir şekilde ekleyen üzerinden geçiriyor).appendnileshellwrite-region

Burada birkaç seçenek var.

  1. (setq eshell-save-history-on-exit nil)ve eshell-write-historykendini ara
  2. Yeniden tanımla eshell-write-historygereksinimi karşılamak için.

Şahsen ben 1 ile giderdim.

Örnek olarak:

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

Düzeltilmiş çalışma eshell-append-historyfonksiyonu için @ joseph-garvin'e teşekkürler

Bu, yeni geçmiş içeriklerinin bir kabuğa dinamik olarak yüklenmesini işlemez (örn. XA kabuğundaki çalıştırma komutu ve yeniden yüklenmeden B kabuğundaki geçmişte görünmesi; zsh'ın SHARE_HISTORY gibi). Ne kadar verimli eshell-read-historyolduğunu bilmiyorum , bu yüzden bir kancada çalıştırmak için tereddüt ederdim.

Bu eshell-append-historyişlevle yinelenen girişler yapmanız da mümkündür . En son giriş dışındaki tüm kayıtları temizleyerek eshell-history-ring, ardından geçmişi yazdıktan sonra eski değerine sıfırlayarak bazı shenaniganslar yapmanız gerekebilir .

Örneğin

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

Teşekkürler, bu harika görünüyor. İlk kod parçanızda doktrin sonunda bir teklif eksik.
Joseph Garvin

Bazı düzenlemek zorunda kaldım, halkalar ring- * fonksiyonları tarafından değiştirilmesi gerekiyor ya da hatalarla karşılaşırsınız. Ayrıca bir kopya yapmak yerine eshell-history-ring tanımını geçici olarak geçersiz kılmak için dinamik bağlama kullanıyorum. Kodu buraya cevabınıza koyarsanız, topu yuvarladığınızdan beri kabul edilen olarak işaretleyeceğim: pastebin.com/zEE7B6d7
Joseph Garvin

@JosephGarvin bitti!
J David Smith

Bu çözüm inşaat büyük, ama aynı zamanda kümesine sahip eshell-exit-hookbu otomatik olarak yüklenir olur çünkü eshell başladığında sıfıra: (add-hook 'eshell-exit-hook 'eshell-write-history nil t). Kancayı yerel olarak bu şekilde sıfır olarak ayarladım (varsayılan olarak küresel olarak sıfırdır):(add-hook 'eshell-mode-hook '(lambda () (setq eshell-exit-hook nil)))
GDP2
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.