Come posso eseguire un processo asincrono in background senza spuntare un buffer?


23

Ho definito alcune funzioni per eseguire il processo in background asincrono usando async-shell-commandnel mio .emacs, ma ogni volta che eseguo i comandi viene creata una nuova finestra (non frame) e lì viene mostrato il buffer del processo. Come potrei eseguire il comando senza il buffer "pop up"?

Risposte:


21

È possibile avviare i processi in background con start-process, che non dovrebbe far apparire un buffer:

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

I nomi dei processi vengono modificati per evitare la duplicazione, se necessario, quindi non preoccuparti. Dagli un nome utile per il debug in futuro!

Se si dà un "buffer-name", verrà creato un buffer ma non mostrato immediatamente. Ciò può essere utile per la gestione dei processi e la visualizzazione dell'output. Se non si desidera creare affatto un buffer, passare nilcome nome del buffer:

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

È possibile utilizzare start-processper un comando sudo? Ho provato confezionamento mia chiamata start-processin (let ((default-directory "/sudo::")) ... ), ma non ha funzionato per me.
Sid-Kap il

@ sid-kap: non lo so. Probabilmente dovresti porlo come domanda autonoma.
Tikhon Jelvis,

1
"program"in questo caso è solo il nome del programma (ad esempio nautilus, caja, firefox) e "arg1 arg2 ..."dovrebbe essere nel quarto argomento posizionale di start-process. L'ho capito leggendo la documentazione :)
biocyberman,

8

Come menzionato da Tikhon, (start-process)è la strada da percorrere. Nel caso in cui non si desideri creare un buffer ma si desideri comunque reagire allo stato del processo in background, è anche possibile utilizzare (set-process-sentinel). Ecco un esempio modificato che sto prendendo dal mio projectorpacchetto:

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

Dalla descrizione della funzione Emacs:

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

Le pagine di manuale GNU sui processi sono abbastanza buone per maggiori informazioni.


Potresti descrivere cosa set-process-sentinelfa un po 'più accuratamente? Ho l'idea generale di avere una funzione che gestisca il processo, ma non capisco completamente tutti i dettagli. Grazie!
Tikhon Jelvis,

Se lo fai M-x describe-functione inserisci set-process-sentinelotterrai la risposta breve dalla documentazione di Emacs: (set-process-sentinel PROCESS SENTINEL) Dai a PROCESS la sentinella SENTINEL; zero per impostazione predefinita. La sentinella viene chiamata come funzione quando il processo cambia stato. Ottiene due argomenti: il processo e una stringa che descrive il cambiamento.
Waymondo,

1
Le pagine di manuale di GNU Emacs su Sentinels and Processes sono in realtà piuttosto buone per informazioni più dettagliate.
Waymondo,

Freddo. Forse potresti modificare i link nella tua risposta? Immagino che si possa imparare di più anche solo usando C-h f...
Tikhon Jelvis,

2

Non è necessario modificare la modalità di esecuzione di un comando asincrono. Emacs ha una capacità generica di permetterti di controllare dove o se comparirà un buffer, modificando una singola struttura di dati, il display-buffer-alist.

Nella soluzione seguente, puoi vedere che la funzione action display-buffer-no-window(cioè nessun pop-up) è impostata per essere associata a qualsiasi buffer con un nome che inizia *Asynchronous Shell Command*(emacs aggiunge un suffisso incrementale quando viene chiesto di crearne più di uno).

Per visualizzare l'elenco di altre opzioni di visualizzazione disponibili, digitare C-h f display-buffere cercare l'elenco di "funzioni di azione".

;; Buffers that I don't want popping up by default
(add-to-list 'display-buffer-alist
  '("\\*Async Shell Command\\*.*" display-buffer-no-window))
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.