【问题标题】:Emacs minibuffer completionEmacs minibuffer 完成
【发布时间】:2012-07-25 00:09:57
【问题描述】:

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

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

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

【问题讨论】:

    标签: emacs elisp launcher tab-completion minibuffer


    【解决方案1】:

    使用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 中完成的更多想法,并参阅Asynchronous Processes 了解从 Emacs 调用进程,两者都来自 GNU 手册。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-10-23
        • 1970-01-01
        • 2014-01-28
        • 1970-01-01
        • 2012-08-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多