ナローイング(narrowing)とはEmacs編集コマンドがアドレス指定可能なテキストを、あるバッファー内の制限された文字範囲に限定することを意味します。アドレス可能なテキストは、そのバッファーのアクセス可能範囲(accessible portion)と呼ばれます。
ナローイングは2つのバッファー位置により指定されるもので、それらの位置がアクセス可能範囲の開始と終了になります。ほとんどの編集コマンドやプリミティブにたいして、これらの位置はそれぞれそのバッファーの先頭と終端に置き換えられます。ナローイングが効果をもつ間にはアクセス可能範囲外のテキストは表示されず、その外部にポイントを移動することはできません。ナローイングは実際のバッファー位置(ポイントを参照)を変更しないことに注意してください。ほとんどの関数はアクセス可能範囲外のテキストにたいする操作を受け入れません。
バッファーを保存するコマンドはナローイングの影響を受けません。どんなナローイングであろうと、それらはバッファー全体を保存します。
単一バッファー内にタイプが大きく異なるテキストを複数表示する必要がある場合には、2つのバッファー間でのテキストの交換で説明する代替機能の使用を考慮してください。
この関数はアクセス可能範囲の開始と終了にカレントバッファーのstartとendをセットする。どちらの引数も文字位置で指定すること。
インタラクティブな呼び出しでは、startとendはカレントリージョンにセットされる(ポイントとマークで小さいほうが前者)。
この関数はカレントページだけを含むようにカレントバッファーのアクセス可能範囲をセットする。1つ目のオプション引数move-countが非nil
なら、move-countで前方か後方へ移動後に1ページにナローすることを意味する。変数page-delimiter
はページの開始と終了の位置を指定する(編集で使用される標準的な正規表現を参照)。
インタラクティブな呼び出しではmove-countには数プレフィクス引数がセットされる。
この関数はカレントバッファーにたいするすべてのナローイングをキャンセルする。これはワイドニング(widening)と呼ばれる。これは以下の式と等価:
(narrow-to-region 1 (1+ (buffer-size)))
この関数はそのバッファーがナローされていれば非nil
、それ以外はnil
をリターンする。
このスペシャルフォームはアクセス可能範囲のカレントのバインドを保存してbodyを評価、その後に以前有効だったナローイング(またはナローイングがない状態)と同じ状態になるように、最後に保存された境界をリストアする。ナローイングの状態は、throw
やエラーを通じたアブノーマルexit(非ローカル脱出を参照)イベント内においてもリストアされる。したがってこの構文は一時的にバッファーをナローする明快な手段である。
save-restriction
がリターンする値はbody内の最後のフォームのリターン値、bodyフォームが与えられなければnil
。
注意: save-restriction
使用の際は間違いを起こしやすい。これを試みる前にこの説明全体に目を通すこと。
bodyがカレントバッファーを変更する場合でもsave-restriction
は依然として元のバッファー(その制限が保存されたバッファー)上の制限をリストアするが、カレントバッファー自体はリストアしない。
save-restriction
はポイントをリストアしない。これを行うにはsave-excursion
を使用する。save-restriction
とsave-excursion
の両方を共に使用するなら、始め(外側)にsave-excursion
を記述すること。それ以外では一時的なナローイング影響下で古いポイント値がリストアされる。古いポイント値が一時的なナローイング境界外なら、それを実際にリストアすることは失敗するだろう。
以下はsave-restriction
の正しい使い方の簡単な例:
---------- Buffer: foo ---------- This is the contents of foo This is the contents of foo This is the contents of foo∗ ---------- Buffer: foo ----------
(save-excursion (save-restriction (goto-char 1) (forward-line 2) (narrow-to-region 1 (point)) (goto-char (point-min)) (replace-string "foo" "bar"))) ---------- Buffer: foo ---------- This is the contents of bar This is the contents of bar This is the contents of foo∗ ---------- Buffer: foo ----------