Persistente Shell-Befehls-Historie


12

Wenn ich shell-commandin einer neuen Sitzung starte, habe ich keinen Zugriff auf den Befehlsverlauf der letzten Sitzung. Wie kann ich das haben?


1
hast du (savehist-mode)aktiviert
Waymondo

Wenn Sie darüber sprechen M-!, ist die Verlaufsvariable, aus der gelesen / geschrieben wird shell-command-history, die mit abgedeckt wird (savehist-mode). Wenn es bei der Anfrage darum geht, eine persistente Historie der comint-input-ringIn-Shell-Puffer zu führen, kann ich auch dabei behilflich sein, aber wenn ich die Frage interpretiere, würde dies dies erreichen.
Waymondo

@waymondo nein, habe ich nicht. löst mein problem Bitte geben Sie eine Antwort, damit ich diese annehmen kann.
RasmusWL

Antworten:


10

Die kurze Antwort lautet "enable" (savehist-mode)in Ihren .emacs. Dadurch werden standardmäßig alle Minibuffer-Verlaufsringe gespeichert, einschließlich shell-command-historyder von M-!/ verwendeten (shell-command).


Während ich gerade dabei bin, werde ich auch erklären, wie Befehlsverläufe aus shell-modeEingabeaufforderungen und anderen Modi, die sich daraus ableiten , geladen / gespeichert werden comint-mode.

Hinweis: Dies gilt für mein Setup mit Bash und OSX, aber der Mut dazu sollte in den meisten Umgebungen funktionieren.

  • Zuerst müssen Sie Ihren Bash-Shell-Verlauf in die Umgebung Ihres Emacs kopieren. Standardmäßig wird dies in einer Variablen namens "HISTFILE" gespeichert. Ich mache das mit dem (exec-path-from-shell)Paket so:

    (exec-path-from-shell-initialize)
    (exec-path-from-shell-copy-env "HISTFILE")
    
  • Dann müssen Sie (turn-on-comint-history)in Ihrem entsprechenden Modus Hooks aufrufen , dh

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

Bei interaktiven Ruby-Modi wird angezeigt, dass ich eine lokale .pry_historyDatei pro Projekt verwende.

  • Dann müssen Sie sicherstellen, dass Sie Ihre Comint-Verlaufsdateien speichern, wenn Sie Puffer und Emacs löschen:

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

Hinweis Ich verwende dash.elfür die prägnante (--each)Formatierung.

Dadurch wird der Verlauf Ihres Befehls in der Minibuffer-Shell sowie der Befehlsverlauf Ihrer Bash-Eingabeaufforderung zwischen Emacs und anderen Begriffen dauerhaft.


2

Ich bin mir sicher, dass savehistdies gelingen kann. Hier ist mein Setup:

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

Ich denke, Sie können raten, den Verlauf shell-commandzu speichern und einige verwandte Tastenkombinationen neu zuzuordnen, z. B. M-n/pum diesen Verlauf aufzurufen, oder sogar Ihren eigenen zu schreiben shell-command, read-from-minibufferwenn Sie möchten .

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.