绑定键时参数数量错误
Wrong number of arguments when binding key
您好,我正在尝试在 neotree 中使用 'm' 时定义一个交互式菜单,以便为我提供与我在 Nerdtree 中使用的选项类似的选项。
我绑定了这个密钥:
(evil-define-key
'normal neotree-mode-map
... More keybindings ...
(kbd "m") 'neotree-modify-mode-menu)
我的功能是:
(defun neotree-modify-mode-menu (option)
"Asks for a mode and execute associated Neotree command"
(interactive "c(a)dd node | (d)elete node | (r)ename node")
(cond
((eq option ?a) (neotree-create-node))
((eq option ?d) (neotree-delete-node))
((eq option ?c) (neotree-copy-node))
((eq option ?r) (neotree-rename-node))
(:else (message (format "Invalid option %c" option)))))
它适用于每个选项但不适用于创建节点。原因是因为 create-node 有一个参数,正如我在这里看到的:https://github.com/jaypei/emacs-neotree/blob/dev/neotree.el#L1921 其余的没有参数。
所以当我从键绑定调用函数时出现这个错误:
Wrong number of arguments: #[(filename) "Å2w^@Æ^X GÇU3^R^@ÈÅÆ\"0 ÉÆOÊ2?^PË !3*^@ÌÍ \"0ÈÅÆ\"0^H3[^@
ÎÏ \"!3[^@Ð ÇÑÒ ÓÔ$TOÔ\"0ÕÖÆ #0× !0ØÆ!0^K3[^@Ù !0^H?5u^@^LÎÚ \"!5u^@Ð Ô\"0× !0ØÆ!)07" [is-file filename neo-confirm-create-file neo-create-file-auto-o\
pen neo-confirm-create-directory rlt nil 0 throw -1 ...] 8 ("/home/panavtec/.emacs.d/elpa/neotree-20170522.758/neotree.elc" . 64641) (let* ((current-dir (neo-buffer--get-filename-current-lin\
e neo-buffer--start-node)) (current-dir (neo-path--match-path-directory current-dir)) (filename (read-file-name "Filename:" current-dir))) (if (file-directory-p filename) (setq filename (con\
cat filename "/"))) (list filename))], 0
如果我将密钥绑定到 neotree-create-node 函数,它将起作用:
(evil-define-key normal neotree-mode-map
(kbd "m") 'neotree-create-node)
我该如何解决?
显然您需要为创建节点提供参数。你想提供什么论据?您希望如何获得该论点?
如果您总是想使用相同的参数值,那么只需在对 neotree-create-node
.
的调用中对其进行硬编码
否则,请阅读您的 interactive
规范。
您的 interactive
规范无论如何都是错误的 - 请参阅 Elisp 手册,节点 Using Interactive。
我找到了答案,当你在一个交互调用的函数中时,该函数的参数会自动填充用户的答案。正如我在问题中使用 "option":
(defun neotree-modify-mode-menu (option)
(interactive "c(a)dd node | (d)elete node | (r)ename node")
但是如果您需要调用另一个需要交互的函数,您必须使用 call-interactively
来调用它
谢谢。
您好,我正在尝试在 neotree 中使用 'm' 时定义一个交互式菜单,以便为我提供与我在 Nerdtree 中使用的选项类似的选项。
我绑定了这个密钥:
(evil-define-key
'normal neotree-mode-map
... More keybindings ...
(kbd "m") 'neotree-modify-mode-menu)
我的功能是:
(defun neotree-modify-mode-menu (option)
"Asks for a mode and execute associated Neotree command"
(interactive "c(a)dd node | (d)elete node | (r)ename node")
(cond
((eq option ?a) (neotree-create-node))
((eq option ?d) (neotree-delete-node))
((eq option ?c) (neotree-copy-node))
((eq option ?r) (neotree-rename-node))
(:else (message (format "Invalid option %c" option)))))
它适用于每个选项但不适用于创建节点。原因是因为 create-node 有一个参数,正如我在这里看到的:https://github.com/jaypei/emacs-neotree/blob/dev/neotree.el#L1921 其余的没有参数。
所以当我从键绑定调用函数时出现这个错误:
Wrong number of arguments: #[(filename) "Å2w^@Æ^X GÇU3^R^@ÈÅÆ\"0 ÉÆOÊ2?^PË !3*^@ÌÍ \"0ÈÅÆ\"0^H3[^@
ÎÏ \"!3[^@Ð ÇÑÒ ÓÔ$TOÔ\"0ÕÖÆ #0× !0ØÆ!0^K3[^@Ù !0^H?5u^@^LÎÚ \"!5u^@Ð Ô\"0× !0ØÆ!)07" [is-file filename neo-confirm-create-file neo-create-file-auto-o\
pen neo-confirm-create-directory rlt nil 0 throw -1 ...] 8 ("/home/panavtec/.emacs.d/elpa/neotree-20170522.758/neotree.elc" . 64641) (let* ((current-dir (neo-buffer--get-filename-current-lin\
e neo-buffer--start-node)) (current-dir (neo-path--match-path-directory current-dir)) (filename (read-file-name "Filename:" current-dir))) (if (file-directory-p filename) (setq filename (con\
cat filename "/"))) (list filename))], 0
如果我将密钥绑定到 neotree-create-node 函数,它将起作用:
(evil-define-key normal neotree-mode-map
(kbd "m") 'neotree-create-node)
我该如何解决?
显然您需要为创建节点提供参数。你想提供什么论据?您希望如何获得该论点?
如果您总是想使用相同的参数值,那么只需在对 neotree-create-node
.
否则,请阅读您的 interactive
规范。
您的 interactive
规范无论如何都是错误的 - 请参阅 Elisp 手册,节点 Using Interactive。
我找到了答案,当你在一个交互调用的函数中时,该函数的参数会自动填充用户的答案。正如我在问题中使用 "option":
(defun neotree-modify-mode-menu (option)
(interactive "c(a)dd node | (d)elete node | (r)ename node")
但是如果您需要调用另一个需要交互的函数,您必须使用 call-interactively
来调用它谢谢。