2012-07-26 124 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))