ประวัติคำสั่งเชลล์ถาวร


12

เมื่อฉันเรียกใช้shell-commandในเซสชันใหม่ฉันไม่สามารถเข้าถึงประวัติคำสั่งจากเซสชันล่าสุด ฉันจะมีสิ่งนั้นได้อย่างไร


1
คุณ(savehist-mode)เปิดใช้งานหรือไม่
waymondo

หากคุณกำลังพูดคุยเกี่ยวกับM-!ตัวแปรประวัติศาสตร์มันอ่านเขียน / จากเป็นซึ่งถูกปกคลุมไปด้วยshell-command-history (savehist-mode)หากคำขอเกี่ยวกับการเก็บประวัติของcomint-input-ringบัฟเฟอร์ในเชลล์ฉันสามารถให้ความช่วยเหลือได้เช่นกัน แต่จากการที่ฉันตีความคำถามฉันจะทำอย่างไรให้สำเร็จ
waymondo

@waymondo ไม่ฉันไม่ได้ แก้ปัญหาของฉัน กรุณาตอบเพื่อที่ฉันจะได้ยอมรับมัน
RasmusWL

คำตอบ:


10

คำตอบสั้น ๆ คือเปิดใช้งาน(savehist-mode)ใน. emac ของคุณ นี้จะช่วยทุกแหวนประวัติศาสตร์ minibuffer โดยค่าเริ่มต้นซึ่งรวมถึงshell-command-historyซึ่งถูกใช้โดย/M-!(shell-command)


ในขณะที่ฉันที่มันฉันคิดว่าฉันยังจะอธิบายวิธีการโหลด / บันทึกประวัติคำสั่งจากshell-modeแจ้งและโหมดอื่น ๆ comint-modeที่เป็นผลมาจาก

หมายเหตุ: นี่สำหรับการตั้งค่าของฉันด้วย bash และ OSX แต่ความกล้าของสิ่งนี้จะทำงานได้ในสภาพแวดล้อมส่วนใหญ่

  • ก่อนอื่นคุณต้องคัดลอกประวัติ bash shell ของคุณลงในสภาพแวดล้อม emacs ของคุณ โดยค่าเริ่มต้นนี้จะถูกเก็บไว้ในตัวแปรที่เรียกว่า "HISTFILE" ฉันทำกับ(exec-path-from-shell)แพคเกจดังนี้:

    (exec-path-from-shell-initialize)
    (exec-path-from-shell-copy-env "HISTFILE")
    
  • จากนั้นคุณต้องโทร(turn-on-comint-history)ใน hooks โหมดที่เหมาะสมของคุณเช่น

    (defun turn-on-comint-history (history-file)
              (setq comint-input-ring-file-name history-file)
              (comint-read-input-ring 'silent))
    
    (add-hook 'shell-mode-hook
              (lambda ()
                (turn-on-comint-history (getenv "HISTFILE"))))
    
    (add-hook 'inf-ruby-mode-hook
              (lambda ()
                (turn-on-comint-history ".pry_history")))
    

สำหรับโหมด ruby ​​แบบโต้ตอบคุณสามารถเห็นฉันกำลังใช้.pry_historyไฟล์โลคัลในแต่ละโครงการ

  • จากนั้นคุณต้องตรวจสอบให้แน่ใจว่าคุณบันทึกไฟล์ประวัติ comint ของคุณเมื่อทำการฆ่าบัฟเฟอร์และ emacs:

    (add-hook 'kill-buffer-hook #'comint-write-input-ring)
    (add-hook 'kill-emacs-hook
              (lambda ()
                (--each (buffer-list)
                  (with-current-buffer it (comint-write-input-ring)))))
    

หมายเหตุฉันใช้dash.elสำหรับการ(--each)จัดรูปแบบรวบรัด

สิ่งนี้จะทำให้ประวัติคำสั่งเชลล์ minibuffer ของคุณคงอยู่ตลอดจนประวัติคำสั่ง bash prompt ของคุณระหว่าง emacs และข้อกำหนดอื่น ๆ


2

ฉันแน่ใจว่าsavehistสามารถจัดการสิ่งนี้ได้นี่คือการตั้งค่าของฉัน:

;; Save sessions history
(setq savehist-save-minibuffer-history 1)
(setq savehist-additional-variables
      '(kill-ring search-ring regexp-search-ring compile-history log-edit-comment-ring)
      savehist-file "~/.emacs.d/savehist")
(savehist-mode t)

0

ฉันคิดว่าคุณสามารถshell-commandให้คำแนะนำในการบันทึกประวัติและทำการแมปการเชื่อมโยงคีย์ที่เกี่ยวข้องเช่นM-n/pการเรียกใช้ประวัตินั้นหรือแม้กระทั่งการเขียนของคุณเองshell-commandโดยใช้read-from-minibufferหากคุณต้องการ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.