--- title: Emacs内でのプロセス制御について author: kazu634 date: 2009-11-29 url: /2009/11/29/_1407/ wordtwit_post_info: - 'O:8:"stdClass":13:{s:6:"manual";b:0;s:11:"tweet_times";i:1;s:5:"delay";i:0;s:7:"enabled";i:1;s:10:"separation";s:2:"60";s:7:"version";s:3:"3.7";s:14:"tweet_template";b:0;s:6:"status";i:2;s:6:"result";a:0:{}s:13:"tweet_counter";i:2;s:13:"tweet_log_ids";a:1:{i:0;i:4955;}s:9:"hash_tags";a:0:{}s:8:"accounts";a:1:{i:0;s:7:"kazu634";}}' categories: - Emacs ---

Emacs-Lisp では、外部プログラムを二つの方法で呼び出すことが可能:

  1. 同期呼び出しで、起動した外部プロセスの終了を待つ方式
  2. 非同期呼び出しで、プロセスをバックグラウンドで起動してその終了を待たずに次の Emacs-Lisp ステップに進む方式

同期呼び出し

「call-process」を使うよ。使い方は:

(call-process プログラム &optional 入力ファイル 出力バッファ 表示 &rest 引数...)
(call-process "ls" nil t t "-lF" "~/")
プログラム
起動するプログラムを指定する
入力ファイル
起動プログラムの標準入力として与えるファイルを指定します
出力バッファ
起動プログラムが画面出力した内容を受け取るバッファを指定します。 t を与えるとカレントバッファを指定したことになります。 nil を与えると、すべての出力を捨てます。また、 0 を与えると、出力を捨て、かつ起動プログラムを Emacs の管轄から切り離して、プログラムの出力を待ちません
表示
non-nil を指定すると、起動プログラムからの出力がバッファに挿入されるごとに画面を更新します
引数
起動プログラムに与える引数を文字列で指定します

非同期呼び出し

「start-process」を使うよ。使い方は:

(start-process "プロセス名" バッファ プログラム &rest 引数)
(start-process "Search file" "*scratch*" "find" "/" "-name" "*.bak" "-ls")

このような形で用いると、 scratch バッファにfindのコマンド結果が出力される。 Emacs はプロセス名でコマンドを管理する。プロセスの状態を知りたいときは「process-status」を用いる。

非同期で実行したプロセスの状態が変化した時に呼び出される関数を「監視関数」と呼び、次の関数で設定します:

(set-process-sentinel プロセス 監視関数)

監視関数は少なくとも「プロセス」と「プロセスの状態」の二つを引数とします。

やさしいEmacs‐Lisp講座

やさしいEmacs‐Lisp講座