2012-07-26 20 views
6

Mam funkcję, która uruchamia programy asynchronicznie:Emacsa minibufora ukończenie

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

i mam listę wszystkich plików wykonywalnych, z którego można wybrać. Chcę, aby funkcja app zachowywała się jak switch-to-buffer, zapewniając uzupełnianie TAB dla użytkownika. Jak korzystać z uzupełniania minibuforów w Emacs?

Odpowiedz

8

Użyj polecenia completing-read. Funkcja będzie wyglądać

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

Ewentualnie bardziej idiomatyczne jest użycie interactive zamiast przypisanie do zmiennej według Emacs Lisp Idioms: Prompting for User Input:

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

Również można użyć (start-process app-name nil app-name) zamiast (async-shell-command app-name), jeśli ciebie nie przejmuj się wydajnością procesową zgodnie z Run a program from Emacs and don't wait for output.


Zobacz Minibuffer Completion Więcej pomysłów na ukończeniu w Emacs i Asynchronous Processes do wywoływania procesów z Emacs, zarówno z GNU podręcznikach.

4

Jeśli chcesz zakończenie ewentualnych poleceń powłoki bez konieczności prowadzi wykaz siebie i używasz Emacs 23 lub nowszy, można użyć read-shell-command:

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