前: Excursions, 上: Positions


29.4 ナロイング

ナロイング(narrowing)とは、 Emacsの編集コマンドが参照できるテキストを バッファの制限された文字の範囲に限定することです。 参照できるテキストのことをバッファの 参照可能部分(accessible portion)と呼びます。

ナロイングは、参照可能部分の先頭と末尾になる2つのバッファ内位置で指定します。 ほとんどの編集コマンドやほとんどのEmacs基本関数にとっては、 これらの位置はバッファの先頭や末尾の値を置き換えることになります。 ナロイングしていると、参照可能部分の外側のテキストは表示されませんし、 ポイントは参照可能部分の外側へは移動できません。

通常はバッファの先頭から数える位置や行番号などの値は ナロイングしていても同様に数えますが、 それらを使う関数は参照できないテキストを操作することを拒否します。

バッファを保存するコマンドはナロイングの影響を受けません。 つまり、ナロイングに関係なくバッファ全体を保存します。

— コマンド: narrow-to-region start end

この関数は、カレントバッファのstartで始まりendで終る部分を 参照可能部分にする。 どちらの引数も文字の位置であること。

対話的に呼び出されると、startendは 現在のリージョンの境界(ポイントとマークの小さいほうがさきにくる)である。

— コマンド: narrow-to-page move-count

このコマンドは、カレントバッファの参照可能部分を 現在のページのみを含むようにする。 省略可能な第1引数move-countnil以外であると、 move-countページだけ前方か後方へ移動してから 1ページ分にナロイングする。 変数page-delimiterがページの開始箇所と終了箇所を指定する (see Standard Regexps)。

対話的に呼び出されると、move-countは数値前置引数である。

— コマンド: widen

この関数は、カレントバッファのナロイングを解除し、 全体を参照できるようにする。 これをワイドニング(widening)と呼ぶ。 これはつぎの式と等価である。

          (narrow-to-region 1 (1+ (buffer-size)))
     
— 特殊型: save-restriction body...

このスペシャルフォームは、現在の参照可能部分の境界を保存し、 フォームbodyを評価し、最後に、保存した境界を復元して まえと同じナロイング状態(あるいはナロイングなし)に復元する。 throwやエラーによる異常脱出(see Nonlocal Exits)であっても、 ナロイング状態を復元する。

save-restrictionの戻り値は、bodyの最後の結果であるか、 bodyを与えなければnilである。

注意: 構文save-restrictionを使うときには まちがいやすい。 使うまえにこの説明全体を読むこと。

bodyでカレントバッファを切り替えても save-restrictionはもとのバッファ(バッファの制限を保存したバッファ)に 制限を復元するが、もとのカレントバッファには戻さない。

save-restrictionはポイントやマークは復元しない。 それにはsave-excursionを使う。 save-restrictionsave-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 ----------