2011-12-28 2 views
7

Ho un comando di Emacs come segue:Can Emacs comando eseguito in background

(defun query-lisp (word) 
    (interactive "sType a word to query:") 
    (message "%s" (query word))) 

L'operazione query è un'operazione che richiede tempo. Quando questo comando è in esecuzione, Emacs blocca l'intero frame. C'è un modo per far funzionare questo comando in background o bloccare solo una singola finestra come il minibuffer?

risposta

8

Emacs non ha thread. Per operazioni lunghe è possibile suddividere l'attività in blocchi ed eseguire i blocchi in idle timers, in modo che emacs possa rispondere all'input dell'utente tra i blocchi.

L'altra possibilità è eseguirlo come un processo esterno da cui emacs accetta l'output.

+1

+1 per le informazioni.In realtà la funzione di query che ho scritto è in python e viene caricata su emacs da pymacs, quindi penso che il processo esterno sia forse una soluzione, puoi fornire maggiori dettagli su come il processo esterno è interattivo con emacs? – DouO

+1

La [parte pertinente del manuale di emacs lisp] (http://www.gnu.org/software/emacs/manual/html_node/elisp/Processes.html) spiega tutto in modo molto dettagliato con esempi. – Tom

+0

Ma se vuoi solo eseguire un comando esterno e mostrare il suo output, puoi ottenere usando [i comandi integrati] (http://www.gnu.org/software/emacs/manual//html_node/emacs/Shell .html). – Tom

4

Ad esempio, si può usare qualcosa di simile

(shell-command "sleep 10 && echo 'finished' &") 

Il risultato sarà visualizzato in *Async Shell Command* buffer.

+0

La cosa bella di 'shell-command' e' async-shell-command' (l'ultimo dei quali è equivalente a '(shell-command" ... & ")') è che possono essere chiamati in modo interattivo e sono legato a 'M-!' e 'M- &' rispettivamente. – GDP2

10

Se si prevede di utilizzare un processo esterno (che è stato indicato in un commento ad un'altra domanda), è possibile utilizzare il seguente:

(start-process NAME BUFFER PROGRAM &rest PROGRAM-ARGS) 

Ciò restituirà un processo oggetto. È possibile inviare l'output a un buffer oppure è possibile allegare una funzione di filtro al processo. In quest'ultimo caso, questa è una funzione che viene chiamata ogni volta che il processo emette un output.

Inoltre, è possibile allegare una funzione sentinella al processo. Questa funzione è chiamata ogni volta che cambia lo stato del tuo processo, questo è utile per scoprire quando è uscito.

Ci sono diversi esempi di quanto sopra nel codice sorgente di Emacs, uno di questi è compile.el.