एकाधिक एसेल्स से इतिहास मर्ज करें


9

Eshell पर जाने से पहले मेरे पास zsh सेटअप था ताकि यह होगा:

  • हर कमांड के बाद इतिहास फ़ाइल में लिखें
  • इतिहास फ़ाइल को अधिलेखित करने के बजाय एक से अधिक गोले चलाते समय वे सभी एक बड़े इतिहास में विलय हो जाएंगे

दोनों zsh विकल्पों को यहां दस्तावेजित किया गया है (देखें APPEND_HISTORY और INC_APPEND_HISTORY)।

यह एक बड़े इतिहास के आकार के साथ संयुक्त होने पर सुपर उपयोगी है क्योंकि आप एक कमांड जारी करने के बाद एक नया शेल सप्ताह खोल सकते हैं और इसे अपने इतिहास में पा सकते हैं (इन विकल्पों के बिना एक बड़ा इतिहास बेकार है क्योंकि इसमें केवल सबसे हाल ही में बंद इतिहास शामिल होगा। शेल)। इसका मतलब यह भी है कि आप नए गोले खोल सकते हैं और उन्हें तुरंत अपने सबसे हाल के आदेशों को अन्य गोले में जान सकते हैं। क्या इस व्यवहार के साथ सेटअप करने का कोई तरीका है? पहली गोली काफी आसान लगती है लेकिन आकर्षक लग रहा है मुश्किल ...

जवाबों:


3

डिस्क्लेमर: मैं एसहेल का उपयोग नहीं करता, इसलिए इसे नमक के दाने के साथ लें।

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

सही, काम कर रहे eshell-append-historyसमारोह के लिए @ जोसेफ-गार्विन के लिए धन्यवाद

यह गतिशील रूप से नए इतिहास सामग्री को शेल में लोड नहीं करता है (जैसे Xशेल ए में कमांड चलाएँ , और इसे शेल बी में इतिहास में पुनः लोड किए बिना दिखाई देता है; जैसे zsh का 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))

धन्यवाद, यह बहुत अच्छा लग रहा है। आपका पहला स्निपेट हालांकि डॉकस्ट्रिंग के अंत में एक उद्धरण याद कर रहा है।
जोसेफ गार्विन 15

मुझे इसे कुछ संपादित करना था, रिंगों को रिंग द्वारा संशोधित करने की आवश्यकता है- * फ़ंक्शन या आप त्रुटियों में चलते हैं। इसके अलावा, मैं एक प्रतिलिपि बनाने के बजाय अस्थायी रूप से eshell-history-ring की परिभाषा को ओवरराइड करने के लिए डायनेमिक बाइंडिंग का उपयोग करता हूं। यदि आप अपने उत्तर में यहाँ कोड डालते हैं तो मैं आपको गेंद को लुढ़कने के बाद स्वीकार कर लेता हूँ
जोसेफ गार्विन

@ जोसेफगर्विन ने किया!
जे डेविड स्मिथ

यह समाधान महान काम करता है, लेकिन मुझे भी eshell-exit-hookशून्य पर सेट करना पड़ा क्योंकि एशेल शुरू होने पर यह स्वचालित रूप से लोड हो जाता है (add-hook 'eshell-exit-hook 'eshell-write-history nil t):। मैं हुक को स्थानीय रूप से शून्य होने के लिए सेट करता हूं (यह डिफ़ॉल्ट रूप से विश्व स्तर पर शून्य है):(add-hook 'eshell-mode-hook '(lambda () (setq eshell-exit-hook nil)))
जीडीपी 2
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.