Завершение минибуфера Emacs

У меня есть функция, которая запускает программы асинхронно:

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

И у меня есть список всех исполняемых файлов, из которых можно выбирать. Я хочу app функция вести себя как switch-to-buffer, предоставляя TAB-завершение для пользователя. Как мне использовать завершение минибуфера в Emacs?

2 ответа

Решение

Использование completing-read команда. Функция будет выглядеть

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

Возможно, более идиоматическим является использование interactive вместо присвоения переменной в соответствии с Emacs Lisp Idioms: Запрос на ввод данных пользователем:

(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 и асинхронных процессах для вызова процессов из Emacs, оба из руководств GNU.

Если вы хотите выполнить возможные команды оболочки без необходимости вести список самостоятельно, и вы используете Emacs 23 или новее, вы можете использовать read-shell-command:

(defun app (app-name)
  (interactive (list (read-shell-command "Run application: ")))
  (async-shell-command app-name))
Другие вопросы по тегам