2009-09-21 6 views
10

Wenn ich versuche, einen Shell-Befehl in einer Emacs-Lisp-Funktion auszuführen, in der ich rsync (oder scp) mehrfach nenne, welche Shell-Befehlsvariante sollte ich verwenden? Ich verwende derzeit shell-command, die Emacs blockiert, bis der Prozess abgeschlossen ist, und die Ausgabe, die mit der --verbose bis rsync sichtbar sein sollte, wird nicht gedruckt; Ich kann shell-command mit einem & am Ende der Befehlszeichenkette verwenden, um es asynchron zu machen, der den Fortschritt druckt - aber während es Emacs nicht vollständig "sperrt", fragt der Minipuffer wiederholt, ob ich den Prozess töten möchte, der lähmt in der Zwischenzeit; und start-process-shell-command, die die Funktion scheinbar nur stoppt, nachdem die erste Datei/das erste Verzeichnis übertragen wurde; den Rest zu vernachlässigen, wenn mehrere rsync Anrufe über meine Funktion ausgeführt werden. Keines davon scheint ideal, irgendwelche Hinweise?Welche Shell-Befehl in Emacs lisp?

+1

Haben Sie http://www.gnu.org/software/emacs/manual/html_node/elisp/Asynchronous-Processes.html gelesen? –

Antwort

13

Ich hatte am meisten Erfolg mit Start-Prozess selbst.

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

Dies wird die gesamte Ausgabe an einen einzelnen Puffer senden.

+1

Das ist sehr einfach - danke. – hatmatrix

5

Eine Lösung könnte sein, den Befehl in einem tatsächlichen auszuführen. Dann erhalten Sie zu wählen, welche derjenigen auszuführen:

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

Wenn Sie wie die Idee, können Sie es sich wie dieser Code:

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

Lesen Sie mehr auf 'process-send-string für seine Nutzung. Möglicherweise möchten Sie auch eine Fehlerüberprüfung der output von den Prozessen haben.

+0

Hallo Trey, danke immer. Dieses Mal musste ich mich für Jonathans Lösung entscheiden, da sie direkt und gut für diesen Zweck geeignet war (und der Prozess-Send-String schien nur in einem Puffer zu funktionieren, der erstellt und explizit referenziert wurde (mit get-buffer-create) temp-buffer ...), aber ich lese gerade die Filterfunktionen auf ... es gibt viel zu grok und ich bin mir sicher, dass ich am Ende davon Nutzen finden werde. Danke nochmal. – hatmatrix