记住下级Emacs Lisp模式下会话之间的历史记录


9

我无法使Emacs记住*ielm*会话之间的缓冲区的历史记录。据我所知,这种历史记录记录在buffer-local变量中comint-input-ring。因此,我在初始化文件中添加了以下表达式:

(setq desktop-locals-to-save
    (append desktop-locals-to-save
            '((comint-input-ring . 50))))

没用 我知道该desktop软件包正在运行,因为Emacs会记住我desktop-globals-to-save在init文件中添加的全局变量。

-

编辑:savehist也不起作用。我想那是因为comint-input-ring是局部缓冲区变量。


1
现在没有时间检查为什么它可能不适用于台式机。但是您可以尝试使用savehist.el此变量并将其添加到要保存的var列表中。
Drew

谢谢,德鲁(Drew),但我已经考虑过savehist了(抱歉,我不提了)。据我所知,它仅用于全局变量,而comint-input-ring局部缓冲区。现在,无论如何我都尝试过,但没有成功。
Elena 2014年

警告:以下解决方案是亵渎 !!!! comint.el在以下两行代码中注释掉: (put 'comint-input-ring 'permanent-local t)(make-local-variable 'comint-input-ring)。然后,添加comint-input-ringdesktop-locals-to-save。最后,重新字节编译适用的文件,重新启动Emacs并充分享受生活。
法律列表'17

Answers:


5

您可以comint-input-ring*ielm*杀死一个缓冲区时将的局部缓冲区值保存在全局变量中,并将其恢复为inferior-emacs-lisp-mode-hook

;; global copy of the buffer-local variable
(defvar ielm-comint-input-ring nil)

(defun set-ielm-comint-input-ring ()
  ;; create a buffer-local binding of kill-buffer-hook
  (make-local-variable 'kill-buffer-hook)
  ;; save the value of comint-input-ring when this buffer is killed
  (add-hook 'kill-buffer-hook #'save-ielm-comint-input-ring)
  ;; restore saved value (if available)
  (when ielm-comint-input-ring
    (message "Restoring comint-input-ring...")
    (setq comint-input-ring ielm-comint-input-ring)))

(defun save-ielm-comint-input-ring ()
  (message "Saving comint-input-ring...")
  (setq ielm-comint-input-ring comint-input-ring))

(require 'ielm)
(add-hook 'inferior-emacs-lisp-mode-hook #'set-ielm-comint-input-ring)

现在,你应该能够加入ielm-comint-input-ringsavehist-additional-variables得到你想要的行为。(我测试了这种方法;不过,您也应该可以使用desktop-locals-to-save。)


1
您应该使用的LOCAL参数add-hook,而不是手动调用make-local-variablekill-buffer-hook。当随后尝试在全局范围内将回调添加到该挂钩时,后者可能会导致问题。
phils 2015年

我非常高兴地发现它也适用inf-mongo(或可能使用的任何其他模式comint),它非常有用,并且还教给我更多elisp ...谢谢!
布雷克·米勒
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.