Histórico persistente de comandos shell

12

Quando executo shell-commanduma nova sessão, não tenho acesso ao histórico de comandos da última sessão. Como posso ter isso?

RasmusWL
fonte
1
você (savehist-mode)ativou?
waymondo
Se você está falando M-!, a variável de histórico da qual lê / grava é shell-command-history, e é coberta com (savehist-mode). Se a solicitação é sobre como manter um histórico persistente dos comint-input-ringbuffers do shell, também posso ajudá-lo, mas pela maneira como estou interpretando a pergunta, isso seria possível.
waymondo
@waymondo não, eu não fiz. resolve meu problema. Por favor, responda para que eu possa aceitá-lo.
RasmusWL

Respostas:

10

A resposta curta é habilitada (savehist-mode)no seu .emacs. Isso salvará todos os anéis do histórico do minibuffer por padrão, incluindo o shell-command-historyque é usado por M-!/ (shell-command).


Enquanto estou nisso, acho que também explicarei como carregar / salvar históricos de shell-modecomandos de prompts e outros modos derivados comint-mode.

Nota: isso é para minha configuração com bash e OSX, mas a coragem disso deve funcionar na maioria dos ambientes.

  • Primeiro, você precisa copiar o histórico do shell bash no ambiente do emacs. Por padrão, isso é armazenado em uma variável chamada "HISTFILE". Eu faço isso com o (exec-path-from-shell)pacote assim:

    (exec-path-from-shell-initialize)
    (exec-path-from-shell-copy-env "HISTFILE")
    
  • Então você precisa chamar (turn-on-comint-history)seus ganchos de modo apropriado, ou seja,

    (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 modos interativos de rubi, você pode ver que estou usando um .pry_historyarquivo local por projeto.

  • Então você precisa salvar seus arquivos de histórico de comint ao matar buffers e 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 que estou usando dash.elpara a (--each)formatação sucinta .

Isso tornará o histórico de comandos do minibuffer shell persistente, bem como o histórico de comandos do prompt do bash entre o emacs e outros termos.

waymondo
fonte
2

Tenho certeza de que savehistpode gerenciar isso, aqui está minha configuração:

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

Eu acho que você pode dar conselhos shell-commandpara salvar o histórico e remapear algumas combinações de teclas relacionadas, por exemplo M-n/p, para invocar esse histórico ou até mesmo escrever seu próprio shell-commandusando, read-from-minibufferse quiser.

xuchunyang
fonte