Trwała historia poleceń powłoki

12

Kiedy uruchamiam shell-commandw nowej sesji, nie mam dostępu do historii poleceń z ostatniej sesji. Jak mogę to mieć?

RasmusWL
źródło
1
czy masz (savehist-mode)włączone
waymondo
Jeśli mówisz M-!, zmienna historii, z której czyta / pisze shell-command-history, jest objęta (savehist-mode). Jeśli prośba dotyczy przechowywania trwałej historii comint-input-ringbuforów powłoki, ja też mogę w tym pomóc, ale z tego, jak interpretuję pytanie, to by to osiągnęło.
waymondo
@waymondo nie, nie zrobiłem tego. rozwiązuje mój problem. Proszę udzielić odpowiedzi, aby ją zaakceptować.
RasmusWL,

Odpowiedzi:

10

Krótka odpowiedź jest dostępna (savehist-mode)w .emacs. Spowoduje to domyślnie zapisanie wszystkich pierścieni historii minibufora, w tym także tego, shell-command-historyktóry jest używany przez M-!/ (shell-command).


W tym momencie wyjaśniam, że wyjaśnię również, jak ładować / zapisywać historie poleceń z shell-modepodpowiedzi i innych trybów, które się z nich wywodzą comint-mode.

Uwaga: dotyczy to mojej konfiguracji z bash i OSX, ale cechy tego powinny działać w większości środowisk.

  • Najpierw musisz skopiować historię powłoki bash do środowiska emacsa. Domyślnie jest to przechowywane w zmiennej o nazwie „HISTFILE”. Robię to z (exec-path-from-shell)pakietem tak:

    (exec-path-from-shell-initialize)
    (exec-path-from-shell-copy-env "HISTFILE")
    
  • Następnie musisz wywołać (turn-on-comint-history)odpowiednie haki trybu, tj

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

W przypadku interaktywnych trybów ruby ​​możesz zobaczyć, że używam lokalnego .pry_historypliku dla poszczególnych projektów.

  • Następnie musisz upewnić się, że zapisałeś pliki historii poleceń podczas zabijania buforów i emacsa:

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

Uwaga Używam dash.eldo zwięzłego (--each)formatowania.

To sprawi, że twoja historia poleceń powłoki minibufora będzie trwała, a także twoja historia poleceń bash między emacsem i innymi terminami.

waymondo
źródło
2

Jestem pewien, że savehistsobie z tym poradzę , oto moja konfiguracja:

;; 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
źródło
0

Myślę, że możesz poradzić, shell-commandaby zapisać historię i przekształcić niektóre powiązane powiązania klawiszy, np. W M-n/pcelu wywołania tej historii, a nawet napisać własną shell-command, używając, read-from-minibufferjeśli chcesz.

Xuchunyang
źródło