それぞれのフレーム内において、常にただ1つのEmacsウィンドウがそのフレームで選択されている(selected within the
frame)として指定されます。選択されたフレームにたいしてそのウィンドウは選択されたウィンドウ(selected
window)と呼ばれます。選択されたウィンドウは編集のほとんどが行われるウィンドウであり、選択されたウィンドウに表示されるカーソルがあるウィンドウです(カーソルのパラメーターを参照)。テキストの挿入や削除を行うキーボード入力もそのウィンドウにたいして行われます。選択されたウィンドウのバッファーは、通常はset-buffer
が使用された場合を除いてカレントバッファーでもあります(カレントバッファーを参照)。選択されていないフレームでは、そのフレームが選択されたときはフレームで選択されていたウィンドウが選択されたウィンドウになります。
この関数は選択されたウィンドウをリターンする(これは常に生きたウィンドウ)。
以下の関数はウィンドウとそのフレームを明示的に選択します。
この関数はwindowを選択されたウィンドウにすることによりそのフレーム内で選択されたウィンドウとして、そのフレームを選択する。またwindowのバッファー(バッファーとウィンドウを参照)をカレントにして、そのバッファーのpoint
の値(ウィンドウとポイントを参照)をwindowのwindow-point
の値にセットする。windowは生きたウィンドウでなければならない。リターン値はwindow。
デフォルトではこの関数はwindowのバッファーをバッファーリストの先頭(バッファーリストを参照)に移動して、windowをもっとも最近選択されたウィンドウにする。オプション引数norecordが非nil
なら、これらの追加処理は省略される。
加えてこの関数はデフォルトではwindowのフレームの次回再表示の際にwindowを更新するようにディスプレイエンジンに指示する。norecordが非nil
なら、そのような更新は通常は行わない。しかしnorecordが特別なシンボルmark-for-redisplay
と等しければ上述の追加アクションは省略されるが、それにも関わらずwindowの表示は更新される。
ウィンドウを選択することではウィンドウの表示やそのフレームをディスプレイ上の最上フレームにすることを満足しない場合があることに注意。さらにそのフレームのレイズやフレームにフォーカスが当たることを確実にする必要もあるだろう。入力のフォーカスを参照のこと。
歴史的な理由によりウィンドウ選択時にEmacsが個別にフックを実行することはありません。アプリケーションや内部ルーチンがあるウィンドウ上でいくつかの処理を行うために一時的にウィンドウを選択することはよくあります。これらはwindow引数が何も指定されていなければデフォルトでは選択されたウィンドウを処理する関数が多数存在するのでコーディングを単純化するために、あるいは引数としてウィンドウを受け取らないために常に選択されたウィンドウを処理する関数がいくつか存在した(そして今も存在する)ためにこれを行います。あるウィンドウが短時間選択されたときと、以前に選択されていたウィンドウがリストアされるたびに毎回フックを実行するのは有用ではありません。
しかしnorecord引数がnil
の際にはselect-window
がバッファーリストを更新するので、間接的にノーマルフックbuffer-list-update-hook
が実行されます(バッファーリストを参照)。結果としてこのフックは、あるウィンドウがより“永続的”に選択された際に関数を実行する1つの手段を提供します。
buffer-list-update-hook
はウィンドウ管理とは無関係な関数によっても実行されるので、選択されたウィンドウの値を何かに保存しておいて、このフックの実行中にselected-window
の値と比較することには意味があります。buffer-list-update-hook
を使用する際の誤検出を防ぐためにも、一時的にのみウィンドウの選択を意図するselect-window
の呼び出しごとにnorecord引数に非nil
を渡すことはよい習慣です。そのような場合にはマクロwith-selected-window
(以下参照)を使用するべきです。
最後の再表示以降に別ウィンドウが選択されたことを再表示ルーチンが検知した際には、常にEmacsはフックwindow-selection-change-functions
も実行します。詳細な説明はウィンドウのスクロールと変更のためのフックを参照してください。(同じセクションに記載されている)
window-state-change-functions
は別ウィンドウ選択後に実行される別のアブノーマルフックですが、これは他のウィンドウの変更時にも同様にトリガーされます。
引数norecordに非nil
を指定したselect-window
の連続呼び出しは、ウィンドウの並び順を選択または使用時刻により決定します(以下参照)。関数get-lru-window
はたとえば、もっとも昔に選択されたウィンドウ(ウィンドウのサイクル順を参照)を取得するために使用できます。
この関数はフレームframe内で選択されているウィンドウをリターンする。frameは生きたフレームであること。省略またはnil
の場合のデフォルトは選択されたフレーム。
この関数はwindowをフレームframe内で選択されたウィンドウにする。frameは生きたフレームであること。省略またはnil
の場合のデフォルトは選択されたフレーム。windowは生きたウィンドウでなければならない
frameが選択されたフレームなら、windowを選択されたウィンドウにする。
オプション引数norecordが非nil
なら、この関数はもっとも最近に選択されたウィンドウやバッファーリストのいずれの順序も変更はしない。
以下のマクロはもっとも最近選択されたウィンドウやバッファーリストの順序に影響を与えずにウィンドウを一時的に選択するのに有用です。
このマクロは選択されたフレーム、同様に各フレームの選択されたウィンドウを記録して、formsを順に実行してから以前に選択されていたフレームとウィンドウをリストアする。これはカレントバッファーの保存とリストアも行う。リターン値はforms内の最後のフォームの値。
このマクロはウィンドウのサイズ、コンテンツ、配置についての保存やリストアは何も行わない。したがってformsがそれらを変更すると、その変更は永続化される。あるフレームにおいて以前に選択されていたウィンドウがformsのexit時にすでに生きていなければ、そのフレームの選択されたウィンドウはそのまま放置される。以前に選択されていたウィンドウがすでに生きていなければformsの最後に選択されていたウィンドウが何であれ、それが選択されたままになる。カレントバッファーformsのexit時にそれが生きている場合のみリストアされる。
このマクロは、もっとも最近に選択されたウィンドウとバッファーリストの順番をいずれも変更しない。
このマクロはwindowを選択してformsを順に実行してから、以前に選択されていたウィンドウとカレントバッファーをリストアする。たとえば引数norecordをnil
でselect-window
を呼び出す等、forms内で故意に変更しない限り、もっとも最近に選択されたウィンドウとバッファーリストの順番は変更されない。したがってこのマクロは不要なbuffer-list-update-hook
の実行なしに、windowを選択されたウィンドウとして一時的に作業するために好ましい手段である。
このマクロはウィンドウ管理コードを一時的に不安定な状態に置くことに注意。特にもっとも最近使用されたウィンドウ(下記参照)が、選択されたウィンドウと一致する必要はなくなる。したがってこのマクロのbodyでget-lru-window
やget-mru-window
のような関数を呼び出すと、予期せぬ結果を得ることになるかもしれない。
このマクロはframeを選択したフレームとしてformsを実行する。リターン値はformsの最後のフォームの値。このマクロは選択されたフレームの保存とリストアを行い、もっとも最近に選択されたフレーム、およびバッファーリスト内のバッファーのどちらの順序も変更しない。
この関数はウィンドウwindowの使用回数をリターンする。windowは生きたウィンドウでなければならずデフォルトは選択されたウィンドウ。
ウィンドウの使用回数(use
time)は実際にはtime値ではなく、nil
のnorecord引数によるselect-window
の呼び出しごとに毎回単調に増加する整数。通常は最小の使用回数をもつウィンドウは、もっとも最近使用されていないウィンドウ(the
least recently used window)と呼ばれる。最大の使用回数をもつウィンドウはもっとも最近使用されたウィンドウ(the most
recently used window)と呼ばれる(ウィンドウのサイクル順を参照)。これはwith-selected-window
を使用していなければ、通常は選択されたウィンドウである。
この関数はwindowを2番目に最近使われたウィンドウ(選択されたウィンドウの次)としてマークする。windowが選択されたウィンドウ、あるいは選択されたウィンドウの使用時間がすべてのウィンドウの中で最長ではない場合(with-selected-window
のスコープ内で発生し得る)には何もしない。
たとえばFollowモード((emacs)Follow Modeを参照)の管理下では、あるウィンドウが単独で表示可能な部分より大きい部分をそのウィンドウにまとめて表示するように、複数のウィンドウが集合かつ協調してバッファーを表示することがあります。そのようなウィンドウグループ(window
group)を1つのエンティティーとしてとらえると便利なことがよくあります。window-group-start
(ウィンドウの開始位置と終了位置を参照)のようないくつかの関数では、グループ全体の代表としてウィンドウの1つを引数に与えることにより、これを行うことができます。
選択されたウィンドウがウィンドウグループのメンバーなら、この関数はそのバッファーの最前箇所を表示するウィンドウが先頭になる順序で、グループ内のウィンドウのリストをリターンする。それ以外なら、この関数は選択されたウィンドウだけを含むリストをリターンする。
バッファーローカル変数selected-window-group-function
が関数にセットされているときは、選択されたウィンドウはグループの一部とみなされる。この場合には、selected-window-group
はその関数を引数なしで呼び出し、その結果をリターンする(これはそのグループ内のウィンドウのリストであること)。