本節では、ウィンドウがスクロールされたり、その他のウィンドウ変更が行われたりした後に、Lispプログラムがどのように動作できるかについて説明します。まず、ウィンドウにバッファの異なる部分が表示されている場合について考察します。
この変数には、スクロール可能なウィンドウを再表示する前にEmacsが呼び出すべき関数のリストが格納されています。ウィンドウに別のバッファを表示したり、新しいウィンドウを作成したりする場合にも、これらの関数が呼び出されます。
この変数は通常のフックではありません。各関数が、ウィンドウとその新しい表示開始位置という2つの引数で呼び出されるためです。呼び出し時点で、引数 window の表示開始位置はすでに新しい値に設定されており、ウィンドウに表示されるバッファは現在のバッファとして設定されています。
これらの関数で window-end を使用する際は注意が必要です(ウィンドウの開始・終了位置を参照)。最新の値が必要な場合は、確実に取得するために
update 引数を使用する必要があります。
警告: この機能をウィンドウのスクロール動作の変更に使用しないでください。そのような用途を想定して設計されておらず、そのような使い方をしてもおそらく動作しません。
さらに、jit-lock-register を使用して Font Lock
のフォント化関数を登録できます。この関数は、ウィンドウのスクロールやサイズ変更によってバッファの一部が(再)フォント化されるたびに呼び出されます。その他の Font Lock
変数を参照してください。
本節の残りの部分では、ウィンドウにスクロールを伴わない重大な変更が検出された際に、再表示時に呼び出される6つのフックについて解説します。簡略化のため、これらのフックおよびそれらが呼び出す関数を総称してウィンドウ変更関数と呼びます。他のフックと同様に、これらのフックは、インストール時にadd-hookのlocal引数(フックの設定を参照)を介して、グローバルまたはバッファローカルに設定できます。
これらのフックの1つ目は、ウィンドウバッファの変更が検出された後に実行されます。これは、ウィンドウが作成された、削除された、あるいは別のバッファが割り当てられたことを意味します。
この変数は、ウィンドウバッファが変更された際の再表示時に呼び出される関数を指定します。値は、1つの引数を取る関数のリストである必要があります。
buffer-locally で指定された関数は、前回の再表示以降にそのウィンドウのバッファが追加または変更された場合に限り、対応するバッファを表示している各ウィンドウに対して呼び出されます。なお、このようなウィンドウに対して関数が2回実行される可能性がある点に注意してください。一度目は前回の再表示時にウィンドウに表示されていたバッファ(そのバッファが依然として有効な場合)に対して、二度目は現在ウィンドウに表示されているバッファに対して実行されます。いずれの場合も、ウィンドウが引数として渡され、それぞれのバッファが一時的にカレントになります。
このフックのバッファローカル版を使用している場合、バッファがウィンドウから削除されたケースと、現在そのウィンドウにバッファが表示されているケースを区別したい場合があります。window がこのフックの関数に渡されるウィンドウ引数を表すとすると、window からバッファが削除されたケースを検出するには、次のイディオムを使用します。
(eq (window-old-buffer window) (current-buffer))
バッファが現在 window に表示されているかを判定するには、以下を使用します。
(eq (window-buffer window) (current-buffer))
代わりに。
デフォルト値で指定された関数は、前回のウィンドウ変更関数の実行以降に、そのフレーム上のウィンドウが少なくとも1つ追加、削除、または別のバッファに割り当てられた場合に呼び出されます。この場合、フレームが引数として渡されます。
これら2つ目のフックは、ウィンドウサイズの変更が検出された際に実行されます。これは、ウィンドウが作成されたか、別のバッファが割り当てられたか、あるいはウィンドウ自体やテキストエリアの総サイズが変更されたことを意味します。
この変数は、ウィンドウサイズの変更が発生した際に再表示時に呼び出される関数を指定します。値は、1つの引数を取る関数のリストである必要があります。
buffer-locally で指定された関数は、対応するバッファを表示しているウィンドウにおいて、前回のウィンドウ変更関数の実行以降に、そのウィンドウが追加されたり、別のバッファが割り当てられたり、あるいは全体サイズや本体サイズが変更されたりした場合に呼び出されます。この場合、ウィンドウが引数として渡され、該当するバッファが一時的にカレントになります。
デフォルト値で指定された関数は、前回のウィンドウ変更関数の実行以降に、当該フレーム上の少なくとも1つのウィンドウが追加されたか、別のバッファが割り当てられたか、あるいは全体サイズや本体サイズが変更された場合に、そのフレームに対して呼び出されます。この場合、フレームが引数として渡されます。
これら3つのフックのうち3番目は、前回の再表示以降にウィンドウ選択の変更によって別のウィンドウが選択された際に実行されます。
この変数は、選択中のウィンドウまたはフレームの選択中のウィンドウが変更された際に、再表示時に呼び出される関数を指定します。値は、1つの引数を取る関数のリストである必要があります。
buffer-locally で指定された関数は、前回ウィンドウ変更関数が実行されて以来、対応するバッファを表示しているウィンドウ(すべてのウィンドウ中、あるいはそのフレーム内のすべてのウィンドウ中)が選択または選択解除された場合に呼び出されます。この場合、そのウィンドウが引数として渡され、該当するバッファが一時的にカレントになります。
デフォルト値で指定された関数は、フレームが選択または選択解除された場合、あるいは前回のウィンドウ変更関数の実行以降にフレームの選択済みウィンドウが変更された場合に、そのフレームに対して呼び出されます。この場合、フレームが引数として渡されます。
これらのフックのうち4番目は、ウィンドウ状態の変化が検出された際に実行されます。これは、直前の3回のウィンドウ変更のうち、少なくとも1回が発生したことを意味します。
この変数は、ウィンドウバッファやサイズの変更が発生した際、あるいは選択中のウィンドウやフレームの選択中ウィンドウが変更された際に、再表示時に呼び出される関数を指定します。値は、1つの引数を取る関数のリストである必要があります。
buffer-locally で指定された関数は、前回のウィンドウ変更関数の実行以降に、対応するバッファが追加または割り当てられたか、総サイズや本体サイズが変更されたか、あるいは(すべてのウィンドウの中で、またはフレーム内のすべてのウィンドウの中で)選択または選択解除された場合に、そのバッファを表示しているすべてのウィンドウに対して呼び出されます。この場合、ウィンドウが引数として渡され、該当するバッファが一時的にカレントになります。
デフォルト値で指定された関数は、そのフレーム上の少なくとも1つのウィンドウが追加、削除、または別のバッファに割り当てられた場合、あるいは合計サイズや本体サイズが変更された場合、またはそのフレームが選択・選択解除された場合、あるいは前回のウィンドウ変更関数の実行以降にそのフレームの選択済みウィンドウが変更された場合に、当該フレームに対して呼び出されます。この場合、フレームが引数として渡されます。
デフォルト値で指定された関数は、前回の再表示以降にそのフレームのウィンドウ状態変更フラグ(後述)がセットされた場合にも、そのフレームに対して実行されます。
これら5番目のフックは、ウィンドウ構成の変更が検出された際に実行されます。これは、バッファまたはウィンドウのサイズが変更されたことを意味します。前述の4つのフックとは、実行方法が異なります。
この変数は、バッファまたはウィンドウのサイズが変更された際に、再表示時に呼び出される関数を指定します。値は、引数を取らない関数のリストである必要があります。
buffer-locally で指定された関数は、前回のウィンドウ変更関数の実行以降に、当該フレーム上の少なくとも1つのウィンドウに対して別のバッファが追加・削除・割り当てられたか、あるいは総サイズや本体サイズが変更された場合に、対応するバッファを表示しているすべてのウィンドウに対して呼び出されます。各呼び出しは、バッファを表示しているウィンドウが一時的に選択され、そのバッファがカレントとなった状態で実行されます。
デフォルト値で指定された関数は、前回のウィンドウ変更関数の実行以降に、当該フレーム上の少なくとも1つのウィンドウが追加、削除、別のバッファの割り当てを受けたか、あるいは全体サイズや本体サイズが変更された場合に、フレームごとに呼び出されます。各呼び出しは、フレームが一時的に選択され、選択中のウィンドウのバッファがカレントの状態で実行されます。
最後に、Emacsはwindow-state-change-functionsの動作を一般化する通常のフックを実行します。
この変数のデフォルト値は、ウィンドウ状態の変化が検出された場合、または少なくとも1つのフレームでウィンドウ状態変化フラグが設定された場合に、再表示時に呼び出される関数を指定します。値は、引数を取らない関数のリストである必要があります。
アプリケーションは、前回の再表示から2フレーム以上経過して発生した(あるいは通知された)変更に反応したい場合にのみ、このフックに関数を登録すべきです。それ以外の場合は、window-state-change-functions に関数を登録することが推奨されます。
ウィンドウ変更関数は、各フレームの再表示時に次のように呼び出されます。まず、バッファローカルなウィンドウバッファ変更関数、ウィンドウサイズ変更関数、選択ウィンドウ変更関数、およびウィンドウ状態変更関数がこの順に呼び出されます。次に、これらの関数のデフォルト値が同じ順に呼び出されます。続いて、バッファローカルなウィンドウ構成変更関数が呼び出され、その後、それらの関数のデフォルト値で指定された関数が呼び出されます。最後に、window-state-change-hook 上の関数が実行されます。
ウィンドウ変更関数は、特定のフレームに対して対応する変更が事前に登録されていた場合にのみ、そのフレームで実行されます。こうした変更には、ウィンドウの作成や削除、あるいはウィンドウへの別のバッファやサイズの割り当てなどが含まれます。なお、このような変更が登録されていても、前述のフックのいずれかが実行されるとは限らない点に注意してください。例えば、ウィンドウエクスカーション(ウィンドウ設定を参照)の範囲内で変更が登録されていた場合、変更関数が実行される時点でそのエクスカーションが依然として継続している場合にのみ、ウィンドウ変更関数が呼び出されます。それより前に終了していた場合は、そのエクスカーションの範囲外の変更によって登録された場合にのみ、フックが実行されます。
フレームのウィンドウ状態変更フラグが設定されている場合、そのフレームで実際にウィンドウ状態変更が発生したかどうかにかかわらず、次回の再表示時に(そのフレームに対する)window-state-change-functionsおよびwindow-state-change-hookのデフォルト値が実行されます。これらのフックで関数を実行した後、フラグは各フレームごとにリセットされます。アプリケーションは、以下の関数を使用してこのフラグを設定し、その値を確認できます。
この関数は、arg が nil 以外であれば frame のウィンドウ状態変更フラグをセットし、そうでなければリセットします。frame はライブフレームである必要があり、デフォルトでは選択中のフレームが指定されます。
この関数は、frameのウィンドウ状態変更フラグがセットされている場合はtを、そうでない場合はnilを返します。frameはライブフレームである必要があり、デフォルトでは選択中のフレームが指定されます。
ウィンドウ変更関数が実行されている間、次に説明する関数を呼び出すことで、前回の再表示以降、特定のウィンドウやフレームで何が変更されたかについてより詳細な情報を得ることができます。これらの関数はすべて、ライブウィンドウを単一のオプション引数として受け取り、デフォルトでは選択中のウィンドウが指定されます。
この関数は、window のフレームにおいて最後にタイムウィンドウ変更関数が実行された際に window に表示されていたバッファを返します。nil
が返された場合、window は内部ウィンドウであるか、あるいはその後に作成されたものです。t が返された場合、window
はその時点では表示されていませんでしたが、その後に保存されていたウィンドウ設定から復元されたものです。それ以外の場合、戻り値はその時点で window に表示されていたバッファとなります。特殊なケースとして、window が削除されている場合、この関数は window
がその時点で最後に表示していたバッファを返します。window
には任意のウィンドウを指定でき、デフォルトでは選択中のウィンドウが使用されます。
この関数は、ウィンドウ変更関数が最後にフレーム上で window を検出した際の window の総ピクセル幅を返します。window がその後に作成された場合は、0 となります。
この関数は、ウィンドウ変更関数が最後にフレーム上でwindowを検出した際のwindowの総ピクセル高さを返します。windowがその後に作成された場合は、0となります。
この関数は、ウィンドウ変更関数が最後に window をそのフレーム上で検出した際の、window のテキスト領域のピクセル幅を返します。window がそれ以降に作成された場合は、0 となります。
この関数は、ウィンドウ変更関数が最後にwindowをそのフレーム上で検出した際の、windowのテキスト領域のピクセル高さを返します。windowがそれ以降に作成された場合は、0となります。
前回ウィンドウ変更関数が実行された際にどのウィンドウまたはフレームが選択されていたかを確認するには、以下の関数を使用できます。
この関数は、最後にウィンドウ変更関数が実行された時点で選択されていた frame
のウィンドウを返します。省略した場合、または nil や frame が指定された場合は、選択中のフレームがデフォルトとなります。
この関数は、最後にウィンドウ変更関数が実行された時点で選択されていたウィンドウを返します。
この関数は、最後にタイムウィンドウ変更関数が実行された時点で選択されていたフレームを返します。
なお、ウィンドウ変更関数は、前回の実行以降にどのウィンドウが削除されたかに関する情報を一切提供しません。必要に応じて、アプリケーションは特定のバッファを表示しているウィンドウをそのバッファのローカル変数に保持し、ウィンドウバッファの変更が検出された際に実行されるいずれかのフックのデフォルト値によって実行される関数内で、その変数を更新する必要があります。
ウィンドウ変更関数に機能を追加する際は、以下の注意点に留意してください。
window-state-change-hook
で最後に列挙されている関数のみによって実行されるべきです。
save-window-excursion、with-selected-window、with-current-buffer といったマクロを使用できます。
window-configuration-change-hook
を実行しない限り、選択中のウィンドウやフレーム、あるいは現在のバッファも保存・復元されません。