2012-07-26 12 views
6

tengo una función que pone en marcha programas de forma asíncrona:Emacs minibúfer finalización

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

y tengo una lista de todos los ejecutables de los cuales elegir. Quiero que la función app se comporte como switch-to-buffer, proporcionando la finalización de TAB para el usuario. ¿Cómo uso la finalización del minibúfer en Emacs?

Respuesta

8

Utilice completing-read comando. La función se verá como

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

Posiblemente más idiomática es utilizar interactive en lugar de asignar a una variable de acuerdo con Emacs Lisp Idioms: Prompting for User Input:

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

También se puede usar (start-process app-name nil app-name) en lugar de (async-shell-command app-name), si no importa la salida del proceso según Run a program from Emacs and don't wait for output.


Ver Minibuffer Completion para más ideas sobre la terminación de Emacs y Asynchronous Processes para llamar procesos de Emacs, tanto desde manuales de GNU.

4

Si quieren finalización de posibles comandos shell sin necesidad de mantener una lista a sí mismo, y está usando Emacs 23 o posterior, puede utilizar read-shell-command:

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