Jak mogę uruchomić proces asynchroniczny w tle bez wyskakiwania bufora?

23

Zdefiniowałem niektóre funkcje do uruchamiania procesu asynchronicznego w tle przy użyciu async-shell-command.emacs, ale za każdym razem, gdy uruchamiam polecenia, tworzone jest nowe okno (nie ramka) i tam wyświetlany jest bufor procesu. Jak mogę uruchomić polecenie bez bufora „pop-up”?

rlazo
źródło

Odpowiedzi:

21

Możesz uruchomić procesy w tle start-process, które nie powinny wywoływać bufora:

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

Nazwy procesów są modyfikowane, aby w razie potrzeby uniknąć powielania, więc nie przejmuj się tym. Po prostu nadaj mu nazwę przydatną do debugowania w przyszłości!

Jeśli dasz "buffer-name", bufor zostanie utworzony, ale nie zostanie wyświetlony natychmiast. Może to być wygodne w zarządzaniu procesami i analizowaniu wyników. Jeśli nie chcesz, aby bufor był tworzony w ogóle, podaj niljako nazwę bufora:

(start-process "process-name" nil "program")
Tikhon Jelvis
źródło
Czy można użyć start-processpolecenia sudo? Próbowałem owijając moje wezwanie, aby start-processw (let ((default-directory "/sudo::")) ... )ale to nie dla mnie.
sid-kap
@ sid-kap: Nie wiem. Prawdopodobnie powinieneś zadać to pytanie jako samodzielne pytanie.
Tikhon Jelvis,
1
"program"w tym przypadku jest to tylko nazwa programu (np. nautilus, caja, firefox) i "arg1 arg2 ..."powinna znajdować się w czwartym argumencie pozycyjnym start-process. Dowiedziałem się tego, czytając dokumentację :)
biocyberman
8

Jak wspomniał Tikhon, (start-process)jest to najlepsza droga. Jeśli nie chcesz tworzyć bufora, ale nadal chcesz reagować na status procesu w tle, możesz również zastosować (set-process-sentinel). Oto zmodyfikowany przykład, który biorę z mojej projectorpaczki:

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

Z opisu funkcji Emacsa:

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

GNU stron podręcznika na Procesów jest dość dobry, aby uzyskać więcej informacji.

waymondo
źródło
Czy mógłbyś opisać, co set-process-sentinelrobi nieco dokładniej? Mam ogólną ideę posiadania funkcji, która zarządza procesem, ale nie do końca rozumiem wszystkie szczegóły. Dzięki!
Tikhon Jelvis
Jeśli to zrobisz M-x describe-functioni wejdziesz set-process-sentinel, otrzymasz krótką odpowiedź z dokumentacji Emacsa: (set-process-sentinel PROCESS SENTINEL) Podaj PROCESS wartownika SENTINEL; zero dla wartości domyślnej. Wartownik jest wywoływany jako funkcja, gdy proces zmienia stan. Otrzymuje dwa argumenty: proces i ciąg opisujący zmianę.
waymondo
1
The GNU Emacs ręczne strona Sentinel i procesy są rzeczywiście bardzo dobre dla bardziej szczegółowych informacji.
waymondo
Fajne. Być może mógłbyś edytować linki w swojej odpowiedzi? C-h f
Wydaje
2

Nie trzeba zmieniać sposobu uruchamiania polecenia asynchronicznego. Emacs ma ogólną zdolność pozwalającą ci kontrolować, gdzie lub czy pojawi się jakiś bufor, modyfikując pojedynczą strukturę danych display-buffer-alist.

W poniższym rozwiązaniu możesz zobaczyć, że funkcja akcji display-buffer-no-window(tj. Brak wyskakującego okienka) jest skonfigurowana do powiązania z dowolnym buforem o nazwie rozpoczynającej się od nazwy *Asynchronous Shell Command*(emacs dodaje przyrostowy przyrostek, gdy zostanie poproszony o utworzenie więcej niż jednego).

Aby zobaczyć listę innych dostępnych opcji wyświetlania, wpisz C-h f display-bufferi poszukaj listy „funkcji akcji”.

;; Buffers that I don't want popping up by default
(add-to-list 'display-buffer-alist
  '("\\*Async Shell Command\\*.*" display-buffer-no-window))
użytkownik1404316
źródło