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?
Antwort
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.
Das ist sehr einfach - danke. – hatmatrix
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.
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
- 1. In Emacs kopieren Lisp
- 2. PPRINT in Emacs Lisp?
- 3. Was bedeutet # [...] in emacs-lisp?
- 4. Emacs Lisp Char-Tabelle
- 5. Debug Emacs Lisp Hauptmodus
- 6. Fehlerbehebung für Emacs und Emacs Lisp
- 7. nest backquote und `in emacs lisp
- 8. emacs Lisp-Bibliothek für Eingabeformulare?
- 9. Emacs Lisp - neues Fenster öffnen
- 10. Daten und Zeiten in Emacs Lisp
- 11. Schema-Dialekt von Lisp in Emacs
- 12. Was bedeutet^L in (Emacs Lisp) Quellcode?
- 13. Eine zitierte Funktion in Emacs-Lisp
- 14. Emacs Lisp: Variable in Alist bewerten
- 15. awk '{print $ 2, ",", $ 1}' in Emacs Lisp?
- 16. Überschreiben einer Funktion in Emacs Lisp
- 17. Richtige Anwendung in Emacs Lisp anwenden?
- 18. wrap eine funktion in emacs lisp
- 19. extrahieren/Slice/reorder-Listen in (Emacs) Lisp?
- 20. Serialisieren eines Emacs-Lisp-Hashs in Datei
- 21. Tipps zum Profilieren von Fehlverhalten Emacs Lisp?
- 22. Struct Unterschied zwischen gemeinsamen Lisp und Emacs lisp
- 23. Hilfe schreiben Emacs Lisp für Emacs Etags Suche
- 24. Emacs-Lisp: Wie man emacs-lisp Programm als PC-Anwendung verpackt?
- 25. Emacs Lisp - wie man `&&` Shell eingibt?
- 26. Laden Sie eine Datei mit Emacs Lisp
- 27. kontinuierlich eine Emacs-Lisp-Funktion ausführen
- 28. Interactive Emacs Lisp-Funktion zwei Worte miteinander
- 29. Was ist dein empfohlener Emacs Lisp?
- 30. Kann ich Lisp ohne Emacs problemlos verwenden?
Haben Sie http://www.gnu.org/software/emacs/manual/html_node/elisp/Asynchronous-Processes.html gelesen? –