出现这个错误: after-save-hook-setup: Wrong number of arguments: (0 . 0), 1

自己经常使用的两个函数:

;; archieve DONE and CANCELLED to a file
(defun org-archive-done-tasks ()
  (interactive)
  (org-map-entries
   (lambda ()
     (org-archive-subtree)
     (setq org-map-continue-from
           (outline-previous-heading)))
   "/DONE" 'file))
(defun org-archive-cancel-tasks ()
  (interactive)
  (org-map-entries
   (lambda ()
     (org-archive-subtree)
     (setq org-map-continue-from
           (outline-previous-heading)))
   "/CANCELLED" 'file))

但是在 =gtd.org= 执行这两个函数的时候出现如下的错误:

after-save-hook-setup: Wrong number of arguments: (0 . 0), 1

具体的debug信如下:

Debugger entered--Lisp error: (wrong-number-of-arguments (0 . 0) 1)
  wg-save-session(t)
  after-save-hook-setup()
  run-hooks(after-save-hook)
  basic-save-buffer(nil)
  save-buffer()
  org-archive-subtree()
  (lambda nil (org-archive-subtree) (setq org-map-continue-from (outline-previous-heading)))()
  org-scan-tags((lambda nil (org-archive-subtree) (setq org-map-continue-from (outline-previous-heading))) (lambda (todo tags-list level) (or (equal todo "DONE"))) nil)
  org-map-entries((lambda nil (org-archive-subtree) (setq org-map-continue-from (outline-previous-heading))) "/DONE" file)
  fg/org-archive-done-tasks()
  funcall-interactively(fg/org-archive-done-tasks)
  call-interactively(fg/org-archive-done-tasks record nil)
  command-execute(fg/org-archive-done-tasks record)
  counsel-M-x-action("fg/org-archive-done-tasks")
  funcall(counsel-M-x-action "fg/org-archive-done-tasks")
  (if ivy-marked-candidates (let* ((prefix-len (length ivy-mark-prefix)) (marked-candidates (mapcar #'(lambda (s) (let ... ...)) ivy-marked-candidates)) (multi-action (ivy--get-multi-action ivy-last))) (if multi-action (funcall multi-action marked-candidates) (let ((--dolist-tail-- marked-candidates)) (while --dolist-tail-- (let ((c ...)) (funcall action c) (setq --dolist-tail-- (cdr --dolist-tail--))))))) (funcall action x))
  (unwind-protect (if ivy-marked-candidates (let* ((prefix-len (length ivy-mark-prefix)) (marked-candidates (mapcar #'(lambda ... ...) ivy-marked-candidates)) (multi-action (ivy--get-multi-action ivy-last))) (if multi-action (funcall multi-action marked-candidates) (let ((--dolist-tail-- marked-candidates)) (while --dolist-tail-- (let (...) (funcall action c) (setq --dolist-tail-- ...)))))) (funcall action x)) (ivy-recursive-restore))
  (prog1 (unwind-protect (if ivy-marked-candidates (let* ((prefix-len (length ivy-mark-prefix)) (marked-candidates (mapcar #'... ivy-marked-candidates)) (multi-action (ivy--get-multi-action ivy-last))) (if multi-action (funcall multi-action marked-candidates) (let ((--dolist-tail-- marked-candidates)) (while --dolist-tail-- (let ... ... ...))))) (funcall action x)) (ivy-recursive-restore)) (if (or (eq ivy-exit 'done) (minibuffer-window-active-p (selected-window)) (null (active-minibuffer-window))) nil (select-window (active-minibuffer-window))))
  (cond ((null action) current) ((eq action #'identity) (prog1 x (ivy-recursive-restore))) (t (select-window (ivy--get-window ivy-last)) (set-buffer (progn (or (progn (and (memq ... cl-struct-ivy-state-tags) t)) (signal 'wrong-type-argument (list 'ivy-state ivy-last))) (aref ivy-last 13))) (prog1 (unwind-protect (if ivy-marked-candidates (let* ((prefix-len ...) (marked-candidates ...) (multi-action ...)) (if multi-action (funcall multi-action marked-candidates) (let ... ...))) (funcall action x)) (ivy-recursive-restore)) (if (or (eq ivy-exit 'done) (minibuffer-window-active-p (selected-window)) (null (active-minibuffer-window))) nil (select-window (active-minibuffer-window))))))
  (let* ((action (if (functionp ivy-inhibit-action) ivy-inhibit-action (and (not ivy-inhibit-action) (ivy--get-action ivy-last)))) (collection (progn (or (progn (and (memq ... cl-struct-ivy-state-tags) t)) (signal 'wrong-type-argument (list 'ivy-state ivy-last))) (aref ivy-last 2))) (current (progn (or (progn (and (memq ... cl-struct-ivy-state-tags) t)) (signal 'wrong-type-argument (list 'ivy-state ivy-last))) (aref ivy-last 23))) (x (cond ((and (consp (car-safe collection)) (let (...) (if idx ... ...)))) (ivy--directory (expand-file-name current ivy--directory)) ((equal current "") ivy-text) (t current))) (res (cond ((null action) current) ((eq action #'identity) (prog1 x (ivy-recursive-restore))) (t (select-window (ivy--get-window ivy-last)) (set-buffer (progn (or ... ...) (aref ivy-last 13))) (prog1 (unwind-protect (if ivy-marked-candidates ... ...) (ivy-recursive-restore)) (if (or ... ... ...) nil (select-window ...))))))) (if ivy-inhibit-action res current))
  ivy-call()
  (let* ((ivy-recursive-last (and (active-minibuffer-window) ivy-last)) (ivy--display-function (if (or ivy-recursive-last (not (window-minibuffer-p))) (progn (ivy-alist-setting ivy-display-functions-alist caller))))) (setq update-fn (or update-fn (ivy-alist-setting ivy-update-fns-alist caller))) (setq unwind (or unwind (ivy-alist-setting ivy-unwind-fns-alist caller))) (setq ivy-last (make-ivy-state :prompt (ivy--update-prompt prompt) :collection collection :predicate predicate :require-match require-match :initial-input initial-input :history history :preselect preselect :keymap keymap :update-fn (if (eq update-fn 'auto) #'(lambda nil (let (...) (save-current-buffer ...))) update-fn) :sort sort :action (ivy--compute-extra-actions action caller) :multi-action multi-action :frame (selected-frame) :window (selected-window) :buffer (current-buffer) :unwind unwind :re-builder re-builder :matcher matcher :dynamic-collection dynamic-collection :display-transformer-fn (plist-get ivy--display-transformers-list caller) :directory default-directory :extra-props extra-props :caller caller :def def)) (ivy--reset-state ivy-last) (unwind-protect (let ((fun #'ivy--minibuffer-setup) (setup-hook (make-symbol "minibuffer-setup"))) (fset setup-hook #'(lambda nil (remove-hook 'minibuffer-setup-hook setup-hook) (funcall fun))) (unwind-protect (progn (add-hook 'minibuffer-setup-hook setup-hook) (let* ((hist ...) (minibuffer-completion-table collection) (minibuffer-completion-predicate predicate) (ivy-height ...) (resize-mini-windows ...)) (if (and ivy-auto-select-single-candidate ivy--all-candidates ...) (progn ... ...) (read-from-minibuffer prompt ... ... nil hist) (car-safe ...)) (if (eq ivy-exit ...) (progn ...)))) (remove-hook 'minibuffer-setup-hook setup-hook))) (ivy--cleanup)) (ivy-call))
  (progn (let ((init-fn (ivy-alist-setting ivy-init-fns-alist caller))) (if init-fn (progn (funcall init-fn)))) (if (equal overriding-local-map '(keymap)) (progn (keyboard-quit))) (setq caller (or caller this-command)) (let* ((ivy-recursive-last (and (active-minibuffer-window) ivy-last)) (ivy--display-function (if (or ivy-recursive-last (not (window-minibuffer-p))) (progn (ivy-alist-setting ivy-display-functions-alist caller))))) (setq update-fn (or update-fn (ivy-alist-setting ivy-update-fns-alist caller))) (setq unwind (or unwind (ivy-alist-setting ivy-unwind-fns-alist caller))) (setq ivy-last (make-ivy-state :prompt (ivy--update-prompt prompt) :collection collection :predicate predicate :require-match require-match :initial-input initial-input :history history :preselect preselect :keymap keymap :update-fn (if (eq update-fn 'auto) #'(lambda nil (let ... ...)) update-fn) :sort sort :action (ivy--compute-extra-actions action caller) :multi-action multi-action :frame (selected-frame) :window (selected-window) :buffer (current-buffer) :unwind unwind :re-builder re-builder :matcher matcher :dynamic-collection dynamic-collection :display-transformer-fn (plist-get ivy--display-transformers-list caller) :directory default-directory :extra-props extra-props :caller caller :def def)) (ivy--reset-state ivy-last) (unwind-protect (let ((fun #'ivy--minibuffer-setup) (setup-hook (make-symbol "minibuffer-setup"))) (fset setup-hook #'(lambda nil (remove-hook ... setup-hook) (funcall fun))) (unwind-protect (progn (add-hook 'minibuffer-setup-hook setup-hook) (let* (... ... ... ... ...) (if ... ... ... ...) (if ... ...))) (remove-hook 'minibuffer-setup-hook setup-hook))) (ivy--cleanup)) (ivy-call)))
  (progn (let ((--cl-keys-- --cl-rest--)) (while --cl-keys-- (cond ((memq (car --cl-keys--) '(:predicate :require-match :initial-input :history :preselect :def :keymap :update-fn :sort :action :multi-action :unwind :re-builder :matcher :dynamic-collection :extra-props :caller :allow-other-keys)) (setq --cl-keys-- (cdr (cdr --cl-keys--)))) ((car (cdr (memq ... --cl-rest--))) (setq --cl-keys-- nil)) (t (error "Keyword argument %s not one of (:predicate :requir..." (car --cl-keys--)))))) (progn (let ((init-fn (ivy-alist-setting ivy-init-fns-alist caller))) (if init-fn (progn (funcall init-fn)))) (if (equal overriding-local-map '(keymap)) (progn (keyboard-quit))) (setq caller (or caller this-command)) (let* ((ivy-recursive-last (and (active-minibuffer-window) ivy-last)) (ivy--display-function (if (or ivy-recursive-last (not ...)) (progn (ivy-alist-setting ivy-display-functions-alist caller))))) (setq update-fn (or update-fn (ivy-alist-setting ivy-update-fns-alist caller))) (setq unwind (or unwind (ivy-alist-setting ivy-unwind-fns-alist caller))) (setq ivy-last (make-ivy-state :prompt (ivy--update-prompt prompt) :collection collection :predicate predicate :require-match require-match :initial-input initial-input :history history :preselect preselect :keymap keymap :update-fn (if (eq update-fn 'auto) #'(lambda nil ...) update-fn) :sort sort :action (ivy--compute-extra-actions action caller) :multi-action multi-action :frame (selected-frame) :window (selected-window) :buffer (current-buffer) :unwind unwind :re-builder re-builder :matcher matcher :dynamic-collection dynamic-collection :display-transformer-fn (plist-get ivy--display-transformers-list caller) :directory default-directory :extra-props extra-props :caller caller :def def)) (ivy--reset-state ivy-last) (unwind-protect (let ((fun #'ivy--minibuffer-setup) (setup-hook (make-symbol "minibuffer-setup"))) (fset setup-hook #'(lambda nil ... ...)) (unwind-protect (progn (add-hook ... setup-hook) (let* ... ... ...)) (remove-hook 'minibuffer-setup-hook setup-hook))) (ivy--cleanup)) (ivy-call))))
  (let* ((predicate (car (cdr (plist-member --cl-rest-- ':predicate)))) (require-match (car (cdr (plist-member --cl-rest-- ':require-match)))) (initial-input (car (cdr (plist-member --cl-rest-- ':initial-input)))) (history (car (cdr (plist-member --cl-rest-- ':history)))) (preselect (car (cdr (plist-member --cl-rest-- ':preselect)))) (def (car (cdr (plist-member --cl-rest-- ':def)))) (keymap (car (cdr (plist-member --cl-rest-- ':keymap)))) (update-fn (car (cdr (plist-member --cl-rest-- ':update-fn)))) (sort (car (cdr (plist-member --cl-rest-- ':sort)))) (action (car (cdr (plist-member --cl-rest-- ':action)))) (multi-action (car (cdr (plist-member --cl-rest-- ':multi-action)))) (unwind (car (cdr (plist-member --cl-rest-- ':unwind)))) (re-builder (car (cdr (plist-member --cl-rest-- ':re-builder)))) (matcher (car (cdr (plist-member --cl-rest-- ':matcher)))) (dynamic-collection (car (cdr (plist-member --cl-rest-- ':dynamic-collection)))) (extra-props (car (cdr (plist-member --cl-rest-- ':extra-props)))) (caller (car (cdr (plist-member --cl-rest-- ':caller))))) (progn (let ((--cl-keys-- --cl-rest--)) (while --cl-keys-- (cond ((memq (car --cl-keys--) '...) (setq --cl-keys-- (cdr ...))) ((car (cdr ...)) (setq --cl-keys-- nil)) (t (error "Keyword argument %s not one of (:predicate :requir..." (car --cl-keys--)))))) (progn (let ((init-fn (ivy-alist-setting ivy-init-fns-alist caller))) (if init-fn (progn (funcall init-fn)))) (if (equal overriding-local-map '(keymap)) (progn (keyboard-quit))) (setq caller (or caller this-command)) (let* ((ivy-recursive-last (and (active-minibuffer-window) ivy-last)) (ivy--display-function (if (or ivy-recursive-last ...) (progn ...)))) (setq update-fn (or update-fn (ivy-alist-setting ivy-update-fns-alist caller))) (setq unwind (or unwind (ivy-alist-setting ivy-unwind-fns-alist caller))) (setq ivy-last (make-ivy-state :prompt (ivy--update-prompt prompt) :collection collection :predicate predicate :require-match require-match :initial-input initial-input :history history :preselect preselect :keymap keymap :update-fn (if (eq update-fn ...) #'... update-fn) :sort sort :action (ivy--compute-extra-actions action caller) :multi-action multi-action :frame (selected-frame) :window (selected-window) :buffer (current-buffer) :unwind unwind :re-builder re-builder :matcher matcher :dynamic-collection dynamic-collection :display-transformer-fn (plist-get ivy--display-transformers-list caller) :directory default-directory :extra-props extra-props :caller caller :def def)) (ivy--reset-state ivy-last) (unwind-protect (let ((fun ...) (setup-hook ...)) (fset setup-hook #'...) (unwind-protect (progn ... ...) (remove-hook ... setup-hook))) (ivy--cleanup)) (ivy-call)))))
  ivy-read("M-x " ("toggle-debug-on-error" "cliphist-paste-item" "describe-function" "color-rg-delete-line" "color-rg-search-input-in-current-file" "make-frame" "vterm" "org-ref-open-bibtex-pdf" "org-ref-clean-bibtex-entry" "package-install" "helm-bibtex" "org-toggle-inline-images" "rg" "load-file" "wg-switch-to-workgroup" "package-refresh-contents" "bookmark-jump" "package-reinstall" "magit-status" "prelude-open-with" "youdao-dictionary-search-at-point" "magit-push" "org-agenda" "org-capture" "fd-dired" "ibuffer" "evil-mode" "write-file" "counsel-load-theme" "company-mode" "flyspell-buffer" "revert-buffer" "pdf-tools-install" "hydra-magit/body" "magit-commit" "package-delete" "langtool-check" "cliphist-select-item" "vc-print-log" "matlab-shell" "ora-dired-rsync" "xah-fill-or-unfill" "follow-mode" "wucuo-start" "flyspell-mode" "dired-recent-open" "org-display-inline-images" "man" "vc-next-action" "cliphist-read-items" ...) :predicate (closure ((externs "toggle-debug-on-error" "cliphist-paste-item" "describe-function" "color-rg-delete-line" "color-rg-search-input-in-current-file" "make-frame" "vterm" "org-ref-open-bibtex-pdf" "org-ref-clean-bibtex-entry" "package-install" "helm-bibtex" "org-toggle-inline-images" "rg" "load-file" "wg-switch-to-workgroup" "package-refresh-contents" "bookmark-jump" "package-reinstall" "magit-status" "prelude-open-with" "youdao-dictionary-search-at-point" "magit-push" "org-agenda" "org-capture" "fd-dired" "ibuffer" "evil-mode" "write-file" "counsel-load-theme" "company-mode" "flyspell-buffer" "revert-buffer" "pdf-tools-install" "hydra-magit/body" "magit-commit" "package-delete" "langtool-check" "cliphist-select-item" "vc-print-log" "matlab-shell" "ora-dired-rsync" "xah-fill-or-unfill" "follow-mode" "wucuo-start" "flyspell-mode" "dired-recent-open" "org-display-inline-images" "man" "vc-next-action" ...) (initial-input) smex-ido-cache smex-initialized-p amx-cache amx-initialized info-lookup-mode find-tag-marker-ring company-prefix company-common company-candidates t) (x) (not (get (intern x) 'no-counsel-M-x))) :require-match t :history counsel-M-x-history :action counsel-M-x-action :keymap (keymap (67108908 . counsel--info-lookup-symbol) (67108910 . counsel-find-symbol)) :initial-input nil :caller counsel-M-x)
  (let ((externs (counsel--M-x-externs))) (ivy-read (counsel--M-x-prompt) (or externs obarray) :predicate (if externs #'(lambda (x) (not (get (intern x) 'no-counsel-M-x))) #'(lambda (sym) (and (commandp sym) (not (get sym ...)) (not (get sym ...))))) :require-match t :history 'counsel-M-x-history :action #'counsel-M-x-action :keymap counsel-describe-map :initial-input initial-input :caller 'counsel-M-x))
  counsel-M-x()
  funcall-interactively(counsel-M-x)
  call-interactively(counsel-M-x nil nil)
  command-execute(counsel-M-x)

关键在这一行,wg-save-session 不接受参数,你却给它参数。

你贴的代码跟问题无关,你应该看看 after-save-hook-setup 函数里怎么调用 wg-save-session 的,是不是给了参数。

感谢。这个和自己使用的 workgroups2 有关系。具体和下面的代码有点关系:

;; auto save wg-save-session
;; to see @https://github.com/pashinin/workgroups2/issues/93
(defun after-save-hook-setup ()
  (wg-save-session t))
(add-hook 'after-save-hook 'after-save-hook-setup)

我把这段代码注释了就ok了。