我有一个异步启动程序的功能:的Emacs迷你缓冲区完成
(defun app (app-name)
(interactive "sRun application: ")
(async-shell-command app-name))
,我有所有的可执行文件的列表,从中选择。我希望app
函数的行为为switch-to-buffer
,为用户提供TAB完成。我如何在Emacs中使用minibuffer完成?
我有一个异步启动程序的功能:的Emacs迷你缓冲区完成
(defun app (app-name)
(interactive "sRun application: ")
(async-shell-command app-name))
,我有所有的可执行文件的列表,从中选择。我希望app
函数的行为为switch-to-buffer
,为用户提供TAB完成。我如何在Emacs中使用minibuffer完成?
使用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手册。
如果你想为可能的shell命令完成,而不需要自己维护一个列表,你使用Emacs 23或更高版本,可以使用read-shell-command
:
(defun app (app-name)
(interactive (list (read-shell-command "Run application: ")))
(async-shell-command app-name))