在退出emacs之前运行函数

8
我希望在org-mode中添加这样的功能:在退出emacs之前(当org-mode正在运行时),它会询问我:“您是否想在退出之前运行vc-dir函数?”我尝试过以下方法:
(add-hook 'kill-emacs-hook 'vc-dir)

但是出现了错误:"参数数量不正确"

也尝试了这里找到的方法:

(defadvice save-buffers-kill-emacs (before update-mod-flag activate)
(vc-dir))

同样的错误。

  • 那么如何以简单的方式使其工作:vc-dir总是在退出时运行。
  • 或者如何在警告消息的情况下使其工作(最好的方法)?

谢谢!

2个回答

8

vc-dir需要一个参数(即“dir”)。

因此,您可以执行以下操作:

(add-hook 'kill-emacs-hook (lambda () (vc-dir "your-dir-here")))

当然,这并不会阻止emacs退出:vc-dir打开一个缓冲区但不会“等待”用户输入。如果您想要交互式的方法,可以执行以下操作:
(add-hook 'kill-emacs-query-functions
          (lambda ()
            (if (y-or-n-p "Do you want to run function vc-dir before exit?")
                (progn
                  (vc-dir "your-directory")
                  nil)
              t)))

如果你想把最后访问的缓存作为版本控制目录,那么请将"your-directory"替换为default-directory


它不起作用。它关闭了emacs并显示消息“没有需要更改的文件”,但实际上是有需要更改的文件的。 - user3003873
不幸的是,它几乎表现出相同的行为。如何让它等待我执行必要的操作,然后退出? - user3003873
这是上面的代码片段对我所做的操作;请注意,我使用了 kill-emacs-query-functions 而不是 kill-emacs-hook - juanleon

0

尝试一下这个函数,它在运行vc-dir之前会要求确认:

(defun my-vc-check-onexit ()
     (interactive)
     (let ((doquit (read-from-minibuffer "Do you want to run vcs? ")))
       (if (string-equal doquit "y") (vc-dir "~/my/dir"))
       ))

并将其绑定到钩子上。

注意:这可能不是很好的elisp ;)


糟糕,Juanleon的答案(同时发布)看起来更好,而且更完整。 - Ehvince
1
不幸的是,相同的行为。 - user3003873

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接