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”?

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

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.


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))
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.