2009-09-21 13 views
10

Jeśli próbuję uruchomić polecenie powłoki w funkcji Emacs Lisp, w której wielokrotnie wywoływam rsync (lub scp), której wersji powłoki powinienem użyć? Obecnie używam shell-command, który blokuje Emacs do momentu zakończenia procesu, a wynik, który powinien być widoczny z --verbose do rsync, nie jest drukowany; Mogę użyć shell-command z & na końcu ciągu poleceń, aby uczynić go asynchronicznym, który wypisuje postęp - ale nie "blokuje" Emacs w całości, minibuffer wielokrotnie pyta, czy chcę zabić proces, który w międzyczasie jest kaleki; i start-process-shell-command, który wydaje się zatrzymywać funkcję dopiero po przesłaniu pierwszego pliku/katalogu; pomijam resztę, gdy wykonuję wiele połączeń rsync wykonanych za pośrednictwem mojej funkcji. Żadne z nich nie wydaje się idealne, jakiekolwiek wskazówki?które polecenie powłoki w emacs seplenienie?

+1

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

Odpowiedz

13

Ja sam odniosłem największy sukces przy użyciu procesu uruchamiania.

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

Spowoduje to wysłanie wszystkich danych wyjściowych do pojedynczego bufora.

+1

To bardzo proste - dziękuję. – hatmatrix

5

Jednym z rozwiązań może być uruchomienie polecenia w rzeczywistej wersji shell buffer. Wtedy masz do wyboru, które uruchomić jeden z tych:

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

Jeśli podoba Ci się ten pomysł, można zakodować go tak:

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

Czytaj więcej na 'process-send-string do jego użytkowania. Możesz również chcieć sprawdzić błędy na output z procesów.

+0

Witaj Trey, dziękuję Ci zawsze. Tym razem musiałem wybrać rozwiązanie Jonathana, ale ponieważ było to bezpośrednie i dobrze dopasowane do tego celu (i ciąg wysyłania procesów działał tylko w buforze utworzonym i jawnie odwoływanym (z get-buffer-create), a nie w temp-buffer ...) ale czytam o funkcjach filtrowania ... jest wiele rzeczy do zgryzienia i jestem pewien, że znajdę zastosowania na końcu. Jeszcze raz dziękuję. – hatmatrix

Powiązane problemy