Historial persistente de comandos de shell

12

Cuando ejecuto shell-commanduna sesión nueva, no tengo acceso al historial de comandos de la última sesión. ¿Cómo puedo tener eso?

RasmusWL
fuente
1
tienes (savehist-mode)habilitado
waymondo
Si está hablando M-!, la variable de historia de la que lee / escribe es shell-command-history, que está cubierta (savehist-mode). Si la solicitud se trata de mantener un historial persistente de los comint-input-ringbuffers de shell, también puedo ayudar con eso, pero por cómo estoy interpretando la pregunta, esto lo lograría.
waymondo
@waymondo no, no lo hice. resuelve mi problema Por favor, responda para que pueda aceptarlo.
RasmusWL

Respuestas:

10

La respuesta corta es habilitar (savehist-mode)en sus .emacs. Esto guardará todos los anillos del historial de minibúfer de forma predeterminada, que incluye shell-command-historycuál es utilizado por M-!/ (shell-command).


Mientras estoy en ello, creo que también explicaré cómo cargar / guardar historiales de comandos a partir de shell-modemensajes y otros modos que se derivan de ellos comint-mode.

Nota: esto es para mi configuración con bash y OSX, pero las entrañas de esto deberían funcionar en la mayoría de los entornos.

  • Primero debe copiar su historial de bash shell en el entorno de su emacs. Por defecto, esto se almacena en una variable llamada "HISTFILE". Hago esto con el (exec-path-from-shell)paquete así:

    (exec-path-from-shell-initialize)
    (exec-path-from-shell-copy-env "HISTFILE")
    
  • Luego debe llamar (turn-on-comint-history)a sus ganchos de modo apropiados, es decir

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

Para los modos ruby ​​interactivos, puede ver que estoy usando un .pry_historyarchivo local por proyecto.

  • Luego, debe asegurarse de guardar sus archivos de historial de comics cuando elimine buffers y 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)))))
    

Tenga en cuenta que estoy usando dash.elpara el (--each)formato sucinto .

Esto hará que el historial de comandos del shell de minibúfer sea persistente, así como el historial de comandos de bash prompt entre emacs y otros términos.

waymondo
fuente
2

Estoy seguro de que savehistpuede manejar esto, aquí está mi configuración:

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

Creo que se puede aconsejar shell-commandpara salvar la historia y volver a asignar algunas asociaciones de teclas relacionadas, por ejemplo, M-n/ppor la invocación de esa historia, o incluso escribir su propia shell-commandmediante el uso read-from-minibuffersi te gusta.

xuchunyang
fuente