Como posso executar um processo assíncrono em segundo plano sem abrir um buffer?

23

Eu defini algumas funções para executar o processo async-shell-commandem segundo plano assíncrono usando o meu .emacs, mas sempre que executo os comandos, uma nova janela (não o quadro) é criada e o buffer do processo é mostrado lá. Como eu poderia executar o comando sem o buffer "pop-up"?

rlazo
fonte

Respostas:

21

Você pode iniciar processos em segundo plano com start-process, que não devem exibir um buffer:

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

Os nomes dos processos são modificados para evitar duplicação conforme necessário, portanto, não se preocupe. Apenas dê um nome útil para depuração no futuro!

Se você der a "buffer-name", um buffer será criado, mas não será mostrado imediatamente. Isso pode ser conveniente para gerenciar processos e analisar a saída. Se você não deseja que um buffer seja criado, passe nilcomo o nome do buffer:

(start-process "process-name" nil "program")
Tikhon Jelvis
fonte
É possível usar start-processpara um comando sudo? Tentei encerrar minha ligação start-process, (let ((default-directory "/sudo::")) ... )mas não funcionou para mim.
sid-kap
@ sid-kap: Eu não sei. Você provavelmente deve fazer isso como uma pergunta independente.
Tikhon Jelvis
1
"program"neste caso, é apenas o nome do programa (por exemplo, nautilus, caja, firefox) e "arg1 arg2 ..."deve estar no quarto argumento posicional de start-process. Eu percebi isso lendo a documentação :)
biocyberman
8

Como Tikhon mencionou, (start-process)é o caminho a percorrer. Caso você não queira criar um buffer, mas ainda assim queira reagir ao status do processo em segundo plano, também pode empregar (set-process-sentinel). Aqui está um exemplo modificado que estou tirando do meu projectorpacote:

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

Na descrição da função 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.

As páginas de manual do GNU em Processos são muito boas para mais informações.

waymondo
fonte
Você poderia descrever o que set-process-sentinelé um pouco mais preciso? Tenho a ideia geral de ter uma função que gerencia o processo, mas não entendo completamente todos os detalhes. Obrigado!
Tikhon Jelvis 26/09
Se você fizer M-x describe-functione entrar, set-process-sentinelreceberá uma resposta curta da documentação do Emacs: (set-process-sentinel PROCESS SENTINEL) Dê a PROCESS o sentinel SENTINEL; nulo por padrão. O sentinela é chamado como uma função quando o processo muda de estado. Ele recebe dois argumentos: o processo e uma string que descreve a alteração.
waymondo 26/09/14
1
As páginas de manual do GNU Emacs sobre Sentinels and Processes são realmente muito boas para informações mais detalhadas.
waymondo 26/09/14
Legal. Talvez você possa editar os links em sua resposta? Eu acho que também se poderia aprender mais apenas usando C-h f...
Tikhon Jelvis
2

Não há necessidade de alterar como você executa um comando assíncrono. O Emacs possui uma capacidade genérica de permitir que você controle onde ou se algum buffer será exibido, modificando uma única estrutura de dados, a display-buffer-alist.

Na solução abaixo, você pode ver que a função de ação display-buffer-no-window(por exemplo, sem pop-up) está configurada para ser associada a qualquer buffer com um nome começando *Asynchronous Shell Command*(o emacs adiciona um sufixo incremental quando é solicitado a criar mais de um).

Para ver a lista de outras opções de exibição disponíveis, digite C-h f display-buffere procure a lista de "funções de ação".

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