2012-07-26 3 views
6

내가 비동기 프로그램을 실행하는 기능이 있습니다이맥스 미니 버퍼 완료

(defun app (app-name) 
    (interactive "sRun application: ") 
    (async-shell-command app-name)) 

을 그리고 내가 선택할 수있는 모든 실행 파일의 목록을 가지고있다. 나는 app 함수가 switch-to-buffer으로 동작하여 사용자에게 TAB 완성을 제공하기를 원합니다. 어떻게 Emacs에서 미니 버퍼 완성을 사용합니까?

답변

8

completing-read 명령을 사용하십시오.

(defun app() 
    (interactive) 
    (let ((app-name (completing-read "Run application: " program-list))) 
    (async-shell-command app-name))) 

아마도 더 관용적 대신 Emacs Lisp Idioms: Prompting for User Input에 따라 변수에 할당하는 interactive을 사용하는 것입니다 같은 기능은 볼 것이다 :

(defun app (app-name) 
    (interactive (list (completing-read "Run application: " app-list))) 
    (async-shell-command app-name)) 

또한 당신이 (async-shell-command app-name) 대신 (start-process app-name nil app-name)을 사용할 수 있습니다, 당신이 경우 Run a program from Emacs and don't wait for output에 따른 프로세스 출력을 신경 쓰지 마십시오.


는 GNU 매뉴얼에서 모두 이맥스에서 프로세스를 호출하기위한 이맥스의 완료에 대한 아이디어를 Minibuffer CompletionAsynchronous Processes를 참조하십시오.

4

당신이 목록을 직접 관리 할 필요없이 가능한 쉘 명령에 대한 완료를 원하는 경우에, 당신은 이맥스 23 이상을 사용하고, 당신이 사용할 수있는 read-shell-command :

(defun app (app-name) 
    (interactive (list (read-shell-command "Run application: "))) 
    (async-shell-command app-name))