2017-09-20 91 views
2

您好我正试图定义一个交互式菜单,当在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Ç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创建节点的功能,它的工作原理:

(evil-define-key normal neotree-mode-map 
    (kbd "m") 'neotree-create-node) 

我怎么能修复它?

回答

2

我找到了答案,当你在一个名为interactivly的函数中,该函数的参数自动填充了用户的答案。因为我用我的问题“选项”:

(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

谢谢。

2

显然你需要为创建节点提供一个参数。你想提供什么论据?你如何期望得到这个论点?

如果您始终想要使用相同的参数值,那么只需在您拨打neotree-create-node时对其进行硬编码。

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

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

+0

嗨德鲁,你显然是正确的,我错过了一个参数传递,但为什么它工作,如果我从绑定键调用创建节点? (evil-define-key 'normal neotree-mode-map (kbd“m”)'neotree-create-node) – PaNaVTEC

+0

这是因为调用一个函数交互式地调用它的'interactive'规范来生成函数参数,而在你的自定义代码,您不是交互式调用该函数。但是请注意,你可以通过使用'(call-interactively'neotree-create-node)'而不是'(neotree-create-node)'来完成这个操作'...... *(编辑:我现在看到你发现了这个你自己...)* – phils