具有输入历史记录的Elisp交互功能

时间:2013-11-07 12:34:44

标签: emacs elisp

有许多交互式函数将字符串输入作为参数:

(defun zb/run-cmd-X (arg1 argN)
  (interactive "Marg1: Marg2: ")
  ;;; some logic

如何使每个此类函数zb/run-cmd-1 .. zb/run-cmd-N具有自己的输入参数arg1...argN的独立历史记录?如果这段历史在Emacs启动之间持续存在(理想情况下在外部文件中的某个位置;用于同步),那将是完美的。

有没有现成的解决方案?

由于

1 个答案:

答案 0 :(得分:3)

基本上,您希望阅读read-from-minibuffercompleting-read关于每个函数接受的HIST参数的文档。当然还有其他具有历史支持的功能,但这两个功能是标准/基本选项。

savehist库提供了持久性,该库写入savehist-file中的文件(默认情况下为~/.emacs.d/history,但旧的~/.emacs-history将被使用如果该文件存在 - 在这种情况下您可能希望将其重命名为现代首选路径。)

以下是一个例子:

(defvar my-ssh-history nil)

(eval-after-load "savehist"
  '(add-to-list 'savehist-additional-variables 'my-ssh-history))

(defun my-ssh (args)
  "Connect to a remote host by SSH."
  (interactive
   (list (read-from-minibuffer "ssh " nil nil nil 'my-ssh-history)))
  (let* ((switches (split-string-and-unquote args))
         (name (concat "ssh " args))
         (termbuf (apply 'make-term name "ssh" nil switches)))
    (set-buffer termbuf)
    (term-mode)
    (term-char-mode)
    (switch-to-buffer termbuf)))

(savehist-mode 1)