Emacs Lisp:参数数量错误,用户输入在 add-hook 中调用它

Emacs Lisp: Wrong number of arguments function with user input calling it in add-hook

我基本上是在尝试让用户选择在关闭 emacs 之前使用透视图保存当前会话。

(defun save-current-session (yes-or-no-bool)
  (interactive
   (list
    (y-or-n-p "Do you want to save this session for later? ")))
  (if yes-or-no-bool
      (persp-state-save "~/.emacs.d/persp-state-file")))

此函数询问用户 he/she 是否真的要保存当前会话。使用 M-x 调用此函数会给出所需的结果。我被问到是否想要,是或否,如果我输入“y”它会成功保存它,但是当我将它添加到 kill-emacs-hook 时:

(add-hook 'kill-emacs-hook 'save-current-session)

我收到这个错误:

Debugger entered--Lisp error: (wrong-number-of-arguments (lambda (yes-or-no-bool) (interactive (list (y-or-n-p "Do you want to save this session for later? "))) (if yes-or-no-bool (persp-state-save "~/.emacs.d/persp-state-file"))) 0)
  save-current-session()
  kill-emacs()
  save-buffers-kill-emacs()
  evil-quit(nil)
  funcall-interactively(evil-quit nil)
  call-interactively(evil-quit)
  evil-ex-call-command(nil #("q" 0 1 (ex-index 1)) nil)
  eval((evil-ex-call-command nil #("q" 0 1 (ex-index 1)) nil))
  evil-ex-execute(#("q" 0 1 (ex-index 1)))
  evil-ex(nil)
  funcall-interactively(evil-ex nil)
  call-interactively(evil-ex nil nil)
  command-execute(evil-ex)

为什么添加 save-current-session 函数在添加到 kill-emacs-hook 时不要求用户输入,但在通过 M-x 调用它时却要求用户输入?

add-hook 用于 普通 挂钩。普通钩子是不接受任何参数的函数,也就是说,您可以不带参数调用它们(这就是它们被称为钩子函数的方式)。

但是你的函数有一个必需的参数 - 它不能在没有参数的情况下被调用。

错误消息告诉您它是用一个参数调用的,但它需要零个参数。


试试这个:

(defun save-current-session ()
  (when (y-or-n-p "Do you want to save this session for later? ")
    (persp-state-save "~/.emacs.d/persp-state-file")))

(add-hook 'kill-emacs-hook 'save-current-session)