前: Excursions, 上: Positions
ナロイング(narrowing)とは、 Emacsの編集コマンドが参照できるテキストを バッファの制限された文字の範囲に限定することです。 参照できるテキストのことをバッファの 参照可能部分(accessible portion)と呼びます。
ナロイングは、参照可能部分の先頭と末尾になる2つのバッファ内位置で指定します。 ほとんどの編集コマンドやほとんどのEmacs基本関数にとっては、 これらの位置はバッファの先頭や末尾の値を置き換えることになります。 ナロイングしていると、参照可能部分の外側のテキストは表示されませんし、 ポイントは参照可能部分の外側へは移動できません。
通常はバッファの先頭から数える位置や行番号などの値は ナロイングしていても同様に数えますが、 それらを使う関数は参照できないテキストを操作することを拒否します。
バッファを保存するコマンドはナロイングの影響を受けません。 つまり、ナロイングに関係なくバッファ全体を保存します。
この関数は、カレントバッファのstartで始まりendで終る部分を 参照可能部分にする。 どちらの引数も文字の位置であること。
対話的に呼び出されると、startとendは 現在のリージョンの境界(ポイントとマークの小さいほうがさきにくる)である。
このコマンドは、カレントバッファの参照可能部分を 現在のページのみを含むようにする。 省略可能な第1引数move-countが
nil
以外であると、 move-countページだけ前方か後方へ移動してから 1ページ分にナロイングする。 変数page-delimiter
がページの開始箇所と終了箇所を指定する (see Standard Regexps)。対話的に呼び出されると、move-countは数値前置引数である。
この関数は、カレントバッファのナロイングを解除し、 全体を参照できるようにする。 これをワイドニング(widening)と呼ぶ。 これはつぎの式と等価である。
(narrow-to-region 1 (1+ (buffer-size)))
このスペシャルフォームは、現在の参照可能部分の境界を保存し、 フォームbodyを評価し、最後に、保存した境界を復元して まえと同じナロイング状態(あるいはナロイングなし)に復元する。
throw
やエラーによる異常脱出(see Nonlocal Exits)であっても、 ナロイング状態を復元する。
save-restriction
の戻り値は、bodyの最後の結果であるか、 bodyを与えなければnil
である。注意: 構文
save-restriction
を使うときには まちがいやすい。 使うまえにこの説明全体を読むこと。bodyでカレントバッファを切り替えても
save-restriction
はもとのバッファ(バッファの制限を保存したバッファ)に 制限を復元するが、もとのカレントバッファには戻さない。
save-restriction
はポイントやマークは復元しない。 それにはsave-excursion
を使う。save-restriction
とsave-excursion
の両者を 一緒に使うときには、save-excursion
が先に(外側に)くること。 さもないと、古いポイント値は一時的なナロイングが有効な状態で復元される。 古いポイント値が一時的なナロイングの範囲外にあると正しく復元できない。スペシャルフォーム
save-restriction
は、 参照可能部分の先頭と末尾をバッファの先頭と末尾からの距離として記録する。 いいかえれば、参照可能部分の前後の参照できないテキストの量を記録する。この方法は、bodyでさらにナロイングしても正しい結果を生じる。 しかし、bodyでワイドニングして保存されているナロイングの範囲外を 変更すると
save-restriction
が混乱する。 このようにしたいときには、save-restriction
は正しい解法ではない。 つぎのようにする必要がある。(let ((beg (point-min-marker)) (end (point-max-marker))) (unwind-protect (progn body) (save-excursion (set-buffer (marker-buffer beg)) (narrow-to-region beg end))))
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 ----------