Storia persistente di comandi shell


12

Quando corro shell-commandin una nuova sessione, non ho accesso alla cronologia dei comandi dell'ultima sessione. Come posso averlo?


1
hai (savehist-mode)abilitato?
Waymondo

Se stai parlando M-!, la variabile di storia da cui legge / scrive è shell-command-history, che è coperta (savehist-mode). Se la richiesta riguarda il mantenimento di una cronologia persistente dei comint-input-ringbuffer della shell, posso aiutare anche con quello, ma da come sto interpretando la domanda, questo lo farebbe.
Waymondo

@waymondo no, non l'ho fatto. risolve il mio problema. Per favore, rispondi in modo che io possa accettarlo.
RasmusWL

Risposte:


10

La risposta breve è abilitata (savehist-mode)nei tuoi .emacs. Ciò salverà tutti gli anelli della cronologia del minibuffer per impostazione predefinita, che include shell-command-historyquale viene utilizzato da M-!/ (shell-command).


Mentre ci sono, immagino che spiegherò anche come caricare / salvare la cronologia dei shell-modecomandi dai prompt e altre modalità da cui derivano comint-mode.

Nota: questo è per la mia configurazione con bash e OSX, ma il coraggio di questo dovrebbe funzionare nella maggior parte degli ambienti.

  • Per prima cosa devi copiare la cronologia della shell bash nell'ambiente di emacs. Per impostazione predefinita, questo è memorizzato in una variabile chiamata "HISTFILE". Faccio questo con il (exec-path-from-shell)pacchetto in questo modo:

    (exec-path-from-shell-initialize)
    (exec-path-from-shell-copy-env "HISTFILE")
    
  • Quindi è necessario chiamare (turn-on-comint-history)i ganci della modalità appropriata, ad es

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

Per le modalità ruby ​​interattive, puoi vedere che sto usando un .pry_historyfile locale in base al progetto.

  • Quindi è necessario assicurarsi di salvare i file della cronologia dei commenti quando si uccidono buffer ed 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)))))
    

Nota che sto usando dash.elper la (--each)formattazione sintetica .

Ciò renderà persistente la cronologia dei comandi della shell del tuo minibuffer e la cronologia dei comandi del prompt di bash tra emacs e altri termini.


2

Sono sicuro che savehistpuò gestirlo, ecco la mia configurazione:

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

Penso che puoi consigliarti shell-commanddi salvare la cronologia e rimappare alcune associazioni chiave correlate, ad esempio M-n/p, per invocare quella cronologia, o anche scrivere la tua shell-commandusando read-from-minibufferse vuoi.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.