バッファをポップアップせずにバックグラウンドで非同期プロセスを実行するにはどうすればよいですか?


23

async-shell-command.emacs を使用して非同期バックグラウンドプロセスを実行する関数をいくつか定義しましたが、コマンドを実行するたびに新しいウィンドウ(フレームではない)が作成され、プロセスのバッファーが表示されます。「ポップアップ」バッファなしでコマンドを実行するにはどうすればよいですか?

回答:


21

バックグラウンドプロセスはで開始できますがstart-process、これはバッファをポップアップしないはずです。

(start-process "process-name" "buffer-name" "program")

プロセス名は必要に応じて重複しないように変更されていますので、心配する必要はありません。将来のデバッグに役立つ名前を付けてください!

を指定する"buffer-name"と、バッファが作成されますが、すぐには表示されません。これは、プロセスの管理や出力の確認に便利です。バッファーをまったく作成したくない場合はnil、バッファー名として渡します。

(start-process "process-name" nil "program")

start-processsudoコマンドに使用できますか?通話を折り返そうとしstart-processました(let ((default-directory "/sudo::")) ... )が、うまくいきませんでした。
sid-kap

@ sid-kap:わかりません。あなたはおそらくそれを独立した質問として尋ねるべきです。
ティコンジェルビス16

1
"program"この場合、プログラム名(nautilus、caja、firefoxなど)のみ"arg1 arg2 ..."であり、の4番目の位置引数にある必要がありstart-processます。私はドキュメントを読んでそれを理解しました:)
biocyberman

8

Tikhonが述べ(start-process)たように、進むべき道です。バッファを作成したくないが、それでもバックグラウンドプロセスステータスに反応したい場合は、を使用することもできます(set-process-sentinel)。これは、projectorパッケージから取った変更された例です。

(set-process-sentinel (start-process "process-name" nil "command") #'output-message-sentinel)

(defun output-message-sentinel (process msg)
  (when (memq (process-status process) '(exit signal))
    (message (concat (process-name process) " - " msg))))

Emacs関数の説明から:

(set-process-sentinel PROCESS SENTINEL)

Give PROCESS the sentinel SENTINEL; nil for default.
The sentinel is called as a function when the process changes state.
It gets two arguments: the process, and a string describing the change.

プロセス上のGNUマニュアルページ詳細はかなり良いです。


set-process-sentinelもう少し正確に説明してください。プロセスを管理する機能を持つという一般的なアイデアは得られますが、すべての詳細を完全に理解しているわけではありません。ありがとう!
ティコンジェルビス14

実行しM-x describe-functionて入力set-process-sentinelすると、Emacsのドキュメントから簡単な答えが得られます。デフォルトではnil。センチネルは、プロセスの状態が変化したときに関数として呼び出されます。プロセスと、変更を説明する文字列の2つの引数を取得します。
waymondo 14

1
SentinelsProcessesGNU Emacsのマニュアルページは、実際にはより詳細な情報を得るのに非常に適しています。
waymondo 14

クール。おそらくあなたはあなたの答えにリンクを編集できますか?私は1つもよりちょうど使用して学ぶことができると思いますC-h f...
Tikhon Jelvis

2

非同期コマンドの実行方法を変更する必要はありません。Emacsには、単一のデータ構造を変更することにより、バッファがポップアップする場所またはポップアップを制御できる汎用機能がありますdisplay-buffer-alist

以下のソリューションでは、アクション関数display-buffer-no-window(つまり、ポップアップなし)が、名前が始まる任意のバッファーに関連付けられるように設定されていることがわかります(*Asynchronous Shell Command*複数の作成を要求された場合、emacsは増分サフィックスを追加します)。

他の使用可能な表示オプションのリストを表示するには、C-h f display-buffer「アクション関数」のリストを入力して探します。

;; Buffers that I don't want popping up by default
(add-to-list 'display-buffer-alist
  '("\\*Async Shell Command\\*.*" display-buffer-no-window))
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.