GNU Emacs 32.0.50 (9008bf64c3) のマニュアルを PLaMo 翻訳で機械翻訳したものです。誤訳を含むことがあります。原文: https://www.gnu.org/software/emacs/manual/html_node/elisp/Narrowing.html ・ emacs-doc.conao3.com

31.4 狭義化

ナローイングとは、Emacsの編集コマンドで指定可能なテキストを、バッファ内の限られた文字範囲に制限することを指します。指定可能なまま残るテキストは、バッファのアクセス可能領域と呼ばれます。

ナローイングは2つのバッファ位置で指定され、これらがアクセス可能領域の開始位置と終了位置となります。ほとんどの編集コマンドやプリミティブにおいて、これらの位置がバッファの開始位置および終了位置の値を置き換えます。ナローイングが有効な間は、アクセス可能領域外のテキストは表示されず、ポイントをアクセス可能領域の外に移動させることもできません。なお、ナローイングは実際のバッファ位置を変更するわけではなく(Pointを参照)、どの位置をバッファのアクセス可能領域とみなすかを決定するだけです。ほとんどの関数は、アクセス可能領域外のテキストに対しては動作しません。

バッファを保存するコマンドはナローイングの影響を受けず、いかなるナローイングに関わらずバッファ全体を保存します。

単一のバッファに性質の大きく異なる数種類のテキストを表示する必要がある場合は、2つのバッファ間でのテキスト入れ替えで説明されている代替手段の利用を検討してください。

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

この関数は、現在のバッファのアクセス可能な範囲を、start から始まり end で終わるように設定します。両方の引数は文字位置である必要があります。

インタラクティブコールでは、start と end に現在の領域の境界(点とマークのうち、小さい方を先に)が設定されます。

ただし、ラベル引数(後述)を用いて with-restriction で狭域が設定されている場合、narrow-to-region はその狭域の範囲内でのみ使用可能です。start または end がこれらの範囲外にある場合は、代わりに with-restriction で設定された対応する範囲が使用されます。バッファの他の領域にアクセスするには、同じラベルを指定して without-restriction を使用してください。

コマンド: narrow-to-page &optional move-count

この関数は、現在のバッファのアクセス可能な範囲を、現在のページのみを含むように設定します。オプションの第1引数 move-count 非 nil を指定すると、move-count ページ分前進または後退し、その後1ページに絞ります。変数 page-delimiter は、ページの開始位置と終了位置を指定します(編集で使用される標準正規表現を参照してください)。

インタラクティブコールでは、move-count に数値プレフィックス引数が設定されます。

コマンド: widen

この関数は、現在のバッファにおける絞り込みを解除し、内容全体にアクセスできるようにします。これをワイド化と呼びます。これは、以下の式と等価です。

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

ただし、ラベル引数(後述)を指定して with-restriction で狭めが設定されている場合、with-restriction で設定された制限は解除されるのではなく、復元されます。バッファの他の領域にアクセスするには、同じラベルを指定して without-restriction を使用してください。

関数: buffer-narrowed-p

この関数は、バッファがナローされている場合は non-nil を、そうでない場合は nil を返します。

特殊形式: save-restriction body…

この特殊な形式は、アクセス可能な部分の現在の境界を保存し、body 形式を評価し、最後に保存した境界を復元することで、以前に有効だったのと同じ狭窄状態(またはその不在)を復元します。throw による異常終了やエラーが発生した場合でも、狭窄状態は復元されます(非局所脱出を参照)。したがって、この構文はバッファを一時的に狭窄させるための簡潔な方法となります。

このコンストラクトは、ラベル引数(後述)を用いて with-restriction で設定された狭めの設定を保存し、復元します。

save-restriction が返す値は、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 ----------
特殊形式: with-restriction start end [:label label] body

この特殊フォームは、バッファのアクセス可能領域の現在の境界を保存し、アクセス可能領域の開始位置をstart、終了位置をendに設定し、bodyフォームを評価した上で、保存した境界を復元します。この場合、以下と同等になります。

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

使用するラベルを取得するために評価され、かつ nil 以外の値を返す必要があるオプション引数 label が存在する場合、その絞り込みはラベル付きとなります。ラベル付きの絞り込みは、ラベルなしのものとはいくつかの点で異なります:

  • body形式の評価において、narrow-to-regionおよびwidenはstartおよびendの範囲内でのみ使用可能です。
  • with-restriction によって導入された制限を解除し、バッファの他の領域にアクセスするには、同じ label 引数を用いて without-restriction を使用します。(バッファの他の領域にアクセスする別の方法として、間接バッファを使用する方法があります(間接バッファ を参照)。)
  • ラベル付き狭窄は入れ子にできます。
  • ラベル付きナローイングはLispプログラム内でのみ使用可能です。ディスプレイ上に表示されることはなく、ユーザーが設定したナローイングと干渉することもありません。

with-restriction をオプション引数 label と共に使用する場合、その label を、当該引数を利用する関数のドキュメント文字列に記載しておくことを推奨します。これにより、コードが呼び出す他の Lisp プログラムが、必要に応じてラベル付きナローイングを解除できるようになります。

特殊形式: without-restriction [:label label] body

この特殊形式は、バッファのアクセス可能な領域の現在の境界を保存し、バッファの幅を広げ、body 形式を評価し、保存した境界を復元します。その場合、以下と同等になります。

(save-restriction
  (widen)
  body)

オプション引数 label が指定されている場合、同一の label 引数を持つ with-restriction によって設定された絞り込みが解除されます。