绑定密钥时参数数量错误

时间:2017-09-20 18:10:36

标签: emacs key-bindings

您好我正在尝试使用' m'来定义交互式菜单。在neotree给我类似于我在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而其余参数不带参数。

因此,从keybinding调用函数时出现此错误:

Wrong number of arguments: #[(filename) "Å2w^@Æ^X GÇU\203^R^@ÈÅÆ\"\210  ÉÆOÊ\232?^PË  !\203*^@ÌÍ  \"\210ÈÅÆ\"\210^H\203[^@                                                                     
ÎÏ  \"!\203[^@Ð ÇÑÒ ÓÔ$TOÔ\"\210ÕÖÆ #\210×  !\210ØÆ!\210^K\203[^@Ù  !\210^H?\205u^@^LÎÚ \"!\205u^@Ð Ô\"\210×  !\210ØÆ!)0\207" [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)

我该如何解决?

2 个答案:

答案 0 :(得分:2)

显然,您需要为create node提供一个参数。你想提供什么论点?你怎么期望得到这个论点?

如果您总是想使用相同的参数值,那么只需在调用neotree-create-node时对其进行硬编码。

否则,请让您的interactive规范阅读。

您的interactive规范无论如何都是错误的 - 请参阅Elisp手册,节点Using Interactive

答案 1 :(得分:2)

我找到了答案,当你在一个被称为交互式的函数中时,该函数的参数会自动填充用户的答案。正如我使用"选项"在我的问题中:

(defun neotree-modify-mode-menu (option)
  (interactive "c(a)dd node | (d)elete node | (r)ename node")

但是如果您需要调用另一个需要互动的功能,您必须使用以交互方式调用

来调用它

完整代码: https://github.com/PaNaVTEC/dotfiles/commit/f69c855cb2d31d79ab81331a5ee53cb9cd8e2f38#diff-e68ea0da4891dbc0f47897e9562e9daeR29

感谢。