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

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

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


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))
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.