É possível executar um comando shell silenciosamente (em segundo plano)? Quando eu uso async-shell-command
, o emacs divide as janelas. Eu gostaria que um comando shell específico estivesse totalmente em segundo plano (sem nenhum efeito visual).
Como exemplo explícito, eu tenho o seguinte código (emprestado de https://emacs.stackexchange.com/a/7932 ). Abre a versão pdf do arquivo tex no qual estou trabalhando. Ao executá-lo, ele divide a janela. Gostaria de evitar esse comportamento nessa situação específica.
(defun my-view-pdf ()
(interactive)
(async-shell-command
(concat "SumatraPDF " (file-name-base (buffer-file-name)) ".pdf")))
TeX-view
(C-c C-v
)?C-c C-v
nada acontece. Eu não entendo o porquê. Se você conhece uma personalização simples na.emacs
qualC-c C-v
funciona, ficaria feliz em usá-la. Meu SO é Windows e meu visualizador de pdf está localizado emC:\Program Files\SumatraPDF\sumatrapdf.exe
. Nesse link, a lista de leis forneceu um link abrangente. Estou interessado apenas em fazer o visualizador TeX funcionar.TeX-view-program-list
.Respostas:
save-window-excursion
é uma macro para executar um pedaço de código sem alterar a configuração da janela. Algo assim deve funcionar:fonte
save-window-excursion
, quase idêntico à sua implementação.save-window-excursion
esave-window-configuration
. Parece que os dois trabalham nessa situação.save-window-excursion
utiliza algumas práticas recomendadas de macro para evitar a introdução de variáveis no ambiente do corpo. Além disso,save-window-excursion
é incorporado ao Emacs. Eu estava procurando por essa macro, mas não a encontrei, então escrevi minha própria versão. Felizmente, o bmag conhecia o verdadeiro.Se você apenas deseja gerar um processo em segundo plano, não precisa de todos os sinos e apitos que as funções de comando do shell fornecem.
Em vez disso, você pode usar a função
call-process
. Por exemplo:Concretamente, isso significa que você pode implementar seu comando como:
fonte
(defun my-pdf-viewer () (interactive) (call-process (async-shell-command (concat "SumatraPDF " (file-name-base (buffer-file-name)) ".pdf")) nil 0 ; <- Discard and don't wait nil "arg1" "arg2") )
. Recebo o erro `Argumento de tipo errado: stringp, comint-output-filter`. Não tenho certeza se a sintaxe que usei está correta.async-shell-command
todos juntos. Deve ser algo parecido(defun my-pdf-viewer () (interactive) (call-process "SumatraPDF" nil 0 nil (concat (file-name-base (buffer-file-name)) ".pdf"))
.(defun my-view-pdf () (interactive) (call-process "SumatraPDF" nil 0 nil (concat (file-name-base (buffer-file-name)) ".pdf")))
.Use
display-buffer-alist
com odisplay-buffer-no-window
se você estiver no Emacs 24.4 ou posterior.Como alternativa, use a manilha :
fonte
(setq display-buffer-alist '(("\`\\*Async Shell Command\\*\\'" display-buffer-no-window)))
eu recebo o erroapply: Wrong type argument: sequencep, display-buffer-no-window
.display-buffer-no-window
foi introduzido no Emacs 24.4, para que não funcione. Meu pacote, por outro lado, deve funcionar em 24.3.display-buffer-no-window
é uma terceira opção, basta inserir(defun display-buffer-no-window (_buffer alist) (when (cdr (assq 'allow-no-window alist)) 'fail))
na configuração do Emacs.(defun display-buffer-no-window (_buffer alist) (when (cdr (assq 'allow-no-window alist)) 'fail)) (setq display-buffer-alist '(("\`\\*Async Shell Command\\*\\'" display-buffer-no-window))) (defun my-view-pdf () (interactive) (progn (async-shell-command (concat "SumatraPDF " (file-name-base (buffer-file-name)) ".pdf"))))
. Porém, após a execuçãomy-view-pdf
, o emacs divide a janela e*Async Shell Command*
é mostrado.