Historique des commandes shell persistantes

12

Lorsque je lance shell-commandune nouvelle session, je n'ai pas accès à l'historique des commandes de la dernière session. Comment puis-je avoir ça?

RasmusWL
la source
1
avez-vous (savehist-mode)activé?
waymondo
Si vous parlez M-!, la variable historique à partir de laquelle il lit / écrit est shell-command-history, qui est couverte par (savehist-mode). Si la demande concerne la conservation d'un historique persistant des comint-input-ringtampons dans le shell, je peux également vous aider, mais d'après la façon dont j'interprète la question, cela le fera.
waymondo
@waymondo non, je ne l'ai pas fait. résout mon problème. Veuillez répondre afin que je puisse l'accepter.
RasmusWL

Réponses:

10

La réponse courte est activer (savehist-mode)dans votre .emacs. Cela sauvera tous les anneaux d'historique du mini-tampon par défaut, ce qui inclut shell-command-historyce qui est utilisé par M-!/ (shell-command).


Pendant que j'y suis, je pense que je vais également expliquer comment charger / enregistrer les historiques de commandes à partir des shell-modeinvites et d'autres modes qui en dérivent comint-mode.

Remarque: c'est pour ma configuration avec bash et OSX, mais les tripes de cela devraient fonctionner dans la plupart des environnements.

  • Vous devez d'abord copier l'historique de votre shell bash dans l'environnement de votre emacs. Par défaut, il est stocké dans une variable appelée "HISTFILE". Je fais cela avec le (exec-path-from-shell)paquet comme ceci:

    (exec-path-from-shell-initialize)
    (exec-path-from-shell-copy-env "HISTFILE")
    
  • Ensuite, vous devez appeler (turn-on-comint-history)dans vos hooks de mode appropriés, à savoir

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

Pour les modes rubis interactifs, vous pouvez voir que j'utilise un .pry_historyfichier local par projet.

  • Ensuite, vous devez vous assurer que vous enregistrez vos fichiers d'historique comint lors de la suppression des tampons et des 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)))))
    

Remarque J'utilise dash.elpour la (--each)mise en forme succincte .

Cela rendra l'historique de vos commandes du mini-tampon persistant ainsi que votre historique de commandes d'invite bash entre emacs et d'autres termes.

waymondo
la source
2

Je suis sûr que cela savehistpeut gérer cela, voici ma configuration:

;; 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)
yPhil
la source
0

Je pense que vous pouvez conseiller shell-commandde sauvegarder l'historique et de remapper certaines liaisons de touches connexes, par exemple M-n/p, pour invoquer cette histoire, ou même écrire la vôtre shell-commanden utilisant read-from-minibuffersi vous le souhaitez.

xuchunyang
la source