ナローイング(narrowing)とはEmacs編集コマンドがアドレス指定可能なテキストを、あるバッファー内の制限された文字範囲に限定することを意味します。アドレス可能なテキストは、そのバッファーのアクセス可能範囲(accessible portion)と呼ばれます。
ナローイングは2つのバッファー位置により指定されるもので、それらの位置がアクセス可能範囲の開始と終了になります。ほとんどの編集コマンドやプリミティブにたいして、これらの位置はそれぞれそのバッファーの先頭と終端に置き換えられます。ナローイングが効果をもつ間にはアクセス可能範囲外のテキストは表示されず、その外部にポイントを移動することはできません。ナローイングは実際のバッファー位置(ポイントを参照)を変更しないことに注意してください。ほとんどの関数はアクセス可能範囲外のテキストにたいする操作を受け入れません。
バッファーを保存するコマンドはナローイングの影響を受けません。どんなナローイングであろうと、それらはバッファー全体を保存します。
単一バッファー内にタイプが大きく異なるテキストを複数表示する必要がある場合には、2つのバッファー間でのテキストの交換で説明する代替機能の使用を考慮してください。
この関数はアクセス可能範囲の開始と終了にカレントバッファーのstartとendをセットする。どちらの引数も文字位置で指定すること。
インタラクティブな呼び出しでは、startとendはカレントリージョンにセットされる(ポイントとマークで小さいほうが前者)。
ただしlabel引数(以下参照)を指定したwith-restriction
によってナローイングがセットされている際には、そのナローイングの制限の範囲内にたいしてのみnarrow-to-region
を使用できる。startかendがこの制限の範囲外であれば、with-restriction
によってセットされた対応する制限がかわりに使用される。バッファーのそれ以外の部分へのアクセスを取得するには、同じlabelを指定してwithout-restriction
を使えばよい。
この関数はカレントページだけを含むようにカレントバッファーのアクセス可能範囲をセットする。1つ目のオプション引数move-countが非nil
なら、move-countで前方か後方へ移動後に1ページにナローすることを意味する。変数page-delimiter
はページの開始と終了の位置を指定する(編集で使用される標準的な正規表現を参照)。
インタラクティブな呼び出しではmove-countには数プレフィクス引数がセットされる。
この関数はカレントバッファーにたいするすべてのナローイングをキャンセルする。これはワイドニング(widening)と呼ばれる。これは以下の式と等価:
(narrow-to-region 1 (1+ (buffer-size)))
ただしlabel引数(以下参照)を指定したwith-restriction
によってナローイングがセットされている際には、ナローイングをキャンセルするかわりにwith-restriction
でセットした制限がリストアされる。バッファーのそれ以外の部分へのアクセスを取得するには、同じlabelを指定してwithout-restriction
を使えばよい。
この関数はそのバッファーがナローされていれば非nil
、それ以外はnil
をリターンする。
このスペシャルフォームはアクセス可能範囲のカレントのバインドを保存してbodyを評価、その後に以前有効だったナローイング(またはナローイングがない状態)と同じ状態になるように、最後に保存された境界をリストアする。ナローイングの状態は、throw
やエラーを通じたアブノーマルexit(非ローカル脱出を参照)イベント内においてもリストアされる。したがってこの構文は一時的にバッファーをナローする明快な手段である。
この構文はlabel引数(以下参照)とともにwith-restriction
によってセットされたナローイングの保存とリストアも行う。
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 ----------
このスペシャルフォームはバッファーのアクセス可能範囲のカレント境界を保存、startで始まりendで終わるアクセス可能範囲をセットしてbodyフォームを評価、それから保存してある境界をリストアする。この場合は以下と等しい
(save-restriction (narrow-to-region start end) body)
オプション引数label (使用するラベルを取得するために評価される;
非nil
値が生成されなければならない)が与えられた場合には、そのナローイングはラベル付け(labeled)される。ラベル付けされたナローイングは、ラベル付けされていないナローイングといくつかの点で異なる:
narrow-to-region
とwiden
が使えるのはstartからendまでの制限の内部のみ。
with-restriction
でセットされた制限を解除してバッファーの他の部分へのアクセスを取得するためには、同じlabel引数を使ってwithout-restriction
を呼び出す(バッファーの他の部分へのアクセスを取得する別の方法としてインダイレクトバッファーの使用がある;
インダイレクトバッファーを参照)。
オプション引数labelとともにwith-restriction
を使う場合には、あなたのコードを呼び出す他のLispプログラムが必要に応じてナローイングを解除できるように、これを使う関数のdoc文字列でそのlabelのドキュメントを記述することを推奨する。
このスペシャルフォームはバッファーのアクセス可能範囲のカレント境界を保存、そのバッファーをワイドニングしてからbodyフォームを評価、それから保存した境界をリストアする。この場合は以下と等しい
(save-restriction (widen) body)
オプション引数labelが与えられた場合には、同じlabel引数のwith-restriction
でセットされたナローイングが解除される。