2011-12-28 31 views
7

que tienen un comando de Emacs como el siguiente:Can Emacs de comandos se ejecutan en segundo plano

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

La operación query es una operación que consume tiempo. Cuando este comando se ejecuta, Emacs bloquea todo el cuadro. ¿Hay alguna manera de hacer que Emacs ejecute este comando en segundo plano o bloquee solo una ventana como el minibúfer?

Respuesta

8

Emacs no tiene hilos. Para operaciones largas, puede dividir la tarea en fragmentos y ejecutar los fragmentos en idle timers, para que emacs pueda responder a la entrada del usuario entre los fragmentos.

La otra posibilidad es ejecutarlo como un proceso externo desde el que emacs acepta la salida.

+1

+1 para la información.Actualmente la función de consulta que escribí está en python y se carga a emacs por pymacs, así que creo que el proceso externo puede ser una solución. ¿Puede detallar más acerca de cómo el proceso externo interactúa con emacs? – DouO

+1

La [parte correspondiente del manual de emacs lisp] (http://www.gnu.org/software/emacs/manual/html_node/elisp/Processes.html) explica todo en gran detalle con ejemplos. – Tom

+0

Pero si solo quiere ejecutar un comando externo y mostrar su salida, puede obtenerlo utilizando [los comandos integrados] (http://www.gnu.org/software/emacs/manual//html_node/emacs/Shell .html). – Tom

4

Por ejemplo, se puede usar algo como esto

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

El resultado se mostrará en *Async Shell Command* búfer.

+0

Lo bueno de 'shell-command' y' async-shell-command' (el último de los cuales es equivalente a '(shell-command" ... & ")') es que se pueden llamar interactivamente y son obligado a 'M-!' y 'M- &' respectivamente. – GDP2

10

Si va a utilizar un proceso externo (que usted ha indicado en un comentario a otra pregunta), puede utilizar el siguiente:

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

Esto devolverá un objetoproceso. Puede enviar la salida a un búfer o puede adjuntar una función de filtro al proceso. En el último caso, esta es una función que se llama cada vez que su proceso emite cualquier salida.

Además, puede adjuntar una función centinela a su proceso. Esta función se llama cada vez que cambia el estado de su proceso, esto es útil para saber cuándo ha salido.

Existen varios ejemplos de lo anterior en el código fuente de Emacs, uno de estos ejemplos es compile.el.

Cuestiones relacionadas