検索エンジンから来た人に注意このマニュアルは、Emacs ver. 19.x 向けのマニュアルを Mule 2.x の開発にあたり邦訳したものを、 電脳外道学会がミラーリングしているものであり、旧版製品パラノイアであるところの椅子人の趣味によるものです。しかしながら、現在の Emacs の主流は ver. 20 以降であり、ver 19.x と ver 20.x とでは、仕様の違いが少なからずあります。 したがって、一般的な Emacs ユーザーにとっては、
このマニュアルと実機の動作とが符合しない場合があります。
|
プロセス(process)とは、プログラムが実行できる空間を指すオ ペレーティング・システム用語です。Emacsは一つのプロセス内で動作しま す。Emacs Lispプログラムは、ほかのプログラムを独立したプロセスとし て起動できます。このようなプロセスは、Emacsプロセスのサブプ ロセス(subprocess)または子プロセス(child processと呼ばれ ます。Emacsプロセスは、これらのプロセスの親プロセス(parent process)になります。
Emacsのサブプロセスには、プロセスの作成方法によって、同期 (synchronous)と非同期(asynchronous)の2種類があります。同 期サブプロセスを作成すると、Lispプログラムは、そのサブプロセスが 終了するのを待ってから実行を再開します。非同期サブプロセスを作成 すると、そのサブプロセスはLispプログラムと並行して動作します。こ のようなサブプロセスは、Emacs内では、同様に"プロセス"と呼ばれ るLispオブジェクトとして表現されます。Lispプログラムは、このオブ ジェクトを使って、サブプロセスと通信したり、サブプロセスを制御で きます。たとえば、サブプロセスにシグナルを送ったり、ステータス情 報を取得したり、出力を受け取ったり、入力を送ることができます。
t
、そうでなければ
nil
を返します。
プログラムを実行するための新しいサブプロセスを作成する関数は三つ
あります。そのうちの一つであるstart-process
は、非同期プロ
セスを作成し、プロセス・オブジェクトを返します
(see section 非同期プロセスの作成)。後の二つのcall-process
と
call-process-region
は、同期プロセスを作成し、プロセス・オ
ブジェクトを返しません(see section 同期プロセスの作成)。
ここでは、同期プロセスと非同期プロセスについて説明します。三つの 関数はどれも同様に呼び出されるため、共通な引数についてはここで説 明します。
同期か非同期かにかかわらず、関数のprogram引数には、実行す
るプログラムを指定します。指定されたファイルが見つからない場合や、
ファイルの実行が不可能な場合は、エラーが通知されます。ファイ
ル名が相対的ならば、変数exec-path
が検索するディレクトリの
リストとして使われます。Emacsは、起動時に環境変数PATH
の値に基づい
てexec-path
を初期化します。`~'、`.'、
`..'のような標準のファイル名要素は通常どおり解釈されますが、
環境変数の置換(`$HOME'など)は認識されません。環境変数の置換
を行うには、substitute-in-file-name
を使ってください(see section ファイル名を展開する関数)。
どのサブプロセス作成関数にも、起動するプログラムの標準出力の行き
先を指定するbuffer-or-name引数があります。
buffer-or-nameがnil
ならば、フィルタ関数が処理しない
かぎり出力を破棄することを意味します(See section プロセス・フィルタ関数。また、
section Lispオブジェクトの読込みと印字)。複数のプロセスの出力を一つのバッファに送ると出
力が無作為に混ざってしまうため、通常は複数のプロセスの出力を同じ
バッファに送らないでください。
三つのサブプロセス作成関数のすべてに、&rest
引数の
argsがあります。argsはすべて文字列でなければならず、
各要素はそれぞれ独立したコマンド・ライン引数としてprogramに
渡されます。これらの文字列は指定されたプログラムに直接渡されるた
め、ワイルドカードなどのシェルの機能は使えません。
注意: program引数には、プログラムの名前だけを指定 します。この引数にはコマンド・ライン引数を含めないでください。コマ ンド・ライン引数は、argsを使って指定してください。
サブプロセスのカレント・ディレクトリは、default-directory
の値になります(see section ファイル名を展開する関数)。
サブプロセスは、Emacsから環境を引き継ぎます。ただし、
process-environment
を使って別の環境を指定することもできま
す。See section OS環境。
wakeup
プログラムは、このよう
なプログラムの例です。display-time
コマンドは、
wakeup
プログラムを使って、1分に1回通知を受けます。
nil
です。nil
は、デフォルトのディレクトリ
(default-directory
の値)を意味します。
program引数が絶対ファイル名でない場合、call-process
と
start-process
はexec-path
の値を使います。
Emacsは、同期プロセス(synchronous process)を作成した後、そ
のプロセスが終了するのを待ってから実行を再開します。Diredを起動
する場合がこの例です。 Emacsは、ls
を同期プロセスとして実
行し、その出力を少し変更します。プロセスが同期的であるため、
Emacsは、ディレクトリ一覧の全体がバッファに届いてから、バッファ
に対する操作を実行しようとします。
同期サブプロセスが終了するのをEmacsが待っている間、ユーザーは、
C-gを入力して中断できます。1回目のC-gは、サブプロセ
スをSIGINT
シグナルでkillしようとしますが、サブプロセスが
実際に終了するまで待ってから中断します。その間にユーザーが
C-gをもう一度入力した場合、サブプロセスはSIGKILL
で
即座にkillされ、すぐに中断されます。See section とりやめ。
バージョン18では、同期サブプロセス関数はnil
を返していまし
た。バージョン19では、同期サブプロセス関数はプロセスの終了状態を
返します。
infileがnil
でなければ、プロセスの標準入力には
infileが使われます。infileがnil
ならば、
`/dev/null'が標準入力になります。destination引数には、
プロセスの出力の行き先を指定します。destination引数の例を
次に示します。
t
nil
nil
ならばエラー出力を破棄し、
t
ならば標準出力にエラー出力を混合します。エラー出力をリダ
イレクトするには、リダイレクト先のファイル名の文字列を
error-destinationに指定します。
エラー出力が挿入されるバッファを直接指定することはできません。実
装するのが難しいためです。しかし、エラー出力をテンポラリ・ファイル
に送り、そのファイルをバッファに挿入すれば、同様のことを実現でき
ます。
displayがnil
ならば、call-process
は、出力が挿
入されるたびにバッファを再表示します。displayがnil
でなければ、call-process
は再表示を行なわず、結果が画面に表
示されるのはEmacsが通常のイベントでそのバッファを再表示したとき
だけになります。
残余引数のargsは、プログラムのコマンド・ライン引数を指定する 文字列です。
(プロセスの終了を待つように指定した場合)call-process
が返
す値は、プロセスが終了した理由を示します。値が数値の場合は、サブ
プロセスの終了ステータスを示します。0は成功で、それ以外の数値は
失敗を示します。プロセスがシグナルを受けて終了した場合、
call-process
は、そのシグナルを示す文字列を返します。
以下の例では、バッファ`foo'が現在のバッファであるとします。
(call-process "pwd" nil t) => nil ---------- Buffer: foo ---------- /usr/user/lewis/manual ---------- Buffer: foo ---------- (call-process "grep" nil "bar" nil "lewis" "/etc/passwd") => nil ---------- Buffer: bar ---------- lewis:5LTsHm66CSWKg:398:21:Bil Lewis:/user/lewis:/bin/csh ---------- Buffer: bar ----------
insert-directory
関数には、call-process
の使い方のよ
い例があります。
(call-process insert-directory-program nil t nil switches (if full-directory-p (concat (file-name-as-directory file) ".") file))
nil
でな
ければ、この関数は送ったテキストを削除します。この機能は、
bufferにt
を指定して出力を現在のバッファに挿入する場
合に役立ちます。
destination引数とdisplay引数は、サブプロセスからの出
力の処理方法と、出力が送られてきたときに表示を更新するかどうかを
指定します。詳細については、上記のcall-process
の説明を参
照してください。destinationが整数の0ならば、
call-process-region
は、サブプロセスが終了するのを待たずに、
出力を破棄して即座にnil
を返します。
残余引数のargsは、プログラムのコマンド・ライン引数を指定する 文字列です。
call-process-region
の戻り値はcall-process
の戻り値
と同様です。プロセスの終了を待たずに戻るように指定した場合は、
nil
が返されます。それ以外の場合は、サブプロセスの終了方法
を示す数値または文字列が返されます。
以下の例は、`foo'バッファの最初の5文字(`input')を標準
入力として、call-process-region
を使ってcat
ユーティ
リティを実行します。cat
は、標準入力を標準出力にコピーしま
す。destination引数にはt
を指定しているため、出力は
現在のバッファに挿入されます。
---------- Buffer: foo ---------- input-!- ---------- Buffer: foo ---------- (call-process-region 1 6 "cat" nil t) => nil ---------- Buffer: foo ---------- inputinput-!- ---------- Buffer: foo ----------
shell-command-on-region
コマンドは、
call-process-region
を次のように使っています。
(call-process-region
start end
shell-file-name ; プログラムの名前。
nil ; リージョンを削除しません。
buffer ; 出力をbuffer
に送ります。
nil ; 出力中に再表示しません。
"-c" command) ; シェルの引数。
MS-DOSでは、同期サブプロセスとやりとりするデータがテキストかバイ ナリかを指定しなければなりません。テキスト・データの場合は、 Emacsで使われる行末記法(改行文字一つ)と、Emacs外で使われる行末記 法(CRLFの2文字)との間での変換が必要になります。
サブプロセスに送られる入力にはbinary-process-input
変数が
適用され、サブプロセスから受け取る出力には
binary-process-output
変数が適用されます。データがテキスト
でない場合は、これらの変数の値にnil
以外を指定します。デー
タがテキストであり、変換が必要な場合は、これらの変数にnil
を指定します。
nil
ならば、同期サブプロセスの入力の改行を
CRLFに変換します。
nil
ならば、同期サブプロセスの入力のCRLFを
改行にに変換します。
関連情報については、See section ファイルとMSDOS。
非同期プロセス(asynchronous process)が作成された後、Emacs
とLispプログラムはどちらも即座に実行を再開します。プロセスはその
時点からEmacsと並行に動作し、Emacsとプロセスは以下で説明する関数
を使って互いに通信できます。ここでは、start-process
による
非同期プロセスの作成方法について説明します。
残余引数のargsは、プログラムのコマンド・ライン引数を指定する 文字列です。
以下の例では、一つめのプロセスは起動して100秒間実行します(正確に は、sleepします)。その間、二つめのプロセスが起動され、一意性を保 つために`my-process<1>'という名前が与えられます。このプロセ スは、最初のプロセスが終了する前に、ディレクトリの一覧をバッファ `foo'の終端に挿入します。そして、二つめのプロセスが終了し、 そのことを示すメッセージがバッファに挿入されます。しばらく経って から、一つめのプロセスが終了し、そのことを示すメッセージがさらに バッファに挿入されます。
(start-process "my-process" "foo" "sleep" "100") => #<process my-process> (start-process "my-process" "foo" "ls" "-l" "/user/lewis/bin") => #<process my-process<1>> ---------- Buffer: foo ---------- total 2 lrwxrwxrwx 1 lewis 14 Jul 22 10:12 gnuemacs --> /emacs -rwxrwxrwx 1 lewis 19 Jul 30 21:02 lemon Process my-process<1> finished Process my-process finished ---------- Buffer: foo ----------
start-process
に似ていますが、指定されたコマンド
をシェルを使って実行する点が異なります。command引数がシェ
ル・コマンドの名前で、command-args引数がシェル・コマンドの
引数です。
nil
以外の場合、PTYが利用可能な
らばPTYが使われます。それ以外の場合は、パイプが使われます。
PTYの場合、ジョブ・コントロール(C-c、C-zなど)を 使ってプロセスやその子プロセスを制御できるのに対し、パイプはプロ セスの制御ができません。このため、Shellモードのようにプロセスが ユーザーから見える場合、通常はPTYが適しています。プログラム が内部的に使うプロセスの場合は、パイプの方がより効率的なため、通 常はパイプを使うのが適切です。また、多くのシステムではPTYの 総数が限られているため、PTYを浪費しないほうがよいでしょう。
start-process
が呼び出されると、
process-connection-type
の値が使われます。このため、
start-process
の呼び出しの周辺だけでこの変数を束縛すれば、
特定のサブプロセスとの通信方法を指定できます。
(let ((process-connection-type nil)) ; パイプを使います。 (start-process ...))
特定のサブプロセスがパイプとPTYのどちらを実際に使っているか
を調べるには、process-tty-name
関数を使います(see section プロセス情報)。
プロセスの削除(deleting a process)とは、Emacsをサブプロセ スから即座に切り離して、そのプロセスをアクティブなプロセスのリス トから削除することです。Emacsはサブプロセスを終了させるためにサ ブプロセスにシグナルを送りますが、サブプロセスが即座に終了すると はかぎりません。プロセス・オブジェクト自体は、ほかのLispオブジェクト がそのプロセス・オブジェクトを指しているかぎり存在し続けます。
プロセスはいつでも明示的に削除できます。プロセスは終了すると自動 的に削除されますが、終了してすぐに削除されるとはかぎりません。終了 したプロセスが自動的に削除される前にそのプロセスを削除しても害は ありません。
exit
の呼び出しまたはシグナルの受信によって)
終了したプロセスの自動削除を制御します。この変数がnil
なら
ば、ユーザーがlist-processes
を実行するまでプロセスは存在し
続けます。それ以外の場合は、プロセスは終了するとすぐに削除されま
す。
SIGHUP
シグナルでkillし、プロセスを削除します。name
引数には、プロセス、プロセスの名前、バッファ、バッファの名前のい
ずれかを指定できます。
(delete-process "*shell*") => nil
t
です。
(process-kill-without-query (get-process "shell")) => t
一部の関数はプロセスに関する情報を返します。対話的な用途のために、
list-processes
が用意されています。
nil
を返します。
(process-list) => (#<process display-time> #<process shell>)
nil
を返します。name
が文字列でなければ、エラーが発生します。
(get-process "shell") => #<process shell>
(process-command (get-process "shell")) => ("/bin/csh" "-i")
実際のサブプロセスの場合のステータス値の例を次に示します。
run
stop
exit
signal
open
closed
nil
(process-status "shell") => run (process-status (get-buffer "*shell*")) => run x => #<process xx<1>> (process-status x) => exit
ネットワーク接続の場合、process-status
は、シンボルの
open
またはclosed
を返します。closed
は、接続
の相手側が接続をクローズしたか、Emacsがdelete-process
を実
行したことを意味します。
以前のバージョン(バージョン19以前)のEmacsでは、ネットワーク接続
のステータスは、オープン状態ならばrun
、クローズ状態ならば
exit
でした。
process-status
の結果を使います)。
processがまだ終了していなければ、0が返されます。
nil
を返します(section 非同期プロセスの作成の
process-connection-type
を参照してください)。
Emacsが入力を非同期サブプロセスに送ると、非同期サブプロセスはそ の入力を受け取ります。非同期サブプロセスに入力を送るには、ここで 説明する関数を使います。関数には、入力の送信先のプロセスと、送信 する入力データを指定します。データは、サブプロセスの"標準入力" に置かれます。
一部のオペレーティング・システムでは、PTYの入力バッファの容 量が限られています。そのようなシステムでは、Emacsは送信するデー タ中にEOFを周期的に挿入し、入力データを強制的に読み取らせま す。 ほとんどのプログラムでは、このEOFによる悪影響はありま せん。
nil
ならば、
現在のバッファのプロセスが使われます。
この関数はnil
を返します。
(process-send-string "shell<1>" "ls\n") => nil ---------- Buffer: *shell* ---------- ... introduction.texi syntax-tables.texi~ introduction.texi~ text.texi introduction.txt text.texi~ ... ---------- Buffer: *shell* ----------
nil
ならば、現在のバッ
ファのプロセスが使われます)。
startとendのどちらかが現在のバッファ内での位置を示 す整数またはマーカーでなければ、エラーが発生します(どちらの値が 大きいかは無関係です)。
process-nameを指定しなかった場合や、process-nameが
nil
の場合は、この関数は現在のバッファのプロセスにEOF
を送ります。現在のバッファにプロセスがなければ、エラーが発生しま
す。
この関数はprocess-nameを返します。
(process-send-eof "shell") => "shell"
サブプロセスへのシグナルの送信(sending a signal)は、サブプ
ロセスの動作に割り込む方法の一つです。シグナルにはいくつかの種類
があり、それぞれ意味があります。シグナルとその名前は、オペレーティ
ングシステムで定義されています。たとえば、SIGINT
シグナル
は、ユーザーがC-cを入力したか、それに類似した状況が発生し
たことを意味します。
各シグナルは、サブプロセスに対して特定の影響があります。ほとんど のシグナルはサブプロセスをkillしますが、実行を停止させたり再開さ せるシグナルもあります。ほとんどのシグナルは、プログラムが処理す ることもできます。プログラムがシグナルを処理する場合、そのシグナ ルの一般的な意味が通用するとはかぎりません。
シグナルを明示的に送るには、ここで説明する関数を呼び出します。ま
た、Emacsは、次のような場合に自動的にシグナルを送ります。バッファ
をkillする場合は、そのバッファに関連付けられているプロセスすべて
にSIGHUP
シグナルを送ります。Emacsが終了する場合は、残って
いるプロセスすべてにSIGHUP
シグナルを送ります
(SIGHUP
は、通常はユーザーが電話回線を切断したことを示すシグ
ナルです)。
どのシグナル送信関数も、process-nameとcurrent-group の二つの省略可能引数を取ります。
process-name引数は、プロセス、プロセス名、nil
のいず
れかでなければなりません。この引数がnil
ならば、デフォルト
として現在のバッファに関連付けられているプロセスが使われます。
process-nameがプロセスを示していない場合は、エラーが発生し
ます。
current-group引数は、ジョブ・コントロール機能を持つシェル
をEmacsのサブプロセスとして実行している場合に意味を持つフラグで
す。 この引数がnil
以外ならば、Emacsがサブプロセスとの通信
に使っている端末の現在のプロセス・グループにシグナルが送られます。
プロセスがジョブコントロール可能なシェルならば、現在のプロセス・
グループはシェルの現在のサブジョブです。この引数がnil
なら
ば、Emacsの直接のサブプロセスのプロセス・グループにシグナルが送
られます。サブプロセスがジョブ・コントロール可能なシェルならば、
そのシェル自体にシグナルが送られます。
オペレーティング・システムはパイプの区別をサポートしていないため、
パイプを使ってサブプロセスと通信している場合、
current-groupフラグは意味を持ちません。同様の理由で、パイ
プを使っているときはジョブ・コントロール可能シェルはうまく動作し
ません。section 非同期プロセスの作成の
process-connection-type
を参照してください。
SIGINT
シグナルを送ることによってプロセス
process-nameに割り込みます。Emacsの外では、"割り込み文字"
(通常、C-cであるシステムとDEL
であるシステムがありま
す)を入力するとこのシグナルが送られます。current-group引数
がnil
以外の場合は、Emacsが端末で"C-cを入力する"こ
とによってサブプロセスと対話するための関数と考えることもできます。
SIGKILL
シグナルを送ることによって、プロセス
process-nameをkillします。このシグナルはサブプロセスを即座
にkillするため、サブプロセスがこのシグナルを処理することはできま
せん。
SIGQUIT
シグナルをプロセス
process-nameに送ります。このシグナルは、Emacsの外で"中断
文字" (通常はC-bまたはC-\)を入力したときに送られる
シグナルです。
SIGTSTP
シグナルを送ることによって、プロセス
process-nameを停止させます。プロセスの実行を再開するには、
continue-process
を使います。
ジョブ・コントロールがあるシステムでは、(Emacsの外で)"停止文字"
(通常はC-z)を入力すると、このシグナルが送られます。
current-groupがnil
以外の場合は、Emacsがサブプロセス
との通信に使っている端末で"C-zを入力する"関数と考えるこ
ともできます
SIGCONT
シグナルを送ることによって、プロセス
processの実行を再開します。この関数は、processがすで
に停止していることを仮定します。
サブプロセスがそれ自体の標準出力ストリームに書き込んだ出力を受け 取るには、二つの方法があります。一つは出力をバッファに挿入する方法 です。このバッファは、プロセスに関連付けられたバッファと呼ばれま す。もう一つの方法は、フィルタ関数(filter function)と呼ばれ る関数を出力に作用させる方法です。プロセスに対してバッファもフィ ルタ関数もない場合は、プロセスの出力は破棄されます。
プロセスには、関連付けられたバッファ(associated buffer)を 設定できます(通常はバッファが関連付けられています)。プロセスに関 連付けられたバッファは、プロセスからの出力の格納と、プロセスを killするタイミングの決定の二つの目的に使われる、通常のEmacsバッファ です。また、通常は一つのバッファには一つのプロセスしか関連付けられ ていないため、このバッファを使って、操作の対象となるプロセスを指 定できます。また、プロセスを利用する場合のほとんどは、プロセスに 送られる入力をこのバッファを使って編集しますが、この機能はEmacs Lispには組み込まれていません。
プロセスにフィルタ関数(see section プロセス・フィルタ関数)がなければ、プロ
セスの出力は関連付けられているバッファに挿入されます。出力が挿入
される位置は、process-mark
によって決まります。この変数は、
挿入後、挿入されたテキストの終端を指すように更新されます。通常は
(常にではありません)、process-mark
はバッファの終端です。
(process-buffer (get-process "shell")) => #<buffer *shell*>
processにバッファが関連付けられていなければ、
process-mark
は、どこも指さないマーカーを返します。
バッファにプロセスの出力を挿入するときは、このマーカーを使って挿 入位置が決定されます。また、このマーカーは、挿入されたテキストの 後を指すように更新されます。連続した出力が順番に挿入されるのはこ のためです。
通常のフィルタ関数では、出力がバッファに直接挿入されるときと同様
にこのマーカーを使ってください。フィルタ関数のよい例としては、こ
の項の終りにあるprocess-mark
を使ったフィルタ関数がありま
す。
プロセスとの通信用のバッファにユーザーが入力を行う場合、前回の出力 と新しい入力を区別するのにプロセス・マーカーが役立ちます。
nil
ならば、プロセ
スにはバッファは関連付けられません。
(get-buffer-process "*shell*") => #<process shell>
プロセスのバッファをkillするとそのプロセスは削除され、サブプロセ
スはSIGHUP
シグナルでkillされます(see section プロセスへのシグナルの送信)。
プロセスフィルタ関数(filter function)とは、関連付けられて いるプロセスからの標準出力を受け取る関数です。プロセスにフィルタ がある場合、そのプロセスからの出力のすべてがフィルタに渡 されます。プロセス・バッファは、フィルタがない場合だけ、プロセスか らの出力を直接受け取るために使われます。
フィルタ関数は、関連付けられているプロセスと文字列(プロセスの出 力)の二つの引数を取らなければなりません。この条件を満たせば、フィ ルタ関数は出力に対して任意の処理を行うことができます。
フィルタ関数は、Emacsが待機中のとき(たとえば、端末入力待ち、時間
の経過待ち、プロセスの出力待ちなど)だけ動作します。これによって、
ほかのLispプログラムの実行中に予期せぬタイミングでフィルタを実行
することによる問題を避けることができます。Emacsを明示的に待機状
態にしてフィルタ関数が実行されるようにするには、sit-for
、
sleep-for
(see section 時間の経過あるいは入力を待つ)、accept-process-output
(see section プロセスからの出力の受け取り)のいずれかを呼び出します。また、Emacs
は、コマンド・ループで入力を読み出しているときにも待機状態になり
ます。
通常、フィルタ関数内では中断は禁止されています。中断が禁止されて
いなければ、コマンド・レベルでのC-gの入力やユーザー・コマ
ンドの中断による影響を予測できなくなります。フィルタ関数内で中断
を有効にするには、inhibit-quit
にnil
を束縛してくだ
さい。See section とりやめ。
フィルタ関数の実行中に発生したエラーは自動的に捕捉されるため、
フィルタ関数が起動したときに動作していたプログラムの実行は停止し
ません。しかし、debug-on-error
がnil
以外ならば、エ
ラーの捕捉は行なわれません。これによって、Lispデバッガを使ってフィ
ルタ関数をデバッグできます。See section Lispのデバッガ。
多くのフィルタ関数は、フィルタ関数がないときのEmacsの動作をまね
て、ほとんどの場合テキストをプロセスのバッファに挿入します。この
ようなフィルタ関数において、バッファに確実に挿入できるようにする
ためには、set-buffer
を使わなければなりません。現在のバッ
ファを半永久的に設定しないようにするため、このようなフィルタ関数
では、unwind-protect
を使って、以前に現在のバッファとして
使われていたバッファを復元できるようにしなければなりません。また、
プロセス・マーカーを更新し、場合によってはポイントの値を更新しな
ければなりません。これらの作業の実現方法を次に示します。
(defun ordinary-insertion-filter (proc string) (let ((old-buffer (current-buffer))) (unwind-protect (let (moving) (set-buffer (process-buffer proc)) (setq moving (= (point) (process-mark proc))) (save-excursion ;; テキストを挿入し、プロセス・マーカーを移動します。 (goto-char (process-mark proc)) (insert string) (set-marker (process-mark proc) (point))) (if moving (goto-char (process-mark proc)))) (set-buffer old-buffer))))
save-excursion
に現在のバッファを復元させずに、
unwind-protect
を明示的に使っているのは、goto-char
によるポイントの変化を有効にするためです。
新しいテキストを受け取るたびにフィルタ関数がプロセス・バッファを強
制的に表示させるには、次に示す行をunwind-protect
の直前に
挿入してください。
(display-buffer (process-buffer proc))
以前のポイントの位置に関係なく、ポイントを新しい出力の終端に強制
的に移動するには、変数moving
を削除し、goto-char
を
無条件に呼び出してください。
以前のバージョンのEmacsでは、正規表現によく検索や照合を行うフィ ルタ関数は、必ず一致データを明示的に保存、復元しなければなりませ んでした。現在では、Emacsがこの作業を自動的に行ってくれるため、 フィルタ関数側で明示的に行う必要はなくなりました。See section 一致データ。
プロセスのバッファに出力を書き込むフィルタ関数は、バッファがまだ
有効かどうかをチェックしなければなりません。無効な(dead)バッファ
に出力を挿入しようとすると、エラーが発生します。バッファが無効で
ある場合、(buffer-name (process-buffer process))
は
nil
を返します。
フィルタ関数に渡される出力のひとまとまりのサイズは不定です。たと えば、出力を1行ごとに複製するプログラムが一度に200文字を送ってき たり、その次には40文字を5回送ってくることがあります。
nil
ならば、プロセスにはフィルタは設定
されません。
nil
を返します。
フィルタ関数の使い方の例を次に示します。
(defun keep-output (process output) (setq kept (cons output kept))) => keep-output (setq kept nil) => nil (set-process-filter (get-process "shell") 'keep-output) => keep-output (process-send-string "shell" "ls ~/other\n") => nil kept => ("lewis@slug[8] % " "FINAL-W87-SHORT.MSS backup.otl kolstad.mss~ address.txt backup.psf kolstad.psf backup.bib~ david.mss resume-Dec-86.mss~ backup.err david.psf resume-Dec.psf backup.mss dland syllabus.mss " "#backups.mss# backup.mss~ kolstad.mss ")
通常、非同期サブプロセスからの出力は、時間の経過や端末入力などの なんらかの外部イベントをEmacsが待っているときだけ到着します。し かし、出力が特定の時点で到着するようにLispプログラムから指定した り、プロセスからの出力が到着するまでLispプログラムが待機できると 便利なことがあります。
nil
以外ならば、この関数は、processから何らかの出力を受け取る
まで戻りません。
seconds引数とmillisec引数には、タイムアウトまでの時
間を指定できます。seconds引数には秒単位の時間を指定し、
millisec引数にはミリ秒単位の時間を指定します。二つの時間は
加算され、accept-process-output
は、サブプロセスからの出力
の有無にかかわらず、指定された時間が経過すると戻ります。
seconds引数は整数でなくてもかまいません。seconds引数 が浮動小数点数ならば、この関数は、小数点以下の秒数も含めて待機し ます。一部のシステムでは、秒数として整数値しかサポートしていませ ん。そのようなシステムでは、secondsは0に向かって丸められま す。小数点以下の秒数をサポートしていないシステムで millisecに0以外の値を指定すると、エラーが発生します。
整数でない秒数での待機をサポートしていないオペレーティングシステ ムもあります。そのようなシステムでは、millisecに0以外の値 を指定するとエラーが発生します。
accept-process-output
関数は、何らかの出力を受け取った場合
はnil
以外を返します。出力が到着する前にタイムアウト時間が
経過した場合は、nil
を返します。
プロセスの監視関数(process sentinel)とは、(Emacsから送られ るか、プロセス自体の動作によって発生した)シグナルによる終了、停 止、再開などの何らかの理由によって、関連付けられているプロセスの ステータスが変化するたびに呼び出される関数です。また、プロセスの 監視関数は、プロセスが終了するときにも呼び出されます。監視関数は、 イベントが発生したプロセスと、イベントの種類を示す文字列の二つの 引数を受け取ります。
イベントを示す文字列は次のいずれかのようになります。
"finished\n"
.
"exited abnormally with code exitcode\n"
.
"name-of-signal\n"
.
"name-of-signal (core dumped)\n"
.
監視関数は、(端末入力待ちや時間経過待ち、プロセスの出力待ちなど)
Emacsが待機中のときだけ動作します。ほかのLispプログラムの実行中
に予期せぬタイミングで監視関数が実行さえることによる問題を避ける
ことができます。Emacsを明示的に待機状態にして監視関数が実行され
るようにするには、sit-for
、sleep-for
(see section 時間の経過あるいは入力を待つ)、accept-process-output
(see section プロセスからの出力の受け取り)のいずれかを呼び出します。また、Emacs
は、コマンド・ループで入力を読み出しているときにも待機状態になりま
す。
通常、監視関数の中では中断は禁止されています。中断が禁止されて
いなければ、コマンド・レベルでのC-gの入力やユーザー・コマンドの
中断による影響を予測できなくなります。監視関数の中で中断を有効
にするには、inhibit-quit
にnil
を束縛してください。
See section とりやめ。
プロセスのバッファに出力を書き込む監視関数は、バッファがまだ有効
かどうかをチェックしなければなりません。無効な(dead)バッファに出
力を挿入しようとすると、エラーが発生します。バッファが無効である
場合、(buffer-name (process-buffer process))
は
nil
を返します。
監視関数の実行中に発生したエラーは自動的に捕捉されるため、見張り
番が起動したときに動作していたプログラムの実行は停止しません。し
かし、debug-on-error
がnil
以外ならば、エラーの捕捉
は行なわれません。これによって、Lispデバッガを使って監視関数をデバッ
グできます。See section Lispのデバッガ。
以前のバージョンのEmacsでは、正規表現によく検索や照合を行う見張 り番は、必ず一致データを明示的に保存、復元しなければなりませ んでした。現在では、Emacsがこの作業を自動的に行ってくれるため、 監視関数側で明示的に行う必要はなくなりました。See section 一致データ。
nil
ならば、プロセスの監視関数はなくなりま
す。監視関数がない場合、デフォルトでは、プロセスのステータス
が変化したときにプロセスのバッファにメッセージが挿入されます。
(defun msg-me (process event) (princ (format "Process: %s had the event `%s'" process event))) (set-process-sentinel (get-process "shell") 'msg-me) => msg-me (kill-process (get-process "shell")) -| Process: #<process shell> had the event `killed' => #<process shell>
nil
を返します。
nil
以外を返します。そうでない場合
は、nil
を返します。
トランザクションによるサブプロセスとのより便利な通信を行うには、
トランザクション待ち行列(transaction queue)を使います。ま
ず、tq-create
を使って、指定したプロセスとの通信を行うトラ
ンザクション待ち行列を作成します。次に、tq-enqueue
を呼び
出して、トランザクションを送ります。
questionは、トランザクションを開始する、こちら側からのメッ セージです。fn引数は、対応する応答が帰ってきたときに呼び出 される関数です。この関数は、closureと受け取った応答の二つの 引数で呼び出されます。
regexp引数は、応答全体だけに一致する正規表現です。
tq-enqueue
は、これを使って応答の終りを判断します。
tq-enqueue
自体の戻り値に意味はありません。
トランザクション待ち行列は、フィルタ関数を使って実装されています。 See section プロセス・フィルタ関数。
Emacs Lispプログラムは、同じマシンまたは別のマシンにあるほかのプ
ロセスへのTCPネットワーク接続をオープンできます。ネットワーク接
続は、Lispプログラムからはサブプロセスと同様に扱われ、プロセス・
オブジェクトで表現されます。しかし、通信相手のプロセスはEmacsプ
ロセスの子プロセスではないため、通信相手のプロセスをkillしたり、
シグナルを送ることはできません。できるのはデータの送受信だけです。
delete-process
は接続をクローズしますが、相手側のプロセス
をkillしません。接続のクローズへの対処は、相手側のプロセスが決定
しなければなりません。
ネットワーク接続を表現するプロセス・オブジェクトとサブプロセスを表
現するプロセス・オブジェクトを区別するには、process-status
を使います。この関数は、ネットワーク接続の場合は必ずopen
またはclosed
を返します。本当のサブプロセスの場合は、この二つの値のどちらも返しません。See section プロセス情報。
name引数は、プロセス・オブジェクトの名前を指定します。この名 前は、名前を一意にするために必要に応じて修正されます。
buffer-or-name引数は、接続が関連付けられるバッファです。接
続からの出力を処理するフィルタ関数を指定しなければ、接続からの出
力はこのバッファに挿入されます。buffer-or-nameがnil
ならば、接続はどのバッファにも関連付けられません。
host引数とservice引数は、接続先を指定します。 hostはホスト名(文字列)で、serviceは定義済みのネット ワーク・サービスの名前(文字列)またはポート番号(整数)です。
Go to the first, previous, next, last section, table of contents.