持久的shell命令历史


12

shell-command在新的会话中运行时,我无权访问上一个会话中的命令历史记录。我怎么有


1
(savehist-mode)启用了吗?
waymondo 2015年

如果您在说的是M-!,它从中读取/写入的历史变量为shell-command-history,其中包含(savehist-mode)。如果请求是关于保留comint-input-ring外壳程序缓冲区的持久性历史记录,我也可以提供帮助,但是从我如何解释问题的角度来看,这可以实现。
waymondo 2015年

@waymondo不,我没有。解决了我的问题。请回答,以便我接受。
RasmusWL 2015年

Answers:


10

简短的答案是(savehist-mode)在您的.emacs中启用。默认情况下,这将保存所有微型缓冲区历史记录环,其中包括/ shell-command-history所使用的环。M-!(shell-command)


在讨论过程中,我想我还将说明如何从shell-mode提示和其他源自的模式中加载/保存命令历史记录comint-mode

注意:这是针对我使用bash和OSX进行的设置,但是这种胆量应该可以在大多数环境中使用。

  • 首先,您需要将bash shell历史记录复制到emacs的环境中。默认情况下,它存储在一个名为“ HISTFILE”的变量中。我这样做的(exec-path-from-shell)包是这样的:

    (exec-path-from-shell-initialize)
    (exec-path-from-shell-copy-env "HISTFILE")
    
  • 然后,您需要(turn-on-comint-history)在适当的模式下调用钩子,即

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

对于交互式红宝石模式,您可以看到我正在.pry_history按项目使用本地文件。

  • 然后,您需要确保在杀死缓冲区和emacs时保存了comint历史记录文件:

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

注意我正在使用dash.el简洁(--each)格式。

这将使您的minibuffer shell命令历史记录以及emacs和其他术语之间的bash提示命令历史记录保持不变。


2

我确定savehist可以管理此设置,这是我的设置:

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

0

我认为您可以建议shell-command保存历史记录并重新映射一些相关的键绑定,例如M-n/p,用于调用该历史记录,或者根据需要甚至使用编写自己shell-command的键绑定read-from-minibuffer

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.