2012-07-26 123 views
6

我有一個異步啓動程序的功能:的Emacs迷你緩衝區完成

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

,我有所有的可執行文件的列表,從中選擇。我希望app函數的行爲爲switch-to-buffer,爲用戶提供TAB完成。我如何在Emacs中使用minibuffer完成?

回答

8

使用completing-read命令。該功能將類似於

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

可能更地道是用interactive,而不是根據Emacs Lisp Idioms: Prompting for User Input賦值給一個變量:

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

您也可以使用(start-process app-name nil app-name)代替(async-shell-command app-name),如果你根據Run a program from Emacs and don't wait for output不關心過程輸出。


Minibuffer Completion用於在Emacs上完成更多的想法和Asynchronous Processes從Emacs的通話過程中,無論是從GNU手冊。

4

如果你想爲可能的shell命令完成,而不需要自己維護一個列表,你使用Emacs 23或更高版本,可以使用read-shell-command

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