シェルコマンドを完全にサイレントにする方法(ウィンドウを分割したり、新しいフレーム/ウィンドウを開いたりするのを防ぐ)


8

シェルコマンドをサイレントで(バックグラウンドで)実行することは可能ですか?を使用するとasync-shell-command、emacsがウィンドウを分割します。特定のシェルコマンドが完全にバックグラウンドで実行されるようにしたい(視覚効果なし)。

明示的な例として、次のコードがあります(https://emacs.stackexchange.com/a/7932から借用)。作業中のtexファイルのPDFバージョンを開きます。それを実行すると、ウィンドウが分割されます。この特定の状況では、この動作を防止します。

 (defun my-view-pdf ()
  (interactive)
  (async-shell-command
    (concat "SumatraPDF " (file-name-base (buffer-file-name)) ".pdf")))

3
抽象的質問ではなく、特定のユースケース:AUCTeXを使用していますか?TeX-viewC-c C-v)を使用していない特別な理由はありますか?
ダン

@ダン問題は、私がC-c C-v何もしないと何も起こらないことです。理由がわかりません。.emacsC-c C-v動作させるの簡単なカスタマイズを知っているなら、私はそれを使って喜んでいます。私のOSはWindowsで、pdfビューアはにありC:\Program Files\SumatraPDF\sumatrapdf.exeます。そのリンクでは、法律家が包括的なリンクを提供しています。TeX-viewerを動作させることにのみ興味があります。
2015

Windowsではないので、なぜ問題が発生しているのかはわかりません。を使用してみてくださいTeX-view-program-list
ダン

この質問には非常に良い答えがあるので、これで締め切られるのは嫌です。しかし、これはこの質問の複製です:emacs.stackexchange.com/q/5553/115
Kaushal Modi

回答:


8

save-window-excursionウィンドウ構成を変更せずにコードを実行するためのマクロです。このようなものはうまくいくはずです:

 (defun my-view-pdf ()
  (interactive)
  (save-window-excursion
   (async-shell-command
     (concat "SumatraPDF " (file-name-base (buffer-file-name)) ".pdf"))))

すばらしいマクロです。あなたの解決策が機能することを確認しました。
名前

2
@legoscia探してsave-window-excursionいたは、実装とほぼ同じです。
bmag 2015

@bmag私はとの違いについて知って興味を持っていますsave-window-excursionsave-window-configuration。どちらもこの状況で機能するようです。
名前

1
@名前違いはありませんsave-window-excursionが、身体の環境への変数の導入を回避するためにいくつかのマクロのベストプラクティスを使用します。また、save-window-excursionEmacsに組み込まれています。そのマクロを探していましたが、見つかりませんでしたので、独自のバージョンを作成しました。幸い、bmagは本物を知っていました。
レゴシア2015

8

バックグラウンドでプロセスを起動したいだけの場合は、シェルコマンド関数が提供するすべてのベルホイッスルは必要ありません。

代わりに、関数を使用できますcall-process。例えば:

(call-process
 "a_command"
 nil
 0                                  ; <- Discard and don't wait
 nil
 "arg1"
 "arg2")

具体的には、これは次のようにコマンドを実装できることを意味します。

(defun my-view-pdf ()
    (interactive)
    (call-process "SumatraPDF" nil 0 nil
                  (concat (file-name-base (buffer-file-name)) ".pdf")))

私の特定の例(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") )にあなたの提案を適用しようとしましたが、エラー `Wrong type argument:stringp、comint-output-filter`が発生しました。使用した構文が正しいかどうかはわかりません。
名前

あなたはasync-shell-commandすべて一緒にドロップする必要があります。のようなものでなければなりません(defun my-pdf-viewer () (interactive) (call-process "SumatraPDF" nil 0 nil (concat (file-name-base (buffer-file-name)) ".pdf"))
Lindydancer 2015

1
ありがとう、あなたの解決策は完全に機能し、括弧が欠けているだけだったので、正しいコードは次のようになります:(defun my-view-pdf () (interactive) (call-process "SumatraPDF" nil 0 nil (concat (file-name-base (buffer-file-name)) ".pdf")))
名前

@名前、ありがとう、具体的な関数を含めるように答えを更新しました。
Lindydancer、2015

7

Emacs 24.4以降を使用display-buffer-alistしているdisplay-buffer-no-window場合は、と一緒に使用してください。

(setq display-buffer-alist '(("\\`\\*Async Shell Command\\*\\'" display-buffer-no-window)))

または、シャックルを使用します。

(setq shackle-rules '(("*Async Shell Command*" :ignore t)))

使用し(setq display-buffer-alist '(("\`\\*Async Shell Command\\*\\'" display-buffer-no-window)))てエラーが発生しますapply: Wrong type argument: sequencep, display-buffer-no-window
2015

そうそうdisplay-buffer-no-window、これはEmacs 24.4で導入されたので機能しない。一方、私のパッケージは24.3で動作するはずです。
wasamasa 2015

バックポートdisplay-buffer-no-windowは3番目のオプション(defun display-buffer-no-window (_buffer alist) (when (cdr (assq 'allow-no-window alist)) 'fail))で、Emacs構成に挿入するだけです。
wasamasa 2015

最後のコメントをまとめてみました(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")))) 。しかし、を実行した後my-view-pdf、emacsはウィンドウを分割して表示*Async Shell Command*されます。
名前

私はあなたのソリューションがバージョン24.4以降で完全に機能することを確認しました。
名前
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.