Previous: , Up: ポジション   [Contents][Index]


31.4 ナローイング

ナローイング(narrowing)とはEmacs編集コマンドがアドレス指定可能なテキストを、あるバッファー内の制限された文字範囲に限定することを意味します。アドレス可能なテキストは、そのバッファーのアクセス可能範囲(accessible portion)と呼ばれます。

ナローイングは2つのバッファー位置により指定されるもので、それらの位置がアクセス可能範囲の開始と終了になります。ほとんどの編集コマンドやプリミティブにたいして、これらの位置はそれぞれそのバッファーの先頭と終端に置き換えられます。ナローイングが効果をもつ間にはアクセス可能範囲外のテキストは表示されず、その外部にポイントを移動することはできません。ナローイングは実際のバッファー位置(ポイントを参照)を変更しないことに注意してください。ほとんどの関数はアクセス可能範囲外のテキストにたいする操作を受け入れません。

バッファーを保存するコマンドはナローイングの影響を受けません。どんなナローイングであろうと、それらはバッファー全体を保存します。

単一バッファー内にタイプが大きく異なるテキストを複数表示する必要がある場合には、2つのバッファー間でのテキストの交換で説明する代替機能の使用を考慮してください。

Command: narrow-to-region start end

この関数はアクセス可能範囲の開始と終了にカレントバッファーのstartendをセットする。どちらの引数も文字位置で指定すること。

インタラクティブな呼び出しでは、startendはカレントリージョンにセットされる(ポイントとマークで小さいほうが前者)。

ただしlabel引数(以下参照)を指定したwith-restrictionによってナローイングがセットされている際には、そのナローイングの制限の範囲内にたいしてのみnarrow-to-regionを使用できる。startendがこの制限の範囲外であれば、with-restrictionによってセットされた対応する制限がかわりに使用される。バッファーのそれ以外の部分へのアクセスを取得するには、同じlabelを指定してwithout-restrictionを使えばよい。

Command: narrow-to-page &optional move-count

この関数はカレントページだけを含むようにカレントバッファーのアクセス可能範囲をセットする。1つ目のオプション引数move-countが非nilなら、move-countで前方か後方へ移動後に1ページにナローすることを意味する。変数page-delimiterはページの開始と終了の位置を指定する(編集で使用される標準的な正規表現を参照)。

インタラクティブな呼び出しではmove-countには数プレフィクス引数がセットされる。

Command: widen

この関数はカレントバッファーにたいするすべてのナローイングをキャンセルする。これはワイドニング(widening)と呼ばれる。これは以下の式と等価:

(narrow-to-region 1 (1+ (buffer-size)))

ただしlabel引数(以下参照)を指定したwith-restrictionによってナローイングがセットされている際には、ナローイングをキャンセルするかわりにwith-restrictionでセットした制限がリストアされる。バッファーのそれ以外の部分へのアクセスを取得するには、同じlabelを指定してwithout-restrictionを使えばよい。

Function: buffer-narrowed-p

この関数はそのバッファーがナローされていれば非nil、それ以外はnilをリターンする。

Special Form: save-restriction body…

このスペシャルフォームはアクセス可能範囲のカレントのバインドを保存してbodyを評価、その後に以前有効だったナローイング(またはナローイングがない状態)と同じ状態になるように、最後に保存された境界をリストアする。ナローイングの状態は、throwやエラーを通じたアブノーマルexit(非ローカル脱出を参照)イベント内においてもリストアされる。したがってこの構文は一時的にバッファーをナローする明快な手段である。

この構文はlabel引数(以下参照)とともにwith-restrictionによってセットされたナローイングの保存とリストアも行う。

save-restrictionがリターンする値はbody内の最後のフォームのリターン値、bodyフォームが与えられなければnil

注意: save-restriction使用の際は間違いを起こしやすい。これを試みる前にこの説明全体に目を通すこと。

bodyがカレントバッファーを変更する場合でもsave-restrictionは依然として元のバッファー(その制限が保存されたバッファー)上の制限をリストアするが、カレントバッファー自体はリストアしない。

save-restrictionはポイントをリストアしない。これを行うにはsave-excursionを使用する。save-restrictionsave-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 ----------
Special Form: with-restriction start end [:label label] body

このスペシャルフォームはバッファーのアクセス可能範囲のカレント境界を保存、startで始まりendで終わるアクセス可能範囲をセットしてbodyフォームを評価、それから保存してある境界をリストアする。この場合は以下と等しい

(save-restriction
  (narrow-to-region start end)
  body)

オプション引数label (使用するラベルを取得するために評価される; 非nil値が生成されなければならない)が与えられた場合には、そのナローイングはラベル付け(labeled)される。ラベル付けされたナローイングは、ラベル付けされていないナローイングといくつかの点で異なる:

  • bodyフォームの評価の間は、narrow-to-regionwidenが使えるのはstartからendまでの制限の内部のみ。
  • with-restrictionでセットされた制限を解除してバッファーの他の部分へのアクセスを取得するためには、同じlabel引数を使ってwithout-restrictionを呼び出す(バッファーの他の部分へのアクセスを取得する別の方法としてインダイレクトバッファーの使用がある; インダイレクトバッファーを参照)。
  • ラベル付けされたナローイングはネストできる。
  • ラベル付けされたナローイングはLispプログラムでのみ使用できる。このナローイングは表示上で可視になることはなく、ユーザーがセットしたナローイングに干渉することもない。

オプション引数labelとともにwith-restrictionを使う場合には、あなたのコードを呼び出す他のLispプログラムが必要に応じてナローイングを解除できるように、これを使う関数のdoc文字列でそのlabelのドキュメントを記述することを推奨する。

Special Form: without-restriction [:label label] body

このスペシャルフォームはバッファーのアクセス可能範囲のカレント境界を保存、そのバッファーをワイドニングしてからbodyフォームを評価、それから保存した境界をリストアする。この場合は以下と等しい

(save-restriction
  (widen)
  body)

オプション引数labelが与えられた場合には、同じlabel引数のwith-restrictionでセットされたナローイングが解除される。