Est-il possible d'exécuter une commande shell en silence (en arrière-plan)? Lorsque j'utilise async-shell-command
, emacs divise les fenêtres. J'aimerais qu'une commande shell spécifique soit totalement en arrière-plan (sans aucun effet visuel).
À titre d'exemple explicite, j'ai le code suivant (emprunté à https://emacs.stackexchange.com/a/7932 ). Il ouvre la version pdf du fichier tex sur lequel je travaille. Lors de son exécution, il divise la fenêtre, je voudrais l'empêcher de ce comportement dans cette situation particulière.
(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
rien, il ne se passe rien. Je ne comprends pas pourquoi. Si vous connaissez une personnalisation simple dans le.emacs
qui faitC-c C-v
fonctionner, je serais heureux de l'utiliser. Mon système d'exploitation est Windows et ma visionneuse PDF se trouve àC:\Program Files\SumatraPDF\sumatrapdf.exe
. Dans ce lien, lawlist a fourni un lien complet. Je ne souhaite que faire fonctionner TeX-viewer.TeX-view-program-list
.Réponses:
save-window-excursion
est une macro pour exécuter un morceau de code sans modifier la configuration de la fenêtre. Quelque chose comme ça devrait fonctionner:la source
save-window-excursion
, ce qui est presque identique à votre implémentation.save-window-excursion
etsave-window-configuration
. Il semble que les deux fonctionnent dans cette situation.save-window-excursion
utilise certaines meilleures pratiques de macro pour éviter d'introduire des variables dans l'environnement du corps. Ilsave-window-excursion
est également intégré à Emacs. Je cherchais cette macro, mais je ne l'ai pas trouvée, j'ai donc écrit ma propre version. Heureusement, bmag connaissait le vrai.Si vous souhaitez simplement lancer un processus en arrière-plan, vous n'avez pas besoin de toutes les cloches que les fonctions de commande de shell fournissent.
Au lieu de cela, vous pouvez utiliser la fonction
call-process
. Par exemple:Concrètement, cela signifie que vous pouvez implémenter votre commande comme:
la source
(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") )
. J'obtiens l'erreur `Mauvais argument de type: stringp, comint-output-filter`. Je ne sais pas si la syntaxe que j'ai utilisée est correcte.async-shell-command
tous ensemble. Cela devrait ressembler à quelque chose(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")))
.À utiliser
display-buffer-alist
avecdisplay-buffer-no-window
si vous utilisez Emacs 24.4 ou une version ultérieure.Vous pouvez également utiliser une manille :
la source
(setq display-buffer-alist '(("\`\\*Async Shell Command\\*\\'" display-buffer-no-window)))
l'erreurapply: Wrong type argument: sequencep, display-buffer-no-window
.display-buffer-no-window
oui , a été introduit dans Emacs 24.4, donc cela ne fonctionnera pas. Mon paquet devrait par contre fonctionner sur 24.3.display-buffer-no-window
est une troisième option, il suffit de l'insérer(defun display-buffer-no-window (_buffer alist) (when (cdr (assq 'allow-no-window alist)) 'fail))
dans votre configuration 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"))))
. Mais après l'exécutionmy-view-pdf
, emacs divise la fenêtre et*Async Shell Command*
s'affiche.