2009-09-21 19 views
10

Se sto cercando di eseguire un comando shell in una funzione Emacs Lisp in cui chiamo rsync (o scp) più volte, quale variante di comando shell dovrei usare? Attualmente sto usando shell-command, che blocca Emacs fino al termine del processo, e l'output che dovrebbe essere visibile con lo --verbose su rsync non viene stampato; Posso usare shell-command con un & alla fine della stringa di comando per renderlo asincrono, che stampa l'avanzamento - ma mentre non "blocca" completamente Emacs, il minibuffer chiede ripetutamente se voglio uccidere il processo che è paralizzante nel frattempo; e start-process-shell-command, che sembra interrompere la funzione solo dopo il trasferimento del primo file/directory; trascurare il resto quando ci sono più chiamate rsync effettuate tramite la mia funzione. Nessuno di questi sembra ideale, qualche suggerimento?quale shell-command in emacs lisp?

+1

Hai letto http://www.gnu.org/software/emacs/manual/html_node/elisp/Asynchronous-Processes.html? –

risposta

13

Ho avuto il maggior successo utilizzando io stesso il processo di avvio.

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

Questo invierà tutta l'uscita a un singolo buffer.

+1

Questo è molto semplice - grazie. – hatmatrix

5

Una soluzione potrebbe essere quella di eseguire il comando in un effettivo shell buffer. Poi si arriva a scegliere quale uno di quelli a correre:

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

Se vi piace l'idea, è possibile codificare in su in questo modo:

(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 ..."))) 

saperne di più su 'process-send-string per il suo uso. Si potrebbe anche voler avere qualche controllo degli errori sul output dai processi.

+0

Ciao Trey, grazie sempre. Questa volta ho dovuto scegliere la soluzione di Jonathan, ma poiché era diretta e adatta a questo scopo (e process-send-string sembrava funzionare solo in un buffer creato e referenziato esplicitamente (con get-buffer-create) piuttosto che in temp-buffer ...) ma sto leggendo le funzioni di filtraggio ... c'è molto da aggiungere e sono sicuro che troverò gli usi alla fine. Grazie ancora. – hatmatrix

Problemi correlati