Lispプログラムでは、出力をバッファに格納し、編集ではなく閲覧用としてユーザーに提示するために、一時的な表示機能が利用されます。多くのヘルプコマンドがこの機能を利用しています。
この関数は、body 内のフォームを実行し、それらが出力する内容を、必要に応じて最初に作成される buffer-name という名前のバッファに挿入してヘルプモードに移行させます。(後述の同様のフォーム with-temp-buffer-window
を参照してください。)最後に、バッファがあるウィンドウに表示されますが、そのウィンドウが選択されることはありません。
body のフォームが出力バッファのメジャーモードを変更せず、実行終了時も Help
モードのままである場合、with-output-to-temp-buffer
はこのバッファを終了時に読み取り専用にし、さらに関数名や変数名をスキャンして、それらをクリック可能な相互参照に変換します。詳細については、ドキュメント文字列に関するヒント、特にドキュメント文字列内のハイパーリンクに関する項目を参照してください。
文字列 buffer-name
は一時バッファを指定するもので、あらかじめ存在している必要はありません。引数はバッファではなく文字列である必要があります。バッファは最初に(問答無用で)消去され、with-output-to-temp-buffer の終了後に未変更としてマークされます。
with-output-to-temp-buffer は standard-output を一時バッファにバインドし、次に body 内のフォームを評価します。body 内の Lisp
出力関数を用いた出力は、デフォルトでそのバッファに送られます(ただし、画面表示やエコーエリアのメッセージは、一般的な意味での「出力」ではありますが、影響を受けません)。出力関数 を参照してください。
この構文の挙動をカスタマイズするためのフックがいくつか用意されており、以下に列挙します。
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 ----------
この変数が nil 以外の場合、with-output-to-temp-buffer
はこれを関数として呼び出し、ヘルプバッファの表示処理を行わせます。この関数は、表示対象のバッファを1つの引数として受け取ります。
この関数は、save-selected-window
内で、選択したウィンドウとバッファが選択された状態で、通常 with-output-to-temp-buffer が動作するのと同様に temp-buffer-show-hook を動作させるのがよいでしょう。
この通常フックは、bodyを評価する前にwith-output-to-temp-bufferによって実行されます。フックが実行される際は、一時バッファがカレントとなります。通常、このフックはバッファをヘルプモードにするための関数で設定されます。
この通常フックは、一時バッファを表示した後に with-output-to-temp-buffer
によって実行されます。フックが実行される際、一時バッファがカレント状態となり、それが表示されていたウィンドウが選択されます。
このマクロはwith-output-to-temp-bufferに似ています。その構文と同様に、bodyを実行しつつ、出力内容をbuffer-or-nameという名前のバッファに挿入するよう処理し、そのバッファを何らかのウィンドウに表示します。ただし、with-output-to-temp-bufferとは異なり、そのバッファを自動的にヘルプモードに切り替えることはありません。
引数 buffer-or-name
は一時バッファを指定します。これは、既に存在している必要があるバッファか、あるいは文字列のいずれかであり、文字列の場合は必要に応じてその名前のバッファが作成されます。with-temp-buffer-window
が終了すると、バッファは未変更かつ読み取り専用としてマークされます。
このマクロは temp-buffer-show-function
を呼び出しません。代わりに、バッファを表示するために action 引数を display-buffer に渡します(バッファ表示用のウィンドウの選択 を参照)。
引数 quit-function が指定されていない限り、body の最後のフォームの値が返されます。指定された場合は、バッファを表示しているウィンドウと body の結果という2つの引数で呼び出されます。その際、最終的な戻り値は quit-function が返す値となります。
このマクロは、with-output-to-temp-buffer
によって実行される対応するフックの代わりに、通常のフック temp-buffer-window-setup-hook と temp-buffer-window-show-hook を使用します。
次に説明する2つの構成要素は、概ねwith-temp-buffer-windowと同一ですが、規定の通りそれとは異なります:
このマクロは with-temp-buffer-window
に似ていますが、それとは異なり、buffer-or-name で指定されたバッファを body の実行時にカレントにします。
一時バッファを表示するウィンドウは、以下のモードを使用してそのバッファのサイズに合わせることができます。
このマイナーモードを有効にすると、一時バッファを表示するウィンドウは、バッファの内容に合わせて自動的にリサイズされます。
ウィンドウがリサイズされるのは、そのウィンドウがバッファ用に特別に作成された場合に限られます。特に、以前に別のバッファを表示したことがあるウィンドウはリサイズされません。デフォルトでは、このモードではリサイズに
fit-window-to-buffer(ウィンドウのリサイズを参照)を使用します。以下のオプション temp-buffer-max-height および temp-buffer-max-width をカスタマイズすることで、別の関数を指定できます。
このオプションの効果は、display-buffer に対して適切な window-height、window-width、または
window-size のアクションアリストエントリを指定することで上書きできます(バッファ表示用のアクションアリストを参照)。
このオプションは、temp-buffer-resize-mode
が有効な際に一時バッファを表示するウィンドウの最大高さ(行数単位)を指定します。また、このようなバッファの高さを決定するために使用される関数を指定することも可能です。この関数はバッファを1つの引数として受け取り、正の整数を返す必要があります。関数が呼び出される時点で、サイズ変更対象となるウィンドウが選択されます。
このオプションは、temp-buffer-resize-mode
が有効な際に一時バッファを表示するウィンドウの最大幅(列数)を指定します。また、このようなバッファの幅を選択するために呼び出される関数を指定することも可能です。この関数はバッファを1つの引数として受け取り、正の整数を返す必要があります。関数が呼び出される時点で、サイズ変更対象のウィンドウが選択されます。
以下の関数は、現在のバッファを一時的な表示に使用します:
この関数は、現在のバッファの position に string を一時的に表示します。アンドゥリストやバッファの変更状態には影響しません。
一時的な表示は、次の入力イベントまで保持されます。次の入力イベントが char である場合、momentary-string-display
はそれを無視して戻ります。そうでない場合、そのイベントは後続の入力として使用するためにバッファに保持されます。したがって、char と入力すると単に文字列が表示から削除され、(例えば)C-f
と入力すると文字列が表示から削除され、その後(おそらく)ポイントが前方に移動します。引数 char
はデフォルトでスペースとなります。
momentary-string-display の戻り値は意味を持ちません。
文字列 string に制御文字が含まれていない場合は、before-string
プロパティを持つオーバーレイを作成(その後削除)することで、同様の処理をより汎用的な方法で実現できます。オーバーレイプロパティを参照してください。
message が nil
以外の場合、エコー領域に表示され、string はバッファに表示されます。nil の場合は、続行するには char
と入力するようにというデフォルトメッセージが表示されます。
この例では、pointは最初、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 ----------