Wie kann ich einen asynchronen Prozess im Hintergrund ausführen, ohne einen Puffer aufzurufen?

23

Ich habe einige Funktionen zum Ausführen eines asynchronen Hintergrundprozesses async-shell-commandin meinen .emacs definiert, aber jedes Mal, wenn ich die Befehle ausführe, wird ein neues Fenster (kein Frame) erstellt und der Puffer des Prozesses wird dort angezeigt. Wie könnte ich den Befehl ohne den "Popup" -Puffer ausführen?

Rlazo
quelle

Antworten:

21

Sie können Hintergrundprozesse mit starten start-process, die keinen Puffer öffnen sollen:

(start-process "process-name" "buffer-name" "program")

Prozessnamen werden nach Bedarf geändert, um Doppelarbeit zu vermeiden. Machen Sie sich also keine Sorgen. Geben Sie ihm einen Namen, der für das zukünftige Debuggen nützlich ist!

Wenn Sie a angeben "buffer-name", wird ein Puffer erstellt, der jedoch nicht sofort angezeigt wird. Dies kann nützlich sein, um Prozesse zu verwalten und die Ausgabe zu betrachten. Wenn Sie nicht möchten, dass ein Puffer erstellt wird, übergeben Sie nilden Namen des Puffers:

(start-process "process-name" nil "program")
Tikhon Jelvis
quelle
Ist es möglich, start-processfür einen Sudo-Befehl zu verwenden? Ich habe versucht , meinen Ruf zu Einwickeln start-processin , (let ((default-directory "/sudo::")) ... )aber es funktioniert nicht für mich zu arbeiten.
Sid-Kap
@ sid-kap: Ich weiß es nicht. Sie sollten das wahrscheinlich als eigenständige Frage stellen.
Tikhon Jelvis
1
"program"In diesem Fall ist nur der Programmname (z. B. Nautilus, Caja, Firefox) und "arg1 arg2 ..."sollte in der vierten Position Argument sein start-process. Ich habe das durch Lesen der Dokumentation herausgefunden :)
Biocyberman
8

Wie Tikhon schon sagte, (start-process)ist der Weg zu gehen. Wenn Sie keinen Puffer anlegen möchten, aber dennoch auf den Status des Hintergrundprozesses reagieren möchten, können Sie auch verwenden (set-process-sentinel). Hier ist ein modifiziertes Beispiel aus meinem projectorPaket:

(set-process-sentinel (start-process "process-name" nil "command") #'output-message-sentinel)

(defun output-message-sentinel (process msg)
  (when (memq (process-status process) '(exit signal))
    (message (concat (process-name process) " - " msg))))

Aus der Emacs-Funktionsbeschreibung:

(set-process-sentinel PROCESS SENTINEL)

Give PROCESS the sentinel SENTINEL; nil for default.
The sentinel is called as a function when the process changes state.
It gets two arguments: the process, and a string describing the change.

Die GNU-Handbuchseiten zu Prozessen sind ziemlich gut für weitere Informationen.

waymondo
quelle
Könntest du beschreiben, was set-process-sentinelein bisschen genauer geht? Ich habe eine allgemeine Vorstellung von einer Funktion, die den Prozess verwaltet, verstehe aber nicht alle Details. Vielen Dank!
Tikhon Jelvis
Wenn Sie dies tun M-x describe-functionund eingeben, erhalten set-process-sentinelSie die kurze Antwort aus der Emacs-Dokumentation: (set-process-sentinel PROCESS SENTINEL) Geben Sie PROCESS den Sentinel SENTINEL. Null für Standard. Der Sentinel wird als Funktion aufgerufen, wenn der Prozess den Status ändert. Es erhält zwei Argumente: den Prozess und eine Zeichenfolge, die die Änderung beschreibt.
Waymondo
1
Die GNU Emacs-Handbuchseiten zu Sentinels und Prozessen sind eigentlich ziemlich gut für detailliertere Informationen.
Waymondo
Cool. Vielleicht könnten Sie die Links in Ihrer Antwort bearbeiten? Ich denke, man könnte auch mehr lernen, C-h f
wenn man
2

Sie müssen die Ausführung eines asynchronen Befehls nicht ändern. Emacs verfügt über eine generische Funktion, mit der Sie steuern können, wo oder ob ein Puffer angezeigt wird, indem Sie eine einzelne Datenstruktur ändern display-buffer-alist.

In der folgenden Lösung können Sie sehen, dass die Aktionsfunktion display-buffer-no-window(dh kein Popup) so eingestellt ist, dass sie mit jedem Puffer verknüpft ist, dessen Name beginnt *Asynchronous Shell Command*(emacs fügt ein inkrementelles Suffix hinzu, wenn mehr als eines erstellt werden soll).

Um die Liste der anderen verfügbaren Anzeigeoptionen anzuzeigen, geben Sie C-h f display-bufferdie Liste der "Aktionsfunktionen" ein und suchen Sie danach.

;; Buffers that I don't want popping up by default
(add-to-list 'display-buffer-alist
  '("\\*Async Shell Command\\*.*" display-buffer-no-window))
user1404316
quelle