Riwayat perintah shell yang persisten

12

Ketika saya menjalankan shell-commandsesi baru, saya tidak memiliki akses ke riwayat perintah dari sesi terakhir. Bagaimana saya bisa mendapatkannya?

RasmusWL
sumber
1
apakah kamu sudah (savehist-mode)mengaktifkan?
waymondo
Jika Anda berbicara tentang M-!, variabel sejarah yang dibaca / ditulisnya adalah shell-command-history, yang ditutupi dengan (savehist-mode). Jika permintaannya adalah tentang menjaga histori comint-input-ringbuffer shell yang persisten , saya juga bisa membantu, tapi dari cara saya menginterpretasikan pertanyaan, ini akan menyelesaikannya.
waymondo
@waymondo tidak, saya tidak. memecahkan masalah saya. Tolong buat jawaban supaya saya bisa menerimanya.
RasmusWL

Jawaban:

10

Jawaban singkatnya diaktifkan (savehist-mode)di .emacs Anda. Ini akan menyimpan semua cincin riwayat minibuffer secara default, yang mencakup shell-command-historyyang digunakan oleh M-!/ (shell-command).


Sementara saya melakukannya, saya pikir saya juga akan menjelaskan cara memuat / menyimpan histori perintah dari shell-modeprompt dan mode lain yang berasal dari comint-mode.

Catatan: ini untuk pengaturan saya dengan bash dan OSX, tetapi nyali ini harus bekerja di sebagian besar lingkungan.

  • Pertama, Anda perlu menyalin riwayat bash shell Anda ke lingkungan emacs Anda. Secara default ini disimpan dalam variabel yang disebut "HISTFILE". Saya melakukan ini dengan (exec-path-from-shell)paket seperti ini:

    (exec-path-from-shell-initialize)
    (exec-path-from-shell-copy-env "HISTFILE")
    
  • Maka Anda perlu memanggil (turn-on-comint-history)kait mode yang sesuai, yaitu

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

Untuk mode ruby ​​interaktif, Anda dapat melihat saya menggunakan .pry_historyfile lokal berdasarkan per proyek.

  • Maka Anda perlu memastikan Anda menyimpan file histori comint saat membunuh buffer dan 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)))))
    

Catatan saya gunakan dash.eluntuk (--each)pemformatan ringkas .

Ini akan membuat riwayat perintah shell minibuffer Anda tetap ada serta riwayat perintah bash prompt Anda antara emacs dan istilah lainnya.

waymondo
sumber
2

Saya yakin savehistdapat mengelola ini, ini adalah pengaturan saya:

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

Saya pikir Anda dapat saran shell-commanduntuk menyimpan sejarah dan membuat kembali beberapa ikatan kunci terkait, misalnya M-n/p, untuk memohon sejarah itu, atau bahkan menulis sendiri shell-commanddengan menggunakan read-from-minibufferjika Anda mau.

xuchunyang
sumber