アクション関数(action
function)とはバッファーを表示するウィンドウを選択するためにdisplay-buffer
が呼び出す関数です。アクション関数はbuffer
(表示するバッファー)、およびalist (アクションalist、バッファー表示用のアクションalistを参照)という2つの引数を受け取ります。これらの関数は成功時にはbufferを表示するウィンドウ、失敗時にはnil
をリターンします。
以下の基本的なアクション関数がEmacsで定義されています。
この関数は選択されたウィンドウ内にbufferの表示を試みる。選択されたウィンドウがミニバッファーウィンドウや他のバッファー専用(専用のウィンドウを参照)の場合には失敗する。alistに非nil
のinhibit-same-window
エントリーがある場合にも失敗する。
この関数はすでにbufferを表示しているウィンドウを探すことによりバッファーの表示を試みる。選択されたフレーム上のウィンドウは別フレーム上のウィンドウより優先される。
alistに非nil
のinhibit-same-window
エントリーがある場合には、選択されたウィンドウは再利用に適さない。bufferをすでに表示しているウィンドウを検索するフレームセットは、アクションalistのreusable-frames
エントリーで指定できる。alistにreusable-frames
エントリーが含まれる場合には、この関数は選択されたフレームだけを検索する。
この関数が他のフレーム上のウィンドウを選択した場合には、そのフレームを可視にするとともに、alistがinhibit-switch-frame
エントリーを含んでいなければ、必要ならそのフレームを最前面に移動(raise)する。
この関数は与えられたモードですでにbufferを表示しているウィンドウを探すことによりバッファーの表示を試みる。
alistがmode
エントリーを含んでいれば、その値がメジャーモード(シンボル)、またはメジャーモードのリストを指定する。alistにmode
エントリーが含まれていなければ、かわりにbufferのカレントのメジャーモードが使用される。このように指定されたモードのいずれかから継承されたモードでバッファーを表示しているウィンドウは候補となる。
display-buffer-reuse-window
のように関数の挙動はinhibit-same-window
、reusable-frames
、inhibit-switch-frame
にたいするalistエントリーによっても制御される。
この関数は、最大もしくはもっとも長い間参照されていないウィンドウ(通常は選択されたフレームに配置されている)を分割することによりbufferの表示を試みる。これは実際には、split-window-preferred-function
(バッファー表示の追加オプションを参照)内で指定された関数を呼び出すことにより分割を行う。
新たなウィンドウのサイズはalistにエントリーwindow-height
とwindow-width
を与えることにより調整できる。alistにpreserve-size
エントリーが含まれていれば、Emacsは将来のリサイズ操作の間に新たなウィンドウのサイズの維持も試みる(ウィンドウサイズの保持を参照)。
この関数は分割可能なウィンドウがなければ失敗する。これの多くは、分割を許容するのに十分大きいウィンドウがない場合に発生する。この問題にたいしてはsplit-height-threshold
やsplit-width-threshold
に小さい値をセットすることが助けになるかもしれない。選択されたフレームがフレームパラメーターunsplittable
をもつ場合にも分割は失敗する。バッファーのパラメーターを参照のこと。
この関数はbufferを以前に表示したウィンドウにbufferの表示を試みる。
alistに非nil
のinhibit-same-window
エントリーが含まれる場合には、選択されたウィンドウは使用に適さない。専用ウィンドウ(dedicated
window)は、すでにbufferを表示済みの場合のみ使用可能。alistにprevious-window
エントリーが含まれる場合には、そのエントリーで指定されるウィンドウが以前にbufferを表示したことがなくても、そのウィンドウが使用される。
alistにreusable-frames
エントリー(バッファー表示用のアクションalistを参照)が含まれる場合には、その値が適切なウィンドウを検索するフレームを決定する。この関数はalistにreusable-frames
エントリーが含まれず、display-buffer-reuse-frames
とpop-up-frames
がいずれもnil
なら選択されたフレームのみ、いずれかが非nil
ならカレント端末上のすべてのフレームを検索する。
これらのルールに照らして1つ以上のウィンドウが使用に適している場合には、この関数は以下の優先順にしたがって選択を行う:
previous-window
エントリーで指定されるウィンドウが選択されたウィンドウでなければそのウィンドウ。
previous-window
エントリーで指定されているか、あるいは以前にbufferを表示していれば選択されたウィンドウ。
この関数は既存のウィンドウを選んでそのウィンドウにバッファーを表示することによってbufferの表示を試みる。まずalistのlru-frames
エントリーによって指定されたすべてのフレームにおいて最近使用されていないウィンドウ(ウィンドウのサイクル順を参照)を探す(そのようなエントリーが存在しなければ選択されたウィンドウにフォールバック)。alistのwindow-min-width
エントリーとwindow-min-height
エントリーに指定された制約を満足するようなウィンドウも優先される(window-min-width
エントリーがなければfull-widthのウィンドウを優先)。最後にalistのlru-time
エントリーで指定された値より長い使用時間のウィンドウは除外する。
最近使用されていないウィンドウが見つからなければ、この関数は別のウィンドウ(可視なフレーム上のなるべく大きいウィンドウを優先)の使用を試みる。ウィンドウがすべて別のバッファー専用(専用のウィンドウを参照)の場合には失敗するかもしれない。
上記はsome-window
のalistエントリーがlru
、あるいはデフォルトのnil
の場合の挙動について説明している。他に指定できる値はmru
であり、たとえばdisplay-buffer-base-action
が(nil . ((some-window . mru)))
にカスタマイズされている場合には、この関数はもっとも最近使用したウィンドウを優先する。これにより同一ウィンドウで連続してdisplay-buffer
を呼び出して複数のバッファーを表示することができる。ユーザーが参照したいウィンドウが3つ以上ある場合の構成を考えてみよう。このユーザーは選択されていないウィンドウにおいて、複数バッファーに分散しているクエリー結果を順次参照したいものとする。lru
ストラテジー(strategy:
戦略)では、display-buffer-use-some-window
呼び出しのたびに最近もっとも使用されていないウィンドウが変化するので、Emacsが継続的に別のウィンドウを選ぶ必要が生じるかもしれない。ストラテジーがmru
なら選ばれるウィンドウは常に同じままなので、予測可能なユーザーエクスペリエンスが得られるだろう。
この関数はdisplay-buffer-use-some-window
と似ているが、より厳格に最近使用されたウィンドウを使用しないよう試みる。特に選択されたウィンドウを使用することはない。更に加えてまず既にbufferを表示しているウィンドウの再利用を試み、次に別のバッファーを表示しているウィンドウの使用時間だけにもとづいてそのウィンドウを使用すべきかどうかを判断、それでも利用可能なウィンドウが見つからなければ新たなウィンドウをポップアップする。
最後にこの関数は以降の呼び出しでそのウィンドウに別のバッファーを表示することを避けるために、リターンするウィンドウの使用時間(ウィンドウの選択を参照)を増加させる。この関数を使って複数のバッファーを順に表示したいアプリケーションは、alistのlru-time
に初期値として選択されたウィンドウの使用時間をセットして提供することによって、この関数を支援することができる。この関数は呼び出されるごとにリターンするウィンドウの使用時間をより長い使用時間に増加することによって、以降の呼び出しでは以前にリターンしたウィンドウの使用を回避する。
この関数はalistで指定した位置でbufferの表示を試みる。この目的のために、alistには値がleft
、above
(かup
)、right
、below
(かdown
)のいずれかであるようなdirection
エントリーを含めること。それ以外の値は通常はbelow
と解釈される。
alistにwindow
エントリーも含まれている場合には、その値は参照ウィンドウ(reference
window)を指定する。値には選択されたフレームのメインウィンドウ(サイドウィンドウのオプションと関数を参照)を意味するmain
、選択されたフレームのルートウィンドウ(ウィンドウとフレームを参照)を意味するroot
のような特別なシンボルを指定できる。任意の有効なウィンドウの指定も可能。それ以外の値(またはwindow
エントリーを完全に省略)は参照ウィンドウとして選択されたウィンドウを使用することを意味する。
この関数は、指定方向ですでにbufferを表示しているウィンドウの再利用を試みる。そのようなウィンドウが存在しなければ、指定方向に新たなウィンドウを生成するために参照ウィンドウの分割を試みる。これも同様に失敗したら指定方向にある既存ウィンドウにbufferの表示を試みる。いずれの場合でもdirection
エントリーで指定された参照ウィンドウ側に、少なくとも1辺を参照ウィンドウと共有したウィンドウが選ばれることになる。
参照ウィンドウが生きたウィンドウなら、選択されるウィンドウのエッジはdirection
エントリーで指定された方向と反対側が共有される。たとえばdirection
エントリーの値がleft
なら、選択されるウィンドウの右エッジ座標は、参照ウィンドウの左エッジ座標と等しくなる(座標とウィンドウを参照)。
参照ウィンドウが内部ウィンドウなら、再利用されるウィンドウはdirection
エントリーで指定されるエッジが共有されなければならない。したがって、たとえば参照ウィンドウがフレームのルートウィンドウ、direction
エントリーの値がleft
なら、再利用されるウィンドウはフレームの左側でなければならない。これは選択されるウィンドウと参照ウィンドウの左エッジ座標が等しいことを意味する。
しかし新たなウィンドウは選択したウィンドウが参照ウィンドウの反対側エッジを共有するように参照ウィンドウを分割して作成される。上記の例では参照ウィンドウを子ウィンドウとして、新たな生きたウィンドウと共にルートウィンドウが新たに作成される。選択されたウィンドウの右エッジ座標は、参照ウィンドウの左エッジ座標、左エッジ座標はフレームのルートウィンドウの左エッジ座標と等しくなる。
direction
エントリーにたいする特別な4つの値leftmost
、top
、rightmost
、bottom
では参照ウィンドウとして選択されたフレームのメインウィンドウを暗黙に指定できる。これはたとえば(direction . left) (window . main)
のかわりに、単に(direction . leftmost)
と指定することができることを意味する。このような場合ではalistの既存のwindow
エントリーは無視される。
この関数は選択されたウィンドウの下のウィンドウ内にbufferの表示を試みる。選択されたウィンドウの下にすでにそのバッファーを表示するウィンドウがあれば、そのウィンドウを再利用する。
そのようなウィンドウが存在しなければ、この関数は選択されたウィンドウを分割することにより新たなウィンドウを作成してbufferの表示を試みる。alistに適切なwindow-height
かwindow-width
のエントリーが含まれていれば、ウィンドウのサイズ調整も試みる(上記参照)。
選択されたウィンドウの分割に失敗、かつ選択されたウィンドウの下に別のバッファーを表示中の非専用ウィンドウがある場合には、この関数はbufferの表示にそのウィンドウの使用を試みる。
alistにwindow-min-height
エントリーが含まれていると、この関数は少なくとも使用するウィンドウの高さがこのエントリーで指定された値になることを保証する。これは単なる保証であることに注意。使用するウィンドウを実際にリサイズするためには、alistで適切なwindow-height
エントリーも提供しなければならない。
この関数は選択されたフレームの最下にあるウィンドウ内にbufferの表示を試みる。
これはフレーム最下のウィンドウまたはフレームのルートウィンドウを分割、または選択されたフレーム最下の既存ウィンドウを試みる。
この関数は新たにフレームを作成して、そのフレームのウィンドウ内にバッファーを表示する。これは実際にはpop-up-frame-function
(バッファー表示の追加オプションを参照)内で指定された関数を呼び出すことによりフレーム作成の処理を行う。alistがpop-up-frame-parameters
エントリーを含む場合には、その連想値(associated
value)が新たに作成されたフレームのパラメーターに追加される。
この関数はカレントフレームの他のウィンドウをすべて削除して、フレーム全体を占めるようにバッファーを表示する。
この関数は選択されたフレームの既存の子フレーム、または子フレームを新たに作成してbufferの表示を試みる(子フレームを参照)。alistに非nil
のchild-frame-parameters
エントリーがあれば、対応する値が新たなフレームのフレームパラメーターのalistとして与えられる。デフォルトとして選択されたフレームを指定するparent-frame
パラメーターが提供される。その子フレームが別のフレームの子になる場合には、対応するエントリーをalistに追加しなければならない。
子フレームの外観はalistを通じて提供されるパラメーターに大きく依存する。子フレームが可視のままでいることを保証するために、少なくとも子フレームのサイズ(サイズのパラメーターを参照)と位置(位置のパラメーターを参照)を指定して比率(ratio)を使用すること、およびkeep-ratio
パラメーター(フレームとの相互作用のためのパラメーターを参照)の追加を推奨する。他に考慮すべきパラメーターについては子フレームを参照のこと。
この関数は述語を満足するフレーム(デフォルトは選択されたフレーム以外のフレーム)を探してbufferの表示を試みる。
この関数が他のフレーム上のウィンドウを選択した場合には、そのフレームを可視にするとともに、alistがinhibit-switch-frame
エントリーを含んでいなければ、必要ならそのフレームを最前面に移動(raise)する。
alistに非nil
のframe-predicate
エントリーがあれば、その値は1つの引数(フレーム)を受け取ってそのフレームが候補なら非nil
をリターンする、デフォルトの述語を置き換える関数。
alistに非nil
のinhibit-same-window
エントリーがある場合には選択されたウィンドウは使用しない。したがって選択されたフレームに単一のウィンドウしかなければ使用しない。
この関数はalistに非nil
のallow-no-window
エントリーがあればbufferを表示せずにシンボルfail
をリターンする。この構成はアクション関数がnil
かbufferを表示するウィンドウをリターンするという慣習の唯一の例外である。alistにそのようなallow-no-window
エントリーがなければ、この関数はnil
をリターンする。
この関数がfail
をリターンした場合には、display-buffer
はそれ以上のディスプレイアクションをスキップして即座にnil
をリターンする。この関数がnil
をリターンした場合には、display-buffer
はもしあれば次のディスプレイアクションを継続する。
display-buffer
の呼び出し側が非nil
のallow-no-window
エントリーを指定した場合には、nil
のリターン値の処理も可能とみなされる。
他の2つのアクション関数display-buffer-in-side-window
とdisplay-buffer-in-atom-window
については、それぞれ適正なセクションで説明します(サイドウィンドウへのバッファーの表示とアトミックウィンドウを参照)。