Ist es möglich, einen Shell-Befehl still (im Hintergrund) auszuführen? Wenn ich benutze async-shell-command
, teilen Emacs die Fenster. Ich möchte, dass ein bestimmter Shell-Befehl vollständig im Hintergrund ist (ohne visuellen Effekt).
Als explizites Beispiel habe ich den folgenden Code (ausgeliehen von https://emacs.stackexchange.com/a/7932 ). Es öffnet die PDF-Version der Tex-Datei, an der ich arbeite. Wenn es ausgeführt wird, wird das Fenster geteilt. Ich möchte dieses Verhalten in dieser speziellen Situation verhindern.
(defun my-view-pdf ()
(interactive)
(async-shell-command
(concat "SumatraPDF " (file-name-base (buffer-file-name)) ".pdf")))
TeX-view
(C-c C-v
) nicht verwenden ?C-c C-v
nichts tue, nichts passiert. Ich verstehe nicht warum. Wenn Sie eine einfache Anpassung kennen.emacs
, dieC-c C-v
funktioniert, würde ich sie gerne verwenden. Mein Betriebssystem ist Windows und mein PDF-Viewer befindet sich unterC:\Program Files\SumatraPDF\sumatrapdf.exe
. In diesem Link hat lawlist einen umfassenden Link bereitgestellt. Ich bin nur daran interessiert, dass TeX-Viewer funktioniert.TeX-view-program-list
.Antworten:
save-window-excursion
ist ein Makro zum Ausführen eines Codeteils, ohne die Fensterkonfiguration zu ändern. So etwas sollte funktionieren:quelle
save-window-excursion
, was fast identisch mit Ihrer Implementierung ist.save-window-excursion
und zu wissensave-window-configuration
. Es scheint, dass beide in dieser Situation funktionieren.save-window-excursion
einige Best Practices für Makros verwendet werden, um zu vermeiden, dass Variablen in die Umgebung des Körpers eingeführt werden. Auchsave-window-excursion
ist in Emacs eingebaut. Ich habe nach diesem Makro gesucht, es aber nicht gefunden, also habe ich meine eigene Version geschrieben. Zum Glück kannte bmag den echten.Wenn Sie nur einen Prozess im Hintergrund erzeugen möchten, benötigen Sie nicht alle Schnickschnack, die die Shell-Befehlsfunktionen bieten.
Stattdessen können Sie die Funktion verwenden
call-process
. Zum Beispiel:Konkret bedeutet dies, dass Sie Ihren Befehl wie folgt implementieren können:
quelle
(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") )
Ich erhalte die Fehlermeldung "Falsches Argument: stringp, comint-output-filter". Ich bin nicht sicher, ob die von mir verwendete Syntax korrekt ist.async-shell-command
alle zusammen fallen lassen. Es sollte so etwas wie sein(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")))
.Verwenden Sie
display-buffer-alist
mit dem ,display-buffer-no-window
wenn Sie auf Emacs 24.4 oder höher sind.Alternativ können Sie auch einen Schäkel verwenden :
quelle
(setq display-buffer-alist '(("\`\\*Async Shell Command\\*\\'" display-buffer-no-window)))
bekomme ich den Fehlerapply: Wrong type argument: sequencep, display-buffer-no-window
.display-buffer-no-window
wurde in Emacs 24.4 eingeführt, damit das nicht funktioniert. Mein Paket sollte dagegen am 24.3 funktionieren.display-buffer-no-window
ist eine dritte Option. Fügen Sie es einfach(defun display-buffer-no-window (_buffer alist) (when (cdr (assq 'allow-no-window alist)) 'fail))
in Ihre Emacs-Konfiguration ein.(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"))))
. Nach der Ausführungmy-view-pdf
teilt emacs das Fenster und*Async Shell Command*
wird angezeigt.