Emacs迷你缓冲区完成

6

我有一个启动程序的异步函数:

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

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

2个回答

10

使用completing-read命令。该函数看起来像:

(defun app ()
  (interactive)
  (let ((app-name (completing-read "Run application: " program-list)))
    (async-shell-command app-name)))

可能更符合惯用语的方法是使用 interactive 而不是根据 Emacs Lisp习惯:提示用户输入 分配给变量:

(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),参考在Emacs中运行程序而不等待输出

查看迷你缓冲区补全获取更多有关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))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接