Next: , Up: プロセスからの出力の受信   [Contents][Index]


39.9.1 プロセスのバッファー

プロセスは関連付けられたバッファー(associated buffer)をもつことができます(通常はもつ)。これは普通のEmacsバッファーであり、2つの目的のために使用されます。1つはプロセスからの出力の格納、もう1つはプロセスをkillする時期を判断するためです。通常の習慣では任意の与えられたバッファーにたいして関連付けられるプロセスは1つだけなので、処理対象のプロセスを識別するためにそのバッファーを使用することもできます。プロセス使用の多くはプロセスに送信する入力を編集するためにもこのバッファーを使用しますが、これはEmacs Lispの組み込みではありません。

デフォルトでは、プロセスの出力は関連付けられたバッファーに挿入されます(カスタムフィルター関数の定義により変更可能。プロセスのフィルター関数を参照)。出力を挿入する位置はprocess-markにより決定されます。これは正に挿入されたテキストの終端にポイントを更新します。通常(常にではない)はprocess-markはバッファーの終端になります。

プロセスに関連付けられたバッファーをkillすることによりプロセスもkillされます。そのプロセスのprocess-query-on-exit-flagが非nilなら、Emacsはまず確認を求めます(exit前の問い合わせを参照)。この確認は関数process-kill-buffer-query-functionにより行われて、これはkill-buffer-query-functionsから実行されます(バッファーのkillを参照)。

Function: process-buffer process

この関数は指定されたprocessの関連付けられたバッファーをリターンする。

(process-buffer (get-process "shell"))
     ⇒ #<buffer *shell*>
Function: process-mark process

この関数はprocessにたいするプロセスマーカーをリターンする。これはプロセスからの出力をどこに挿入するかを示すマーカー。

processがバッファーをもたなければ、process-markは存在しない場所を指すマーカーをリターンする。

デフォルトのフィルター関数はプロセス出力の挿入場所の決定にこのマーカーを使用して、挿入したテキストの後にポイントを更新する。連続するバッチ出力が連続して挿入されるのはこれが理由。

カスタムフィルター関数はこのマーカーを通常は同じ方式で使用すること。process-markを使用するフィルター関数の例はProcess Filter Exampleを参照のこと。

ユーザーにプロセスバッファー内でプロセスに送信するための入力を期待する際には、プロセスマーカーは以前の出力から新たな入力を区別する。

Function: set-process-buffer process buffer

この関数はprocessに関連付けられたバッファーにbufferをセットする。buffernilならプロセスはバッファーに関連付けられない。非nilなら、bufferの終端ポイントにプロセスマークがセットされる。

Function: get-buffer-process buffer-or-name

この関数はbuffer-or-nameで指定されるバッファーに関連付けられた、削除されていないプロセスをリターンする。そのバッファーに複数のプロセスが関連付けられている場合には、この関数はいずれか1つ(現在のところもっとも最近作成されたプロセスだがこれを期待しないこと)を選択する。プロセスの削除(delete-processを参照)により、そのプロセスはこの関数がリターンするプロセスとしては不適格となる。

同一のバッファーに複数のプロセスを関連付けるのは、通常は悪いアイデアである。

(get-buffer-process "*shell*")
     ⇒ #<process shell>

プロセスのバッファーをkillすることにより、SIGHUPシグナルでサブプロセスをkillしてプロセスを削除する(プロセスへのシグナルの送信を参照)。

プロセスのバッファーがウィンドウに表示されている場合には、プロセスが出力をスクリーンのサイズに適応させるのと同様に、Lispプログラムでウィンドウのサイズにプロセス出力を適応させるようにプロセスに指示したいと思うでしょう。以下の関数によりプロセスにたいしてこの種の情報をやり取りできます。しかしすべてのシステムが基礎となる機能をサポートする訳ではないので、コマンドライン引数や環境変数を通じたフォールバックを提供するのが最良です。

Function: set-process-window-size process height width

processにたいして、その論理ウィンドウサイズが文字単位でwidthheightのサイズであることを告げる。関数がこの情報をプロセスとやり取りすることに成功したらt、それ以外はnilをリターンする。

プロセスに関連付けられたバッファーを表示するウィンドウがサイズを変更された際には、影響を受けるプロセスはその変更にたいして通知される必要があります。デフォルトではウィンドウ構成(window configuration)が変更されると、ウィンドウにバッファーが表示されている各プロセスにかわり、プロセスのバッファーを表示するすべてのウィンドウのうち最小のサイズのウィンドウを引数として、Emacsが自動的にset-process-window-sizeを呼び出します。これはバッファーが少なくとも1つのウィンドウに表示されているプセスそれぞれにたいして、変数window-adjust-process-window-size-functionの値である関数を呼び出すように指定するwindow-configuration-change-hook (ウィンドウのスクロールと変更のためのフックを参照)を通じて機能します。この変数をセットすることにより、この振る舞いをカスマイズできます。

User Option: window-adjust-process-window-size-function

この変数の値はプロセスとプロセスのバッファーを表示するウィンドウのリストという2つの引数を受け取る関数であること。その関数が呼び出される際には、そのプロセスのバッファーがカレントバッファーとなる。関数はset-process-window-sizeの呼び出しを通じて渡される論理プロセスウィンドウ(logical process window)を記述するコンスセル(width . height)をリターンすること。関数はnilをリターンすることもでき、Emacsはこの場合にはそのプロセスにたいしてset-process-window-sizeを呼び出さない。

この変数にたいしてEmacsは2つの事前定義された値を提供する。1つはwindow-adjust-process-window-size-smallestであり、これはプロセスのバッファーを表示するウィンドウのすべてのサイズから最小のサイズもう1つのwindow-adjust-process-window-size-largestは最大のサイズをリターンする。より複雑な方式には独自の関数を記述すること。

この変数はバッファーローカルにできる。

プロセスがadjust-window-size-functionプロパティ(プロセスの情報を参照)をもつ場合には、その値はwindow-adjust-process-window-size-functionのグローバル値とバッファーロール値をオーバーライドします。