2012-07-26 21 views
6

Ich habe eine Funktion, die Programme asynchron startet:Emacs Minipuffer Abschluss

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

Und ich habe eine Liste aller ausführbaren Dateien, von denen zu wählen. Ich möchte die app Funktion als switch-to-buffer, TAB-Vervollständigung für Benutzer bereitstellen. Wie verwende ich die Minibuffer-Vervollständigung in Emacs?

Antwort

8

Verwenden Sie completing-read Befehl. Die Funktion wird wie folgt aussehen

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

Möglicherweise mehr idiomatische ist interactive zu verwenden, anstatt auf eine Variable Zuweisung nach Emacs Lisp Idioms: Prompting for User Input:

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

Sie können auch (start-process app-name nil app-name) anstelle von (async-shell-command app-name), wenn Sie Prozessausgabe nach Run a program from Emacs and don't wait for output ist nicht wichtig.


Siehe Minibuffer Completion für mehr Ideen auf Abschluss in Emacs und Asynchronous Processes für Prozesse von Emacs, die beide von GNU Handbücher aufrufen.

4

Wenn Sie Abschluss für mögliche Shell-Befehle wollen, ohne eine Liste selbst zu halten und Sie verwenden Emacs 23 oder höher, können Sie read-shell-command:

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