2017-09-20 8 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

답을 찾았습니다. 대화 형으로 호출되는 함수에있을 때 해당 함수의 인수가 자동으로 사용자의 대답으로 채워집니다. 나는 내 질문에 "옵션"사용 :

(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

분명히 create node에 대한 인수를 제공해야합니다. 어떤 주장을하고 싶습니까? 그 논쟁을 어떻게 기대합니까?

항상 동일한 인수 값을 사용하려는 경우 neotree-create-node을 호출 할 때 하드 코드해야합니다.

그렇지 않으면 interactive spec을 읽으십시오.

interactive 사양이 잘못되었습니다. Elisp 설명서 노드 Using Interactive을 참조하십시오.

+0

안녕하세요, 당신이 분명히 맞아요, 내가 인수를 놓치고 있는데,하지만 왜 내가 바운드 키에서 노드를 만들면 어떻게 작동합니까 ?? (evil-define-key '정상적인 neotree-mode-map (kbd "m") neotree-create-node) – PaNaVTEC

+0

이것은 함수를 대화식으로 호출하여 함수 인수를 생성하기 때문에 발생합니다. 대화 형으로 함수를 호출하지 않는 사용자 정의 코드. 그러나'(neotree-create-node) '대신에'(call-interactiveively'neotree-create-node)'를 사용하여 정확하게 할 수 있습니다. ... * (편집 : 당신 혼자서 ...) * – phils