各フレームにおいて、任意の時点で、ちょうど1つのEmacsウィンドウがフレーム内で選択済みとして指定されます。選択されたフレームにおいて、そのウィンドウは選択ウィンドウと呼ばれます。これは、ほとんどの編集が行われ、選択ウィンドウ用のカーソルが表示されるウィンドウです(カーソルパラメータを参照)。テキストを挿入または削除するキーボード入力も、通常はこのウィンドウに対して行われます。選択ウィンドウのバッファは、set-bufferが使用された場合を除き、通常は現在のバッファでもあります(現在のバッファを参照)。選択されていないフレームについては、そのフレームが選択された場合、フレーム内で選択されていたウィンドウが選択ウィンドウとなります。
この関数は、選択されたウィンドウ(常にライブウィンドウ)を返します。
以下の関数は、ウィンドウとそのフレームを明示的に選択します。
この関数は、window
を選択中のウィンドウおよびそのフレーム内で選択中のウィンドウとし、さらにそのフレームを選択します。また、window のバッファ(バッファとウィンドウ を参照)をカレントにし、そのバッファの point の値を window 内の window-point の値(ウィンドウとポイント を参照)に設定します。window はライブウィンドウである必要があります。戻り値は window です。
デフォルトでは、この関数は window のバッファをバッファリストの先頭に移動し(バッファリスト を参照)、window を直近で選択されたウィンドウにします。オプション引数 norecord が nil
以外の場合、これらの追加処理は省略されます。
さらに、この関数はデフォルトで、次回フレームが再表示される際に window
の表示を更新するようディスプレイエンジンに指示します。norecord が nil 以外の場合、通常このような更新は行われません。ただし、norecord が特殊記号 mark-for-redisplay と等しい場合は、前述の追加処理は省略されますが、それでも window の表示は更新されます。
なお、ウィンドウを選択するだけでは表示されなかったり、そのフレームがディスプレイ上の最前面のフレームにならなかったりすることがあります。その場合は、フレームを最前面に表示させたり、入力フォーカスがそのフレームに向けられるようにしたりする必要もあります。入力フォーカスを参照してください。
歴史的な経緯により、Emacsではウィンドウが選択されるたびに個別のフックを実行することはありません。アプリケーションや内部ルーチンでは、いくつかの処理を行うために一時的にウィンドウを選択することがよくあります。これは、コーディングを簡素化するため――多くの関数はwindow引数が指定されない場合、デフォルトで選択中のウィンドウを操作するため――、あるいは一部の関数がウィンドウを引数として受け取らず(現在も受け取らず)、常に選択中のウィンドウを操作していたためです。ウィンドウが短時間選択されるたびにフックを実行し、以前に選択されていたウィンドウが復元された際にもう一度実行することは、有用ではありません。
ただし、norecord 引数が nil
の場合、select-window がバッファリストを更新するため、間接的に通常のフック buffer-list-update-hook が実行されます(バッファリスト
を参照)。したがって、このフックは、ウィンドウがより「恒久的に」選択されるたびに関数を実行する一つの手段となります。
buffer-list-update-hook
もウィンドウ管理とは無関係な関数によって実行されるため、通常は選択されたウィンドウの値をどこかに保存し、そのフックの実行中に selected-window の値と比較するのが適切です。また、buffer-list-update-hook
使用時の誤検知を避けるため、ウィンドウを選択することを目的としたすべての select-window
呼び出しでは、非 nil norecord
引数を一時的にのみ渡すのが良い慣行です。可能であれば、このような場合にはマクロ with-selected-window(後述)を使用してください。
Emacsはまた、再表示ルーチンが前回の再表示以降に別のウィンドウが選択されたことを検知した際にも、フック window-selection-change-functions を実行します。詳細な説明については、ウィンドウのスクロールおよび変更用フックを参照してください。window-state-change-functions(同セクションで説明)は、別のウィンドウが選択された後に実行されるもう一つの特殊なフックですが、他のウィンドウ変更によってもトリガーされます。
select-window に対して nil
以外の norecord
引数を指定して順次呼び出すことで、選択または使用時刻に基づくウィンドウの順序が決定されます(以下を参照)。例えば、get-lru-window 関数を用いることで、直近に選択されていないウィンドウを取得できます(ウィンドウの循環順序を参照)。
この関数は、frame 内の当該フレームで選択されているウィンドウを返します。frame にはライブフレームを指定する必要があります。省略した場合や nil を指定した場合は、選択中のフレームがデフォルトとなります。
この関数は、window をフレーム frame
内で選択されているウィンドウにします。frame はライブフレームである必要があります。nil の場合は、デフォルトで選択中のフレームが指定されます。window はライブウィンドウを指定する必要があります。
frame が選択中のフレームである場合、これにより window が選択中のウィンドウになります。
オプション引数 norecord が nil
以外の場合、この関数は直近で選択されたウィンドウの順序やバッファリストを変更しません。
以下のマクロは、最近選択したウィンドウの順序やバッファリストに影響を与えることなく、一時的にウィンドウを選択する際に便利です。
このマクロは、選択中のフレームおよび各フレームの選択中のウィンドウを記録し、formsを順次実行した後、先に選択していたフレームとウィンドウを復元します。また、現在のバッファを保存し、復元します。さらに、forms内の最後のフォームの値を返します。
このマクロは、ウィンドウのサイズ、配置、または内容を一切保存・復元しません。したがって、forms でこれらを変更した場合、その変更は保持されます。forms を終了する際に、あるフレームで以前に選択されていたウィンドウがアクティブでなくなった場合、そのフレームの選択済みウィンドウはそのまま維持されます。以前に選択されていたウィンドウがアクティブでなくなった場合、forms の終了時に選択されているウィンドウがそのまま選択された状態となります。現在のバッファは、forms を終了する際にまだアクティブである場合に限り、復元されます。
このマクロは、最近選択したウィンドウの順序やバッファリストを変更しません。
このマクロは window を選択し、forms
を順次実行した後、以前に選択していたウィンドウと現在のバッファを復元します。最近選択したウィンドウとバッファリストの順序は、forms 内で意図的に変更しない限り(例えば、引数 norecord
nil を指定して select-window
を呼び出す場合など)、変更されません。したがって、このマクロは、不必要に buffer-list-update-hook を実行することなく、window を選択ウィンドウとして一時的に扱うための推奨される方法です。
なお、このマクロはウィンドウ管理コードを一時的に不安定な状態にします。特に、直近で使用されたウィンドウ(後述)は、必ずしも選択中のウィンドウと一致するとは限りません。そのため、このマクロの本体内で
get-lru-window や get-mru-window といった関数を呼び出すと、予期しない結果が返される可能性があります。
このマクロは、frameを選択中のフレームとしてformsを実行します。返される値は、forms内の最後のフォームの値です。このマクロは選択中のフレームを保存・復元し、最近選択したウィンドウおよびバッファリスト内のバッファの順序を変更しません。
この関数は、ウィンドウ window の使用時間を返します。window はアクティブなウィンドウである必要があり、デフォルトでは選択中のウィンドウが指定されます。
ウィンドウの使用時間は、厳密には時間値ではなく、nil
および norecord 引数を伴う select-window
の呼び出しごとに単調に増加する整数です。使用時間が最も短いウィンドウは、通常「最近使用されていないウィンドウ」と呼ばれます。使用時間が最も長いウィンドウは「最近使用されたウィンドウ」と呼ばれ(ウィンドウの循環順序を参照)、with-selected-window が使用されていない限り、通常は選択されるウィンドウとなります。
この関数は、windowを(選択中のウィンドウに次いで)直近で使用された2番目のウィンドウとしてマークします。windowが選択中のウィンドウである場合、または選択中のウィンドウがwith-selected-windowの範囲内にあり得るすべてのウィンドウの中で最大の使用時間を持たない場合は、何も行いません。
場合によっては、例えば Follow Mode((emacs)Follow
Mode
を参照)の管理下で、複数のウィンドウが協調してバッファを表示することがあり、その場合、個々のウィンドウが単独で表示できるよりも広い範囲のバッファをまとめて表示できます。このようなウィンドウグループを単一の実体として扱うことが有用な場合が多くあります。window-group-start(ウィンドウの開始・終了位置
を参照)などのいくつかの関数では、引数としてウィンドウの1つをグループ全体の代表として指定することで、これを実現できます。
選択されたウィンドウがウィンドウグループに属している場合、この関数はグループ内のウィンドウの一覧を、リストの先頭のウィンドウがバッファの最も先頭の部分を表示している順などに並べて返します。そうでない場合は、選択されたウィンドウのみを含むリストを返します。
バッファローカル変数 selected-window-group-function
が関数に設定されている場合、選択されたウィンドウはグループの一部とみなされます。この場合、selected-window-group
は引数なしでそれを呼び出し、その結果(グループ内のウィンドウのリストとなるはずのもの)を返します。