¿Es posible ejecutar un comando de shell en silencio (en segundo plano)? Cuando uso async-shell-command
, emacs divide las ventanas. Me gustaría que un comando de shell específico esté totalmente en segundo plano (sin ningún efecto visual).
Como ejemplo explícito, tengo el siguiente código (tomado de https://emacs.stackexchange.com/a/7932 ). Abre la versión pdf del archivo tex en el que estoy trabajando. Al ejecutarlo, divide la ventana, me gustaría evitar este comportamiento en esta situación particular.
(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 sucede. No entiendo por qué. Si conoce una personalización simple en lo.emacs
que hace queC-c C-v
funcione, me encantaría usarla. Mi sistema operativo es Windows y mi visor de pdf se encuentra enC:\Program Files\SumatraPDF\sumatrapdf.exe
. En ese enlace, la lista legal ha proporcionado un enlace completo. Solo estoy interesado en hacer que TeX-viewer funcione.TeX-view-program-list
.Respuestas:
save-window-excursion
es una macro para ejecutar un fragmento de código sin alterar la configuración de la ventana. Algo como esto debería funcionar:fuente
save-window-excursion
, que es casi idéntico a su implementación.save-window-excursion
ysave-window-configuration
. Parece que ambos trabajan en esta situación.save-window-excursion
utiliza algunas prácticas recomendadas macro para evitar introducir variables en el entorno del cuerpo. Además,save-window-excursion
está integrado en Emacs. Estaba buscando esa macro, pero no la encontré, así que escribí mi propia versión. Afortunadamente, bmag sabía el verdadero.Si solo desea generar un proceso en segundo plano, no necesita todas las campanas y silbatos que proporcionan las funciones de comando de shell.
En cambio, puede usar la función
call-process
. Por ejemplo:Concretamente, esto significa que puede implementar su comando como:
fuente
(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") )
. Aparece el error `Argumento de tipo incorrecto: stringp, comint-output-filter`. No estoy seguro de si la sintaxis que utilicé es correcta.async-shell-command
todo junto. Debería ser algo así(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")))
.Úselo
display-buffer-alist
con eldisplay-buffer-no-window
si está en Emacs 24.4 o posterior.Alternativamente, use grillete :
fuente
(setq display-buffer-alist '(("\`\\*Async Shell Command\\*\\'" display-buffer-no-window)))
me sale el errorapply: Wrong type argument: sequencep, display-buffer-no-window
.display-buffer-no-window
se introdujo en Emacs 24.4, por lo que no funcionará. Mi paquete, por otro lado, debería funcionar en 24.3.display-buffer-no-window
es una tercera opción, simplemente inserte(defun display-buffer-no-window (_buffer alist) (when (cdr (assq 'allow-no-window alist)) 'fail))
en su configuración de 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"))))
. Pero después de ejecutarmy-view-pdf
, emacs divide la ventana y*Async Shell Command*
se muestra.