我有一個異步啓動程序的功能:的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))