Lịch sử lệnh vỏ liên tục


12

Khi tôi chạy shell-commandtrong một phiên mới, tôi không có quyền truy cập vào lịch sử của các lệnh từ phiên trước. Làm thế nào tôi có thể có điều đó?


1
bạn đã (savehist-mode)kích hoạt chưa
waymondo 11/03/2015

Nếu bạn đang nói về M-!, biến lịch sử mà nó đọc / ghi từ là shell-command-history, được bao phủ bởi (savehist-mode). Nếu yêu cầu liên quan đến việc giữ một lịch sử liên tục của comint-input-ringbộ đệm shell, tôi cũng có thể hỗ trợ với điều đó, nhưng từ cách tôi diễn giải câu hỏi, điều này sẽ thực hiện được.
waymondo 11/03/2015

@waymondo không, tôi thì không. giải quyết vấn đề của tôi Hãy làm cho một câu trả lời để tôi có thể chấp nhận nó.
RasmusWL 11/03/2015

Câu trả lời:


10

Câu trả lời ngắn được kích hoạt (savehist-mode)trong .emacs của bạn. Điều này sẽ lưu tất cả các vòng lịch sử của xe buýt nhỏ theo mặc định, bao gồm cả shell-command-historyđược sử dụng bởi M-!/ (shell-command).


Trong khi tôi đang ở đó, tôi cũng sẽ giải thích cách tải / lưu lịch sử lệnh từ các shell-modelời nhắc và các chế độ khác xuất phát từ đó comint-mode.

Lưu ý: đây là thiết lập của tôi với bash và OSX, nhưng can đảm của nó sẽ hoạt động trong hầu hết các môi trường.

  • Trước tiên, bạn cần sao chép lịch sử bash shell vào môi trường emacs của bạn. Theo mặc định, điều này được lưu trữ trong một biến gọi là "HISTFILE". Tôi làm điều này với (exec-path-from-shell)gói như vậy:

    (exec-path-from-shell-initialize)
    (exec-path-from-shell-copy-env "HISTFILE")
    
  • Sau đó, bạn cần gọi (turn-on-comint-history)trong móc chế độ thích hợp của bạn, tức là

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

Đối với các chế độ ruby ​​tương tác, bạn có thể thấy tôi đang sử dụng .pry_historytệp cục bộ trên cơ sở từng dự án.

  • Sau đó, bạn cần đảm bảo rằng bạn lưu các tệp lịch sử comint của mình khi tiêu diệt bộ đệm và 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)))))
    

Lưu ý tôi đang sử dụng dash.elcho (--each)định dạng cô đọng .

Điều này sẽ làm cho lịch sử lệnh shell shelluffer của bạn liên tục cũng như lịch sử lệnh bash prompt của bạn giữa emacs và các điều khoản khác.


2

Tôi chắc chắn rằng savehistcó thể quản lý điều này, đây là thiết lập của tôi:

;; 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

Tôi nghĩ bạn có thể tư vấn shell-commandđể lưu lịch sử và sắp xếp lại một số ràng buộc quan trọng liên quan, ví dụ M-n/p, để gọi lịch sử đó, hoặc thậm chí viết riêng của bạn shell-commandbằng cách sử dụng read-from-minibuffernếu bạn muốn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.