我有一个异步启动程序的功能:
(defun app (app-name)
(interactive "sRun application: ")
(async-shell-command app-name))
我有一个可供选择的所有可执行文件的列表。我希望app
函数表现为switch-to-buffer
,为用户提供 TAB 补全。如何在 Emacs 中使用 minibuffer 完成?
我有一个异步启动程序的功能:
(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))
如果您根据Run a program from Emacs and don't wait for output不关心进程输出,您也可以使用(start-process app-name nil app-name)
而不是。(async-shell-command app-name)
参见Minibuffer Completion了解更多关于 Emacs 完成的想法和从 Emacs 调用进程的异步进程,两者都来自 GNU 手册。
如果您希望完成可能的 shell 命令而不需要自己维护一个列表,并且您使用的是 Emacs 23 或更新版本,您可以使用read-shell-command
:
(defun app (app-name)
(interactive (list (read-shell-command "Run application: ")))
(async-shell-command app-name))