6

我有一个异步启动程序的功能:

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

我有一个可供选择的所有可执行文件的列表。我希望app函数表现为switch-to-buffer,为用户提供 TAB 补全。如何在 Emacs 中使用 minibuffer 完成?

4

2 回答 2

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))

如果您根据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 手册。

于 2012-07-26T11:57:35.537 回答
4

如果您希望完成可能的 shell 命令而不需要自己维护一个列表,并且您使用的是 Emacs 23 或更新版本,您可以使用read-shell-command

(defun app (app-name)
  (interactive (list (read-shell-command "Run application: ")))
  (async-shell-command app-name))
于 2012-07-26T13:07:37.200 回答