検索エンジンから来た人に注意

このマニュアルは、Emacs ver. 19.x 向けのマニュアルを Mule 2.x の開発にあたり邦訳したものを、 電脳外道学会がミラーリングしているものであり、旧版製品パラノイアであるところの椅子人の趣味によるものです。

しかしながら、現在の Emacs の主流は ver. 20 以降であり、ver 19.x と ver 20.x とでは、仕様の違いが少なからずあります。

したがって、一般的な Emacs ユーザーにとっては、 このマニュアルと実機の動作とが符合しない場合があります。
特に、公開用の Emacs Lisp コードを書こうとする人は、 新バージョンのマニュアル(英語)を参照することを強くおすすめします。


トップページ&リンク | マニュアルの目次 | 検索
Go to the first, previous, next, last section, table of contents.


位置

位置(position)はバッファ・テキスト中の文字を指すものです。 もっと詳しくいえば、位置は文字と文字との間(あるいは最初の文字の前、 または最後の文字の後)を指すものなので、その文字はある位置の前あるいは後にある、 ということができます。しかしたいてい、その文字のことをその位置「に」あると いって、その位置の後ろにあることを意味します。

位置は通常1から始まる整数で表現しますが、マーカ(marker)で表現する こともできます。マーカはテキストが挿入あるいは削除されても、 マーカを挟む文字がある場所にそのまま留まるように自動的に再配置される 特別なオブジェクトです。See section マーカ

ポイント

ポイント(point)は特別なバッファ位置で、タイプされた文字の自己挿入や テキスト挿入関数を含む、多くの編集コマンドで使われます。ポイントを使う ほかのコマンドは、異なる場所での編集や挿入ができるように、ポイントを テキスト内で移動させます。

ほかの位置同様に、ポイントは特定の文字というよりは、文字と文字の間 (あるいは最初の文字の前、または最後の文字の後)の場所を示します。 普通、端末ではカーソルはポイント直後の文字の上に表示されます。 ポイントは実際はカーソルがある文字の前にあります。

ポイントの値は 1〜バッファ・サイズ+1 の間の数です。ナローイング中には (see section ナローイング)ポイントはバッファのアクセス可能部分 (おそらくはその一端)に収まるように拘束されます。

各バッファはそれ自身固有のポイントの値を持っています。ほかのバッファの ポイントの値とは独立です。各ウィンドウも同様にポイントの値を持っていて、 同じバッファのほかのウィンドウでのポイントの値とは独立です。 これが同じバッファを表示するさまざまなウィンドウにおいて、 異なる値のポイントをもつことができる理由です。バッファが一つのウィンドウのみに 現れている場合は、バッファのポイントとウィンドウのポイントは普通同じ値を 持ちます。よってこれらの区別はあまり重要ではありません。 詳細は、See section ウィンドウとポイント

Function: point
この関数は、カレント・バッファのポイントの値を整数で返します。
(point)
     => 175

Function: point-min
この関数は、カレント・バッファでのポイントのアクセス可能な値の最小値を 返します。これは通常1ですが、ナローイング中には、ナローイングしたリージョンの 先頭位置となります(See section ナローイング)。

Function: point-max
この関数は、カレント・バッファでのポイントのアクセス可能な値の最大値を 返します。これは通常(1+ (buffer-size))ですが、ナローイング中には、 ナローイングしたリージョンの末尾位置となります(See section ナローイング)。

Function: buffer-end flag
この関数は、flagが1よりも小さければ、(point-min)を返し、 それ以外では(point-max)を返します。引数flagは、数でなければ なりません。

Function: buffer-size
この関数は、カレント・バッファ中の全文字数を返します。ナローイング (see section ナローイング)していないときならば、point-maxはこの値より 1大きい値を返します。
(buffer-size)
     => 35
(point-max)
     => 36

移動

移動関数はポイントの値を変えます。ポイントの現在の値、あるいはバッファの 先頭または末尾、あるいは選択されたウィンドウの端のいずれかからの相対的な値に 変えます。See section ポイント

文字単位での移動

これら関数は文字単位で数えたポイント移動をします。goto-charが 基本的なプリミティブです。ほかの関数はこれを使っているだけです。

Command: goto-char position
この関数は、カレント・バッファのポイントをpositionの値に設定します。 positionが1よりも小さいときは、バッファ先頭にポイントを移動します。 positionがバッファ長よりも大きいときは、バッファ末尾にポイントを 移動します。

ナローイング中でも、positionはバッファ先頭から数えますが、 ポイントはアクセス可能部分の外には出られません。positionが範囲外ならば、 goto-charはポイントをアクセス可能部分の先頭あるいは末尾に移動します。

この関数が対話的に呼ばれた場合、数値前置引数があればpositionになります。 そうでなければ、ミニバッファから読み込みます。

goto-charpositionを返します。

Command: forward-char &optional count
この関数は、ポイントをcount文字前方に、バッファ末尾に向かって進めます (もしcountが負ならば、後方に、バッファ先頭に向かって進めます)。 関数がポイントをバッファの先頭あるいは末尾を (あるいはナローイング中ならばアクセス可能部分の限界を) 超えて進めようとすると、エラー・コードbeginning-of-bufferあるいは end-of-bufferをともなうエラーが通知されます。

対話的呼出しでは、countは数値前置引数です。

Command: backward-char &optional count
この関数は、ポイントをcount文字後方に、バッファ先頭に向かって進めます (もしcountが負ならば、前方に、バッファ末尾に向かって進めます)。 関数がポイントをバッファの先頭あるいは末尾を (あるいはナローイング中ならばアクセス可能部分の限界を) 超えて進めようとすると、エラー・コードbeginning-of-bufferあるいは end-of-bufferをともなうエラーが通知されます。

対話的呼出しでは、countは数値前置引数です。

単語単位での移動

これら語を解析する関数は、ある文字が語の一部であるか否かを決定するために 構文テーブルを使います。See section 構文テーブル

Command: forward-word count
この関数は、ポイントをcount語前方に(あるいはcountが負ならば後方に) 移動します。通常tを返します。この移動でバッファ先頭あるいは末尾に、 あるいはナローイング中のアクセス可能部分の限界に、達したならば、 ポイントはそこで止まり、戻り値はnilとなります。

対話的呼出しでは、countは数値前置引数です。

Command: backward-word count
この関数は、forward-wordと全く同じですが、前方ではなく、 語頭に達するまで後方に移動するところが違います。

対話的呼出しでは、countは数値前置引数です。

この関数をプログラム中で使うことは滅多にありません。 forward-wordを負の引数で呼び出す方がよほど効率がいいからです。

Variable: words-include-escapes
この変数は、forward-wordやそれを使うもの全ての振舞に影響します。 非nilならば、「エスケープ」と「文字quote」構文クラスの文字を 語の一部として数えます。nilならば、そうしません。

バッファの端への移動

バッファ先頭へポイントを移動するには、こう書きます:

(goto-char (point-min))

同様に、バッファ末尾へ移動するには、これを使います:

(goto-char (point-max))

ここにユーザがこういったことを行なうための二つのコマンドを示します。 ここで説明するのは、Lispプログラムで使用しないように警告するためです。 というのも、これらはマークを設定し、エコー領域にメッセージを表示するからです。

Command: beginning-of-buffer &optional n
この関数は、ポイントをバッファ先頭に(あるいはナローイング中ならば、 アクセス可能部分の限界に)移動し、マークを以前の位置に設定します。nが 非nilならば、ポイントをバッファ先頭からn割のところに置きます。

対話的呼出しでは、数値前置引数があればnになります。 なければnnilがデフォルトです。

この関数をLispプログラムで使ってはなりません!

Command: end-of-buffer &optional n
この関数は、ポイントをバッファ末尾に(あるいはナローイング中ならば、 アクセス可能部分の限界に)移動し、マークを以前の位置に設定します。nが 非nilならば、ポイントをバッファ末尾からn割のところに置きます。

対話的呼出しでは、数値前置引数があればnになります。 なければnnilがデフォルトです。

この関数をLispプログラムで使ってはなりません!

テキスト行単位での移動

テキスト行は改行文字で区切られたバッファの部分です。 改行文字は行末にあるとみなします。第1のテキスト行はバッファ先頭から始まり、 最後のテキスト行は、バッファ最後の文字が改行であろうとなかろうと、 バッファ末尾で終ります。バッファのテキスト行への分割は、ウィンドウの幅にも、 表示での行継続にも、タブや制御文字がどのように表示されようとも、 影響されません。

Command: goto-line line
この関数は、バッファ先頭を1と数えた、line番目の行頭にポイントを 移動します。lineが1よりも小さければ、ポイントをバッファの先頭に 移動します。lineがバッファの行数よりも大きいならば、バッファ末尾に ポイントを移動します(即ち、バッファの最後の行の行末に移動します)。 これはgoto-lineで行頭に移動しない唯一の例です。

ナローイング中でも、lineはバッファ先頭から数えますが、 ポイントはアクセス可能部分の外には出られません。したがって、goto-lineは ポイントをアクセス可能部分の先頭あるいは末尾に移動します。

goto-lineの戻り値は、lineと(ナローイングを考えに入れない、 完全なバッファで)ポイントが実際に移動することができた行の行番号との差です。 よって、スキャンがバッファの実際の末尾に達した場合は、正の値となります。 スキャンが実際のバッファ末尾ではなく、アクセス可能部分の末尾に達したときには、 0の値となります。(26)

対話的呼出しでは、数値前置引数があればlineになります。 なければlineはミニバッファで読み込みます。

Command: beginning-of-line &optional count
この関数は、ポイントを現在の行の行頭に移動します。引数countnilでも1でもないならば、count-1行前方に進んで、 その行頭に移動します。

この関数がバッファ(あるいはナローイング中のアクセス可能部分)末尾に達すると、 ポイントをそこに置きます。エラーは通知されません。

Command: end-of-line &optional count
この関数は、ポイントを現在の行の行末に移動します。引数argnilでも 1でもないならば、count-1行前方に進んで、その行末に移動します。

この関数がバッファ(あるいはナローイング中のアクセス可能部分)末尾に達すると、 ポイントをそこに置きます。エラーは通知されません。

Command: forward-line &optional count
この関数は、ポイントをcount行前方に移動し、行頭に置きます。 countが負ならば、ポイントを-count行後方に進め、 行頭に置きます。countが0ならば、ポイントを現在の行の行頭に移動します。

forward-lineが指定行以前にバッファ(あるいはアクセス可能部分)先頭 あるいは末尾に達すると、そこにポイントを置きます。エラーは通知されません。

forward-lineは、countと実際に移動することができた行数との差を 返します。たった3行しかないバッファで、先頭から下に5行移動しようとすると、 ポイントは最後の行の行末で止まって、戻り値は2になります。

対話的呼出しでは、countは数値前置引数です。

Function: count-lines start end
この関数は、カレント・バッファの位置startと位置endの間にある行数を 返します。startendが等しければ、0を返します。そうでなければ、 たとえstartendが同じ行にあっても、少なくとも1を返します。 これは、それらの間にあるテキストは、隔離して考えると、空でないかぎり少なくとも 1行はないとおかしいからです。

count-linesの使用例です:

(defun current-line ()
  "Return the vertical position of point..."
  (+ (count-lines (window-start) (point))
     (if (= (current-column) 0) 1 0)
     -1))

section ポイント近くのテキストの検査の関数bolpeolpも見てください。 これら関数はポイントを移動しませんが、それがすでに行頭あるいは行末に あるかないかを検査します。

画面行単位での移動

前節の行を扱う関数では、改行文字のみで区切られるテキスト行を 単位としました。一方、ここで述べる関数はテキストの画面への現れ方による 画面行を単位とします。テキスト行1行は、それが十分に短く、選択された ウィンドウの幅に収まるならば、1行の画面行になります。しかしそうでない場合は 画面行何行かに渡ることがあります。

いくつかの場合、テキスト行は次の画面行に継続しないで、画面分で 打ち切られることがあります。これらの場合、vertical-motionは ポイントをforward-lineと同じように移動します。See section 切捨て表示

与えられた文字列の幅はある種の文字の表示を制御するフラグに依存するので、 与えられたテキストについてのvertical-motionの振舞は、 そのテキストが入っているバッファ、さらには選択されたウィンドウによっても 異なります(幅、打ち切りフラグ、表示テーブルはウィンドウごとに違うかも しれないので)。See section 普通の表示方法

これら関数は、画面行がどこで区切られるかを判別するためにテキストを スキャンします。そのため、スキャンした長さに比例して時間がかかります。 これらを重点的に使用するのであれば、Emacsが用意しているキャッシュを 自作コードの性能向上のために使うことができます。 See section テキスト行単位での移動

Function: vertical-motion count &optional window
この関数は、count画面行下にある画面行の始めにポイントを移動します。 countが負ならば、代わりに上に移動します。

vertical-motionは移動した行数を返します。バッファ先頭か末尾に 達した場合は、戻り値は絶対値でcountよりも小さくなるかも知れません。

ウィンドウwindowは幅、水平スクロール、表示テーブルなどのパラメータを 得るために使用します。しかしvertical-motionは、たとえwindowが 現在何かほかのバッファを表示していたとしても、常にカレント・バッファに対して 作用します。

Command: move-to-window-line count
この関数は、選択されたウィンドウに現在表示されているテキストについてポイントを 移動します。ウィンドウの上端からcount行目の画面行の先頭にポイントを 移動します。countが負ならば、下(あるいはバッファが指定した画面位置より 上で終っているならば、バッファ最後の行)から-count行目の 位置を指します。

countnilならば、ウィンドウの真中の行頭にポイントを移動します。 countの絶対値がウィンドウ・サイズよりも大きいならば、 ウィンドウが十分高かったならば表示されたであろう画面行の位置にポイントが 移動します。これによってその位置を画面に持ってくるためのスクロールを行なう 再描画が起きる可能性があります。

対話的呼出しでは、countは数値前置引数です。

戻り値はポイントが移動した画面行番号です。ウィンドウ上端の行を0と数えます。

Function: compute-motion from frompos to topos width offsets window
この関数は、カレント・バッファをスキャンし、画面位置を計算します。位置 fromが画面座標fromposにあると仮定し、そこから、位置to あるいは座標toposのいずれか先にきた方までバッファを前方にスキャンします。 この関数は、スキャンが終ったバッファ位置と画面座標を返します。

座標引数frompostoposは、(hpos . vpos)という 形式のコンス・セルです。

引数windowはテキスト表示に使える桁数です。これは継続行の扱いに 影響します。選んだウィンドウについてwindow-widthが返した値を 使いましょう。通常は(window-width window)を使用します。

引数offsetは、nilあるいは(hscroll . tab-offset) という形式のコンス・セルのいずれかです。ここでhscrollは左端で表示されて いない桁数です。呼び手はほとんどの場合window-hscrollからこの値を 得ます。一方tab-offsetは画面の桁数とバッファの桁数とのオフセットです。 継続行で、それまでの画面行の幅の合計がtab-widthの整数倍に ならないときに、この値が非0になり得ます。非継続行においては必ず0になります。

ウィンドウwindowは、どの表示テーブルを使うかを指定するためだけに 働きます。compute-motionは常にカレント・バッファに作用します。 windowにどのバッファが表示されているかは関係ありません。

戻り値は要素が五つのリストです:

(pos vpos hpos prevhpos contin)

ここでposはスキャンが停止したバッファ位置で、vposは垂直画面位置、 hposは水平画面位置です。

結果のprevhposposから1文字戻った水平位置です。 結果continはその最後の行が先の直前の文字に継続するならば、tです。

たとえば、あるウィンドウの行linecolのバッファ位置を見つけるには、 ウィンドウの表示開始位置をfromとして、ウィンドウの左上座標を fromposとして渡します。バッファの(point-max)toとして渡して スキャンがバッファのアクセス可能部分の末尾を限界とするようにし、 linecoltoposとして渡します。これを行なう関数を挙げます:

(defun coordinates-of-position (col line)
  (car (compute-motion (window-start)
                       '(0 . 0)
                       (point-max)
                       (cons col line)
                       (window-width)
                       (cons (window-hscroll) 0)
                       (selected-window))))

compute-motionをミニバッファに対して使用する場合は、 第1画面行の行頭の水平位置を取るために、minibuffer-prompt-widthを 使う必要があります。See section ミニバッファそのほか

釣り合った式をまたがる移動

ここに括弧が釣り合った式(Emacsでは、それらをまたがる移動に関するときは S式(sexp)とも呼びます)に関する関数をいくつか挙げます。構文テーブルは これら関数がさまざまな文字をどう解釈するかを制御します。section 構文テーブル 参照。S式のあるいはS式の部分のスキャンのための、より低水準なプリミティブに ついては、See section 釣り合った式の解析。ユーザレベルのコマンドについては、 section `Lists and Sexps' in GNU Emacs Manualを参照。

Command: forward-list arg
この関数は、arg個の釣り合った括弧群をまたがって前方に移動します (ほかの構文要素たとえば語や対になる文字列quoteは無視します)。

Command: backward-list arg
この関数は、arg個の釣り合った括弧群をまたがって後方へ移動します (ほかの構文要素たとえば語や対になる文字列quoteは無視します)。

Command: up-list arg
この関数は、arg段の括弧の外へ向けて前方に移動します。 負の引数は後方に、しかしさらに浅い場所に向けての移動を意味します。

Command: down-list arg
この関数は、arg段の括弧の中へ向けて前方に移動します。 負の引数は後方に、しかしさらに深い括弧に向けて(-arg段)の 移動を意味します。

Command: forward-sexp arg
この関数は、arg個の釣り合った式をまたがって前方に移動します。 釣り合った式には括弧で区切られたものや、ほかの種類の語や文字列定数などの 両方を含みます。たとえば、こうなります。
---------- Buffer: foo ----------
(concat-!- "foo " (car x) y z)
---------- Buffer: foo ----------

(forward-sexp 3)
     => nil

---------- Buffer: foo ----------
(concat "foo " (car x) y-!- z)
---------- Buffer: foo ----------

Command: backward-sexp arg
この関数は、arg個の釣り合った式をまたがって後方に移動します。

Command: beginning-of-defun arg
この関数は、arg番目の関数定義の先頭に向けて後方に移動します。 argが負なら、実際に前方に移動しますが、 やはり関数定義の先頭に移動し、その末尾には移動しません。

Command: end-of-defun arg
この関数は、arg番目の関数定義の末尾に向けて前方に移動します。 argが負なら、実際に後方に移動しますが、 やはり関数定義の末尾に移動し、その先頭には移動しません。

User Option: defun-prompt-regexp
nilならば、この変数はどんなテキストが、関数定義を開始する開き括弧の 前に現れるかを指定する正規表現を保持します。つまり、関数定義は この正規表現に一致するもので開始し、続いて開き括弧構文の文字がある、 そういう行で始まります。

文字を飛ばす

以下の二つの関数は指定した集合の文字を超えるようにポイントを移動します。 たとえば、空白を飛ばすためによく使います。関連する関数については、 section 移動と構文を参照してください。

Function: skip-chars-forward character-set &optional limit
この関数は、カレント・バッファで、与えられた集合の文字を飛ばして、ポイントを 前方に移動します。ポイントの次の文字を調べて、それがcharacter-setに 一致するならポイントを進めます。これを一致しない文字に達するまで繰り返します。 この関数は、nilを返します。

引数character-setは正規表現の`[...]'の中のようにします。 ただし、`]'はもはや特殊ではなく、`\'`^', `-', `\'を quoteするところが違います。そのため、"a-zA-Z"で全ての英文字を飛ばし、 最初の非英文字の前で停止し、"^a-zA-Z"で非英文字を飛ばして最初の 英文字の前で停止します。See section 正規表現

limit(数かマーカでなければならない)を与えると、これがバッファにおいて ポイントが進める最大位置の指定になります。ポイントはlimitで、あるいは その前で停止します。

以下の例では、ポイントは最初`T'のすぐ前に位置します。形式の評価後、 ポイントはその行末(`hat'`t'と改行の間)に位置します。 この関数は全ての英文字とスペースを飛ばしますが、改行は飛ばしません。

---------- Buffer: foo ----------
I read "-!-The cat in the hat
comes back" twice.
---------- Buffer: foo ----------

(skip-chars-forward "a-zA-Z ")
     => nil

---------- Buffer: foo ----------
I read "The cat in the hat-!-
comes back" twice.
---------- Buffer: foo ----------

Function: skip-chars-backward character-set &optional limit
この関数は、character-setに一致する文字を飛ばして、limitまで ポイントを後方に移動します。skip-chars-forwardと全く同じですが、 移動の方向が違います。

脱線

プログラムのある限定された範囲内で「一時的に」ポイントを移動したり、 一時的にバッファを切替えたりすることが、便利なこともあります。これを 脱線(excursion)と呼び、save-excursionという特殊形式で 行ないます。この構文要素は、脱線が完了したときにカレント・バッファと そのポイントおよびマークを復元できるように、これらを保存します。

ウィンドウの構成の保存と復元のための形式は、別の場所で説明します (section ウィンドウ構成と、see section フレーム構成を参照)。

Special Form: save-excursion forms...
save-excursion特殊形式はカレント・バッファが何であったか (27)とその中のポイントおよびマークの値を保存し、 formsを評価して、最後に、バッファとその保存されたポイントおよび マークの値を復元します。三つの保存された値全てが、throwやエラーによる 異常終了(see section 非局所脱出)の場合にも復元されます。

save-excursion特殊形式は、プログラムの残りの部分への影響を避けて プログラムのある部分内でバッファを切替えたりポイントを移動するための 標準手法です。EmacsのLispソース中では、500回以上も使われています。

save-excursionは、ほかのバッファのポイントおよびマークの値は 保存しません。そのためほかのバッファでの変更はsave-excursionを抜けても そのまま有効です。

つけ加えると、save-excursionswitch-to-bufferのような 関数によって変えられたウィンドウ-バッファの対応は復元しません。 これら対応と選択されたウィンドウを復元する一つの方法は、 save-window-excursionsave-excursion内で使うことです (see section ウィンドウ構成)。

save-excursionが返す値は、formsの最終結果となるか、 あるいはformsが与えられなければnilとなります。

(save-excursion
  forms)
==
(let ((old-buf (current-buffer))
      (old-pnt (point-marker))
      (old-mark (copy-marker (mark-marker))))
  (unwind-protect
      (progn forms)
    (set-buffer old-buf)
    (goto-char old-pnt)
    (set-marker (mark-marker) old-mark)))

ナローイング

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

ナローイングは二つのバッファ位置によって指定され、それらが アクセス可能部分の先頭と末尾になります。ほとんどの編集コマンドやEmacsの プリミティブについて、これらの位置でバッファの先頭と末尾の値を置き換えます。 ナローイング中には、アクセス可能部分の外側のテキストは全く表示されず、 ポイントもアクセス可能部分の外側には移動できません。

位置や行番号といった値は、普通バッファ先頭から数えますし、 ナローイング中でも同じように数えます。しかし、これらを使う関数はアクセス不能な テキストを操作することは拒否します。

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

Command: narrow-to-region start end
この関数は、カレント・バッファのstartを先頭に、endを末尾にした アクセス可能部分を設定します。両引数は、文字位置でなければなりません。

対話的呼出しでは、startendには現在のリージョン境界 (ポイントとマークで、小さい方が先です)が設定されます。

Command: narrow-to-page move-count
この関数は、カレント・バッファの現在のページだけがアクセス可能部分となるように 設定します。オプションの第1引数move-countが非nilならば、 move-countページ前方あるいは後方に移動してからナローイングすることを 意味します。変数page-delimiterでどこがページが先頭と末尾であるのかを 指定します(see section 編集用の標準正規表現)。

対話的呼出しでは、move-countには数値前置引数が設定されます。

Command: widen
この関数は、カレント・バッファのあらゆるナローイングを取り消し、その結果中身 全てがアクセス可能になります。これをワイドニング(widening)と呼びます。 これは、次の式と等価です:
(narrow-to-region 1 (1+ (buffer-size)))

Special Form: save-restriction body...
本特殊形式はアクセス可能部分の現在の境界を保存し、bodyの形式を評価して、 最後に、保存した境界を復元して以前有効だったナローイング (あるいはそれがない状態)と同じ状態を復元します。ナローイングの状態は、 throwやエラーによる異常終了(see section 非局所脱出)の場合にも 復元されます。そのため、本構文要素は一時的なバッファのナローイングに きれいな方法です。

save-restrictionが返す値は、bodyの最後の形式が返す値となるか、 あるいはbodyに本体形式が与えられないならばnilとなります。

警告: save-restriction構文要素を使用する場合、 間違いを犯しやすいです。試す前にここにある全説明を読んでください。

bodyがカレント・バッファを変更しても、save-restrictionは それでも元のバッファ(制限を保存したバッファ)の制限を復元します。 しかし、カレント・バッファがなんであったかまでは復元しません。

save-restrictionはポイントおよびマークの復元は行ないません。 その目的にはsave-excursionを使ってください。save-restrictionsave-excursionとを両方一緒に使うときは、save-excursionが 先に(外側に)来なければなりません。さもなくば、古いポイントの値を 一時的ナローイングの最中に復元してしまうからです。 その場合、古いポイントの値が一時的ナローイングの限界の外にあると、 正確に復元できないことになります。

save-restriction特殊形式はアクセス可能部分の先頭と末尾の値を、 バッファの先頭と末尾からの距離で記録します。いいかえれば、これは アクセス可能部分の前後にあるアクセス不能なテキストの量を記録するのです。

この方法によって、bodyがさらにナローイングを行なった場合も 正しい結果が得られます。けれどもsave-restrictionbody本体がワイドニングを行って、保存されたナローイングの外側の範囲を 変更した場合には混乱するかもしれません。こういうことを行ないたい場合には、 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 ----------


Go to the first, previous, next, last section, table of contents.