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

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

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

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


person Mirzhan Irkegulov    schedule 26.07.2012    source источник


Ответы (2)


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

person Mirzhan Irkegulov    schedule 26.07.2012

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

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