Завершение минибуфера 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))