Next: , Previous: , Up: Display   [Contents][Index]


37.8 一時的な表示

一時的表示(temporary display)は出力をバッファーに配置して編集用ではなく閲覧用としてユーザーに示すためにLispプログラムにより使用されます。多くのヘルプコマンドはこの機能を使用します。

Macro: with-output-to-temp-buffer buffer-name body…

この関数はbuffer-nameという名前のバッファー(必要なら最初に作成される)にプリントされた任意の出力が挿入されるようアレンジ、さらにバッファーをHelpモードにしてbody内のフォームを実行する(類似する以下のフォームwith-temp-buffer-windowを参照)。最後にそのバッファーはいずれかのウィンドウに表示されるが、そのウィンドウは選択されない。

body内のフォームが出力バッファーのメジャーモードを変更しないため、実行の最後においても依然としてHelpモードにあるなら、with-output-to-temp-bufferは最後にそのバッファーを読み取り専用するとともに、クリック可能なクロスリファレンスとなるように関数名と変数名のスキャンも行う。特にドキュメント文字列内のハイパーリンク上アイテムに関する詳細はTips for Documentation Stringsを参照のこと。

文字列buffer-nameは一時的なバッファーを指定して、これはあらかじめ存在する必要はない。引数はバッファーではなく文字列でなければならない。そのバッファーは最初に消去されて(確認なし)、with-output-to-temp-bufferのexit後は未変更(unmodified)とマークされる。

with-output-to-temp-bufferstandard-outputを一時的バッファーにバインドしてbody内のフォームを評価する。body内のLisp出力関数を使用した出力のデフォルト出力先は、そのバッファーになる(しかしスクリーン表示やエコーエリア内のメッセージは一般的な世界の感覚では“出力”であるものの影響は受けない)。Output Functionsを参照のこと。

この構構文の振る舞いをカスタマイズするために利用できるフックがいくつかあり、それらは以下にリストしてある。

リターン値はbody内の最後のフォームの値。

---------- Buffer: foo ----------
 This is the contents of foo.
---------- Buffer: foo ----------

(with-output-to-temp-buffer "foo"
    (print 20)
    (print standard-output))
⇒ #<buffer foo>

---------- Buffer: foo ----------

20

#<buffer foo>

---------- Buffer: foo ----------
User Option: temp-buffer-show-function

この変数が非nilなら、with-output-to-temp-bufferはヘルプバッファーを表示する処理を行うためにその関数を呼び出す。この関数は表示すべきバッファーという1つの引数を受け取る。

with-output-to-temp-bufferが通常行うように、save-selected-window内部や選択されたウィンドウ内でバッファーか選択された状態でtemp-buffer-show-hookを実行するのは、この関数にとってよいアイデアである。

Variable: temp-buffer-setup-hook

このノーマルフックはbodyを評価する前にwith-output-to-temp-bufferにより実行される。フック実行時には一時的バッファーがカレントになる。このフックは通常はそのバッファーをHelpモードにするための関数にセットアップされる。

Variable: temp-buffer-show-hook

このノーマルフックは一時的バッファー表示後にwith-output-to-temp-bufferにより実行される。フック実行時には一時的バッファーがカレントになり、それが表示されているウィンドウが選択される。

Macro: with-temp-buffer-window buffer-or-name action quit-function body…

このマクロはwith-output-to-temp-bufferと類似している。with-output-to-temp-buffer構文と同様に、これはプリントされる任意の出力がbuffer-or-nameという名前のバッファーに挿入されるようにアレンジしてbodyを実行して、そのバッファーをいずれかのウィンドウに表示する。しかしwith-output-to-temp-bufferとは異なり、このマクロはそのバッファーを自動的にHelpモードに切り替えない。

引数buffer-or-nameは一時的バッファーを指定する。これはバッファー(既存でなければならない)、または文字列を指定でき、文字列の場合には必要ならその名前のバッファーが作成される。そのバッファーはwith-temp-buffer-windowのexit時には、未変更かつ読み取り専用とマークされる。

このマクロはtemp-buffer-show-functionを呼び出さない。かわりにそのバッファーを表示するためにaction引数をdisplay-buffer (Choosing Windowを参照)に渡す。

引数quit-functionが指定されていなければbody内の最後のフォームの値がリターンされる。指定されている場合には、そのバッファーを表示するウィンドウとbodyの結果という2つの引数で呼び出される。その場合には、最終的なリターン値は何であれquit-functionがリターンした値となる。

このマクロはwith-output-to-temp-bufferにより実行される類似フックのかわりにノーマルフックtemp-buffer-window-setup-hooktemp-buffer-window-show-hookを使用する。

次の2つの構文はwith-temp-buffer-windowとほとんど同じですが、説明している点が異なります:

Macro: with-current-buffer-window buffer-or-name action quit-function &rest body

このマクロはwith-temp-buffer-windowと同様だが、bodyの実行に際してbuffer-or-nameで指定したバッファーをカレントにする点が異なる。

Macro: with-displayed-buffer-window buffer-or-name action quit-function &rest body

このマクロはwith-temp-buffer-windowと同様だが、bodyの実行のbuffer-or-nameで指定したバッファーを表示する点が異なる。

一時的バッファーを表示するウィンドウは、以下のモードを使用してバッファーのサイズをフィットさせることができます:

User Option: temp-buffer-resize-mode

このマイナーモードが有効なときは、一時的バッファーを表示しているウィンドウはバッファーのコンテンツにフィットするように自動的にリサイズされる。

そのバッファーにたいして特別に作成されたウィンドウの場合のみウィンドウはリサイズされる。特に前に別のバッファーを表示していたウィンドウはリサイズされない。デフォルトではこのモードはリサイズにfit-window-to-bufferを使用する(Resizing Windowsを参照)。以下のオプションtemp-buffer-max-heighttemp-buffer-max-widthをカスタマイズして他の関数を指定できる。

User Option: temp-buffer-max-height

このオプションはtemp-buffer-resize-modeが有効な際に一時的バッファーを表示するウィンドウの最大高さ(行数)を指定する。その種のバッファーの高さ選択のために呼び出す関数でもよい。これはバッファーを唯一の引数として受け取り、正の整数をリターンすること。関数の呼び出し時にはリサイズされるウィンドウが選択される。

User Option: temp-buffer-max-width

このオプションはtemp-buffer-resize-modeが有効な際に一時的バッファーを表示するウィンドウの最大幅(列数)を指定する。その種のバッファーの高さ選択のために呼び出す関数でもよい。これはバッファーを唯一の引数として受け取り、正の整数をリターンすること。関数の呼び出し時にはリサイズされるウィンドウが選択される。

以下の関数は一時的な表示にカレントバッファーを使用します:

Function: momentary-string-display string position &optional char message

この関数はカレントバッファー内のpositionstringを瞬間表示(momentarily display)する。これはundoリストやバッファーの変更状態(modification status)に影響を与えない。

瞬間表示は次の入力イベントまで留まる。次の入力イベントがcharならmomentary-string-displayはそれを無視してリターンする。それ以外ならそのイベントは後続の入力として使用するためにバッファリングされる。つまりcharとタイプすると表示からその文字列を単に削除して、(たとえば) charではないC-fとタイプすると表示からその文字列を削除して、その後に(おそらく)ポイントを前方へ移動するだろう。引数charのデフォルトはスペース。

momentary-string-displayのリターン値に意味はない。

文字列stringがコントロール文字を含まなければ、before-stringプロパティでオーバーレイを作成(その後に削除)することで、同じことをより汎用的に行うことができる。Overlay Propertiesを参照のこと。

messageが非nilなら、バッファー内にstringが表示されている間はエコーエリアにそれが表示される。nilの場合のデフォルトは、継続するためにはcharをタイプするように告げるメッセージ。

以下の例では最初はポイントは2行目の先頭に置かれている:

---------- Buffer: foo ----------
This is the contents of foo.
∗Second line.
---------- Buffer: foo ----------

(momentary-string-display
  "**** Important Message! ****"
  (point) ?\r
  "Type RET when done reading")
⇒ t

---------- Buffer: foo ----------
This is the contents of foo.
**** Important Message! ****Second line.
---------- Buffer: foo ----------

---------- Echo Area ----------
Type RET when done reading
---------- Echo Area ----------