2009-09-21 22 views
10

Si estoy tratando de ejecutar un comando de shell en una función de Emacs Lisp en la que llamo a rsync (o scp) varias veces, ¿qué variante de comando de shell debo usar? Actualmente estoy usando shell-command, que bloquea Emacs hasta que finalice el proceso, y la salida que debería ser visible con --verbose a rsync no se imprime; Puedo usar shell-command con un & al final de la cadena de comandos para que sea asincrónico, lo que sí imprime el progreso, pero mientras no "bloquea" completamente Emacs, el minibúfer pregunta repetidamente si quiero matar el proceso que es paralizante mientras tanto; y start-process-shell-command, que parece detener la función solo después de que se transfiere el primer archivo/directorio; Descuidar el resto cuando hay múltiples llamadas rsync realizadas a través de mi función. Ninguno de estos parece ideal, ¿alguna pista?¿qué comando de shell en emacs lisp?

+1

¿Has leído http://www.gnu.org/software/emacs/manual/html_node/elisp/Asynchronous-Processes.html? –

Respuesta

13

He tenido el mayor éxito usando el proceso de inicio mismo.

(start-process "process-name" 
       (get-buffer-create "*rsync-buffer*") 
       "/path/to/rsync" 
       arg1 
       ... 
       argn) 

Esto enviará toda la salida a un solo búfer.

+1

Esto es muy sencillo, gracias. – hatmatrix

5

Una solución podría ser ejecutar el comando en un shell buffer real. A continuación, puedes elegir la que uno de los que corren:

M-x shell 
M-x eshell 
M-x term 

Si te gusta esa idea, puede codificar hasta que como esto:

(defun my-rsync-routine() 
    "run some rsync processes" 
    (with-temp-buffer 
    (shell (current-buffer)) 
    (process-send-string nil "rsync ...") 
    (process-send-string nil "rsync ...") 
    (process-send-string nil "rsync ..."))) 

Leer más en 'process-send-string para su uso. Es posible que también desee comprobar algunos errores en el output de los procesos.

+0

Hola Trey, gracias siempre. Esta vez tuve que elegir con la solución de Jonathan, pero era directa y adecuada para este propósito (y el proceso-envío-cadena parecía funcionar solo en un buffer creado y explícitamente referenciado (con get-buffer-create) en lugar de en temp-buffer ...) pero estoy leyendo sobre las funciones de filtrado ... hay mucho que grok y estoy seguro de que encontraré usos al final. Gracias de nuevo. – hatmatrix