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


29.3 ウィンドウの選択

それぞれのフレーム内において、常にただ1つのEmacsウィンドウがそのフレームで選択されている(selected within the frame)として指定されます。選択されたフレームにたいしてそのウィンドウは選択されたウィンドウ(selected window)と呼ばれます。選択されたウィンドウは編集のほとんどが行われるウィンドウであり、選択されたウィンドウに表示されるカーソルがあるウィンドウです(Cursor Parametersを参照)。テキストの挿入や削除を行うキーボード入力もそのウィンドウにたいして行われます。選択されたウィンドウのバッファーは、通常はset-bufferが使用された場合を除いてカレントバッファーでもあります(Current Bufferを参照)。選択されていないフレームでは、そのフレームが選択されたときはフレームで選択されていたウィンドウが選択されたウィンドウになります。

Function: selected-window

この関数は選択されたウィンドウをリターンする(これは常に生きたウィンドウ)。

以下の関数はウィンドウとそのフレームを明示的に選択します。

Function: select-window window &optional norecord

この関数はwindowを選択されたウィンドウにすることによりそのフレーム内で選択されたウィンドウとして、そのフレームを選択する。またwindowのバッファー(Buffers and Windowsを参照)をカレントにして、そのバッファーのpointの値(Window Pointを参照)をwindowwindow-pointの値にセットする。windowは生きたウィンドウでなければならない。リターン値はwindow

デフォルトではこの関数はwindowのバッファーをバッファーリストの先頭(Buffer Listを参照)に移動して、windowをもっとも最近選択されたウィンドウにする。オプション引数norecordが非nilなら、これらの追加処理は省略される。

加えてこの関数はデフォルトではwindowのフレームの次回再表示の際にwindowを更新するようにディスプレイエンジンに指示する。norecordが非nilなら、そのような更新は通常は行わない。しかしnorecordが特別なシンボルmark-for-redisplayと等しければ上述の追加アクションは省略されるが、それにも関わらずwindowの表示は更新される。

ウィンドウを選択することではウィンドウの表示やそのフレームをディスプレイ上の最上フレームにすることを満足しない場合があることに注意。さらにそのフレームのレイズやフレームにフォーカスが当たることを確実にする必要もあるだろう。Input Focusを参照のこと。

歴史的な理由によりウィンドウ選択時にEmacsが個別にフックを実行することはありません。アプリケーションや内部ルーチンがあるウィンドウ上でいくつかの処理を行うために一時的にウィンドウを選択することはよくあります。これらはwindow引数が何も指定されていなければデフォルトでは選択されたウィンドウを処理する関数が多数存在するのでコーディングを単純化するために、あるいは引数としてウィンドウを受け取らないために常に選択されたウィンドウを処理する関数がいくつか存在した(そして今も存在する)ためにこれを行います。あるウィンドウが短時間選択されたときと、以前に選択されていたウィンドウがリストアされるたびに毎回フックを実行するのは有用ではありません。

しかしnorecord引数がnilの際にはselect-windowがバッファーリストを更新するので、間接的にノーマルフックbuffer-list-update-hookが実行されます(Buffer Listを参照)。結果としてこのフックは、あるウィンドウがより“永続的”に選択された際に関数を実行する1つの手段を提供します。

buffer-list-update-hookはウィンドウ管理とは無関係な関数によっても実行されるので、選択されたウィンドウの値を何かに保存しておいて、このフックの実行中にselected-windowの値と比較することには意味があります。buffer-list-update-hookを使用する際の誤検出を防ぐためにも、一時的にのみウィンドウの選択を意図するselect-windowの呼び出しごとにnorecord引数に非nilを渡すことはよい習慣です。そのような場合にはマクロwith-selected-window (以下参照)を使用するべきです。

最後の再表示以降に別ウィンドウが選択されたことを再表示ルーチンが検知した際には、常にEmacsはフックwindow-selection-change-functionsも実行します。詳細な説明はWindow Hooksを参照してください。(同じセクションに記載されている) window-state-change-functionsは別ウィンドウ選択後に実行される別のアブノーマルフックですが、これは他のウィンドウの変更時にも同様にトリガーされます。

引数norecordに非nilを指定したselect-windowの連続呼び出しは、ウィンドウの並び順を選択または使用時刻により決定します(以下参照)。関数get-lru-windowはたとえば、もっとも昔に選択されたウィンドウ(Cyclic Window Orderingを参照)を取得するために使用できます。

Function: frame-selected-window &optional frame

この関数はフレームframe内で選択されているウィンドウをリターンする。frameは生きたフレームであること。省略またはnilの場合のデフォルトは選択されたフレーム。

Function: set-frame-selected-window frame window &optional norecord

この関数はwindowをフレームframe内で選択されたウィンドウにする。frameは生きたフレームであること。省略またはnilの場合のデフォルトは選択されたフレーム。windowは生きたウィンドウであること。省略またはnilの場合のデフォルトは選択されたウィンドウ。

frameが選択されたフレームなら、windowを選択されたウィンドウにする。

オプション引数norecordが非nilなら、この関数はもっとも最近に選択されたウィンドウやバッファーリストのいずれの順序も変更はしない。

以下のマクロはもっとも最近選択されたウィンドウやバッファーリストの順序に影響を与えずにウィンドウを一時的に選択するのに有用です。

Macro: save-selected-window forms…

このマクロは選択されたフレーム、同様に各フレームの選択されたウィンドウを記録して、formsを順に実行してから以前に選択されていたフレームとウィンドウをリストアする。これはカレントバッファーの保存とリストアも行う。リターン値はforms内の最後のフォームの値。

このマクロはウィンドウのサイズ、コンテンツ、配置についての保存やリストアは何も行わない。したがってformsがそれらを変更すると、その変更は永続化される。あるフレームにおいて以前に選択されていたウィンドウがformsのexit時にすでに生きていなければ、そのフレームの選択されたウィンドウはそのまま放置される。以前に選択されていたウィンドウがすでに生きていなければformsの最後に選択されていたウィンドウが何であれ、それが選択されたままになる。カレントバッファーformsのexit時にそれが生きている場合のみリストアされる。

このマクロは、もっとも最近に選択されたウィンドウとバッファーリストの順番をいずれも変更しない。

Macro: with-selected-window window forms…

このマクロはwindowを選択してformsを順に実行してから、以前に選択されていたウィンドウとカレントバッファーをリストアする。たとえば引数norecordnilselect-windowを呼び出す等、forms内で故意に変更しない限り、もっとも最近に選択されたウィンドウとバッファーリストの順番は変更されない。したがってこのマクロは不要なbuffer-list-update-hookの実行なしに、windowを選択されたウィンドウとして一時的に作業するために好ましい手段である。

Macro: with-selected-frame frame forms…

このマクロはframeを選択したフレームとしてformsを実行する。リターン値はformsの最後のフォームの値。このマクロは選択されたフレームの保存とリストアを行い、もっとも最近に選択されたフレーム、およびバッファーリスト内のバッファーのどちらの順序も変更しない。

Function: window-use-time &optional window

この関数はウィンドウwindowの使用回数をリターンする。windowは生きたウィンドウでなければならずデフォルトは選択されたウィンドウ。

ウィンドウの使用回数(use time)は実際にはtime値ではなく、nilnorecord引数によるselect-windowの呼び出しごとに毎回単調に増加する整数。通常は最小の使用回数をもつウィンドウはもっとも最近使用されていないウィンドウ(the least recently used window)、最大の使用回数をもつウィンドウはもっとも最近使用されたウィンドウ(the most recently used window)と呼ばれる(Cyclic Window Orderingを参照)。

Function: window-bump-use-time &optional window

この関数はwindowをもっとも最近使用されたウィンドウになるようにマークする。これは特定のpop-to-bufferシナリオを記述する際に有用かもしれない(Switching Buffersを参照)。windowは生きたウィンドウでなければならずデフォルトは選択されたウィンドウ。

たとえばFollowモード((emacs)Follow Modeを参照)の管理下では、あるウィンドウが単独で表示可能な部分より大きい部分をそのウィンドウにまとめて表示するように、複数のウィンドウが集合かつ協調してバッファーを表示することがあります。そのようなウィンドウグループ(window group)を1つのエンティティーとしてとらえると便利なことがよくあります。window-group-start (Window Start and Endを参照)のようないくつかの関数では、グループ全体の代表としてウィンドウの1つを引数に与えることにより、これを行うことができます。

Function: selected-window-group

選択されたウィンドウがウィンドウグループのメンバーなら、この関数はそのバッファーの最前箇所を表示するウィンドウが先頭になる順序で、グループ内のウィンドウのリストをリターンする。それ以外なら、この関数は選択されたウィンドウだけを含むリストをリターンする。

バッファーローカル変数selected-window-group-functionが関数にセットされているときは、選択されたウィンドウはグループの一部とみなされる。この場合には、selected-window-groupはその関数を引数なしで呼び出し、その結果をリターンする(これはそのグループ内のウィンドウのリストであること)。