検索エンジンから来た人に注意このマニュアルは、Emacs ver. 19.x 向けのマニュアルを Mule 2.x の開発にあたり邦訳したものを、 電脳外道学会がミラーリングしているものであり、旧版製品パラノイアであるところの椅子人の趣味によるものです。しかしながら、現在の Emacs の主流は ver. 20 以降であり、ver 19.x と ver 20.x とでは、仕様の違いが少なからずあります。 したがって、一般的な Emacs ユーザーにとっては、
このマニュアルと実機の動作とが符合しない場合があります。
|
位置(position)はバッファ・テキスト中の文字を指すものです。 もっと詳しくいえば、位置は文字と文字との間(あるいは最初の文字の前、 または最後の文字の後)を指すものなので、その文字はある位置の前あるいは後にある、 ということができます。しかしたいてい、その文字のことをその位置「に」あると いって、その位置の後ろにあることを意味します。
位置は通常1から始まる整数で表現しますが、マーカ(marker)で表現する こともできます。マーカはテキストが挿入あるいは削除されても、 マーカを挟む文字がある場所にそのまま留まるように自動的に再配置される 特別なオブジェクトです。See section マーカ。
ポイント(point)は特別なバッファ位置で、タイプされた文字の自己挿入や テキスト挿入関数を含む、多くの編集コマンドで使われます。ポイントを使う ほかのコマンドは、異なる場所での編集や挿入ができるように、ポイントを テキスト内で移動させます。
ほかの位置同様に、ポイントは特定の文字というよりは、文字と文字の間 (あるいは最初の文字の前、または最後の文字の後)の場所を示します。 普通、端末ではカーソルはポイント直後の文字の上に表示されます。 ポイントは実際はカーソルがある文字の前にあります。
ポイントの値は 1〜バッファ・サイズ+1 の間の数です。ナローイング中には (see section ナローイング)ポイントはバッファのアクセス可能部分 (おそらくはその一端)に収まるように拘束されます。
各バッファはそれ自身固有のポイントの値を持っています。ほかのバッファの ポイントの値とは独立です。各ウィンドウも同様にポイントの値を持っていて、 同じバッファのほかのウィンドウでのポイントの値とは独立です。 これが同じバッファを表示するさまざまなウィンドウにおいて、 異なる値のポイントをもつことができる理由です。バッファが一つのウィンドウのみに 現れている場合は、バッファのポイントとウィンドウのポイントは普通同じ値を 持ちます。よってこれらの区別はあまり重要ではありません。 詳細は、See section ウィンドウとポイント。
(point) => 175
(1+ (buffer-size))
ですが、ナローイング中には、
ナローイングしたリージョンの末尾位置となります(See section ナローイング)。
(point-min)
を返し、
それ以外では(point-max)
を返します。引数flagは、数でなければ
なりません。
point-max
はこの値より
1大きい値を返します。
(buffer-size) => 35 (point-max) => 36
移動関数はポイントの値を変えます。ポイントの現在の値、あるいはバッファの 先頭または末尾、あるいは選択されたウィンドウの端のいずれかからの相対的な値に 変えます。See section ポイント。
これら関数は文字単位で数えたポイント移動をします。goto-char
が
基本的なプリミティブです。ほかの関数はこれを使っているだけです。
ナローイング中でも、positionはバッファ先頭から数えますが、
ポイントはアクセス可能部分の外には出られません。positionが範囲外ならば、
goto-char
はポイントをアクセス可能部分の先頭あるいは末尾に移動します。
この関数が対話的に呼ばれた場合、数値前置引数があればpositionになります。 そうでなければ、ミニバッファから読み込みます。
goto-char
はpositionを返します。
beginning-of-buffer
あるいは
end-of-buffer
をともなうエラーが通知されます。
対話的呼出しでは、countは数値前置引数です。
beginning-of-buffer
あるいは
end-of-buffer
をともなうエラーが通知されます。
対話的呼出しでは、countは数値前置引数です。
これら語を解析する関数は、ある文字が語の一部であるか否かを決定するために 構文テーブルを使います。See section 構文テーブル。
count
が負ならば後方に)
移動します。通常t
を返します。この移動でバッファ先頭あるいは末尾に、
あるいはナローイング中のアクセス可能部分の限界に、達したならば、
ポイントはそこで止まり、戻り値はnil
となります。
対話的呼出しでは、countは数値前置引数です。
forward-word
と全く同じですが、前方ではなく、
語頭に達するまで後方に移動するところが違います。
対話的呼出しでは、countは数値前置引数です。
この関数をプログラム中で使うことは滅多にありません。
forward-word
を負の引数で呼び出す方がよほど効率がいいからです。
forward-word
やそれを使うもの全ての振舞に影響します。
非nil
ならば、「エスケープ」と「文字quote」構文クラスの文字を
語の一部として数えます。nil
ならば、そうしません。
バッファ先頭へポイントを移動するには、こう書きます:
(goto-char (point-min))
同様に、バッファ末尾へ移動するには、これを使います:
(goto-char (point-max))
ここにユーザがこういったことを行なうための二つのコマンドを示します。 ここで説明するのは、Lispプログラムで使用しないように警告するためです。 というのも、これらはマークを設定し、エコー領域にメッセージを表示するからです。
nil
ならば、ポイントをバッファ先頭からn割のところに置きます。
対話的呼出しでは、数値前置引数があればnになります。
なければnはnil
がデフォルトです。
この関数をLispプログラムで使ってはなりません!
nil
ならば、ポイントをバッファ末尾からn割のところに置きます。
対話的呼出しでは、数値前置引数があればnになります。
なければnはnil
がデフォルトです。
この関数をLispプログラムで使ってはなりません!
テキスト行は改行文字で区切られたバッファの部分です。 改行文字は行末にあるとみなします。第1のテキスト行はバッファ先頭から始まり、 最後のテキスト行は、バッファ最後の文字が改行であろうとなかろうと、 バッファ末尾で終ります。バッファのテキスト行への分割は、ウィンドウの幅にも、 表示での行継続にも、タブや制御文字がどのように表示されようとも、 影響されません。
goto-line
で行頭に移動しない唯一の例です。
ナローイング中でも、lineはバッファ先頭から数えますが、
ポイントはアクセス可能部分の外には出られません。したがって、goto-line
は
ポイントをアクセス可能部分の先頭あるいは末尾に移動します。
goto-line
の戻り値は、lineと(ナローイングを考えに入れない、
完全なバッファで)ポイントが実際に移動することができた行の行番号との差です。
よって、スキャンがバッファの実際の末尾に達した場合は、正の値となります。
スキャンが実際のバッファ末尾ではなく、アクセス可能部分の末尾に達したときには、
0の値となります。(26)
対話的呼出しでは、数値前置引数があればlineになります。 なければlineはミニバッファで読み込みます。
nil
でも1でもないならば、count-1行前方に進んで、
その行頭に移動します。
この関数がバッファ(あるいはナローイング中のアクセス可能部分)末尾に達すると、 ポイントをそこに置きます。エラーは通知されません。
nil
でも
1でもないならば、count-1行前方に進んで、その行末に移動します。
この関数がバッファ(あるいはナローイング中のアクセス可能部分)末尾に達すると、 ポイントをそこに置きます。エラーは通知されません。
forward-line
が指定行以前にバッファ(あるいはアクセス可能部分)先頭
あるいは末尾に達すると、そこにポイントを置きます。エラーは通知されません。
forward-line
は、countと実際に移動することができた行数との差を
返します。たった3行しかないバッファで、先頭から下に5行移動しようとすると、
ポイントは最後の行の行末で止まって、戻り値は2になります。
対話的呼出しでは、countは数値前置引数です。
count-lines
の使用例です:
(defun current-line () "Return the vertical position of point..." (+ (count-lines (window-start) (point)) (if (= (current-column) 0) 1 0) -1))
section ポイント近くのテキストの検査の関数bolp
とeolp
も見てください。
これら関数はポイントを移動しませんが、それがすでに行頭あるいは行末に
あるかないかを検査します。
前節の行を扱う関数では、改行文字のみで区切られるテキスト行を 単位としました。一方、ここで述べる関数はテキストの画面への現れ方による 画面行を単位とします。テキスト行1行は、それが十分に短く、選択された ウィンドウの幅に収まるならば、1行の画面行になります。しかしそうでない場合は 画面行何行かに渡ることがあります。
いくつかの場合、テキスト行は次の画面行に継続しないで、画面分で
打ち切られることがあります。これらの場合、vertical-motion
は
ポイントをforward-line
と同じように移動します。See section 切捨て表示。
与えられた文字列の幅はある種の文字の表示を制御するフラグに依存するので、
与えられたテキストについてのvertical-motion
の振舞は、
そのテキストが入っているバッファ、さらには選択されたウィンドウによっても
異なります(幅、打ち切りフラグ、表示テーブルはウィンドウごとに違うかも
しれないので)。See section 普通の表示方法。
これら関数は、画面行がどこで区切られるかを判別するためにテキストを スキャンします。そのため、スキャンした長さに比例して時間がかかります。 これらを重点的に使用するのであれば、Emacsが用意しているキャッシュを 自作コードの性能向上のために使うことができます。 See section テキスト行単位での移動。
vertical-motion
は移動した行数を返します。バッファ先頭か末尾に
達した場合は、戻り値は絶対値でcountよりも小さくなるかも知れません。
ウィンドウwindowは幅、水平スクロール、表示テーブルなどのパラメータを 得るために使用します。しかしvertical-motionは、たとえwindowが 現在何かほかのバッファを表示していたとしても、常にカレント・バッファに対して 作用します。
countがnil
ならば、ウィンドウの真中の行頭にポイントを移動します。
countの絶対値がウィンドウ・サイズよりも大きいならば、
ウィンドウが十分高かったならば表示されたであろう画面行の位置にポイントが
移動します。これによってその位置を画面に持ってくるためのスクロールを行なう
再描画が起きる可能性があります。
対話的呼出しでは、countは数値前置引数です。
戻り値はポイントが移動した画面行番号です。ウィンドウ上端の行を0と数えます。
座標引数fromposとtoposは、(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
は水平画面位置です。
結果のprevhposはposから1文字戻った水平位置です。
結果continはその最後の行が先の直前の文字に継続するならば、t
です。
たとえば、あるウィンドウの行line桁colのバッファ位置を見つけるには、
ウィンドウの表示開始位置をfromとして、ウィンドウの左上座標を
fromposとして渡します。バッファの(point-max)
をtoとして渡して
スキャンがバッファのアクセス可能部分の末尾を限界とするようにし、
lineとcolをtoposとして渡します。これを行なう関数を挙げます:
(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を参照。
---------- Buffer: foo ---------- (concat-!- "foo " (car x) y z) ---------- Buffer: foo ---------- (forward-sexp 3) => nil ---------- Buffer: foo ---------- (concat "foo " (car x) y-!- z) ---------- Buffer: foo ----------
nil
ならば、この変数はどんなテキストが、関数定義を開始する開き括弧の
前に現れるかを指定する正規表現を保持します。つまり、関数定義は
この正規表現に一致するもので開始し、続いて開き括弧構文の文字がある、
そういう行で始まります。
以下の二つの関数は指定した集合の文字を超えるようにポイントを移動します。 たとえば、空白を飛ばすためによく使います。関連する関数については、 section 移動と構文を参照してください。
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 ----------
skip-chars-forward
と全く同じですが、
移動の方向が違います。
プログラムのある限定された範囲内で「一時的に」ポイントを移動したり、
一時的にバッファを切替えたりすることが、便利なこともあります。これを
脱線(excursion)と呼び、save-excursion
という特殊形式で
行ないます。この構文要素は、脱線が完了したときにカレント・バッファと
そのポイントおよびマークを復元できるように、これらを保存します。
ウィンドウの構成の保存と復元のための形式は、別の場所で説明します (section ウィンドウ構成と、see section フレーム構成を参照)。
save-excursion
特殊形式はカレント・バッファが何であったか
(27)とその中のポイントおよびマークの値を保存し、
formsを評価して、最後に、バッファとその保存されたポイントおよび
マークの値を復元します。三つの保存された値全てが、throw
やエラーによる
異常終了(see section 非局所脱出)の場合にも復元されます。
save-excursion
特殊形式は、プログラムの残りの部分への影響を避けて
プログラムのある部分内でバッファを切替えたりポイントを移動するための
標準手法です。EmacsのLispソース中では、500回以上も使われています。
save-excursion
は、ほかのバッファのポイントおよびマークの値は
保存しません。そのためほかのバッファでの変更はsave-excursion
を抜けても
そのまま有効です。
つけ加えると、save-excursion
はswitch-to-buffer
のような
関数によって変えられたウィンドウ-バッファの対応は復元しません。
これら対応と選択されたウィンドウを復元する一つの方法は、
save-window-excursion
をsave-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の プリミティブについて、これらの位置でバッファの先頭と末尾の値を置き換えます。 ナローイング中には、アクセス可能部分の外側のテキストは全く表示されず、 ポイントもアクセス可能部分の外側には移動できません。
位置や行番号といった値は、普通バッファ先頭から数えますし、 ナローイング中でも同じように数えます。しかし、これらを使う関数はアクセス不能な テキストを操作することは拒否します。
バッファを保存するコマンドは、ナローイングの影響を受けません。 これらはいかなるナローイングにも関係なく、バッファ全体を保存します。
対話的呼出しでは、startとendには現在のリージョン境界 (ポイントとマークで、小さい方が先です)が設定されます。
nil
ならば、
move-countページ前方あるいは後方に移動してからナローイングすることを
意味します。変数page-delimiter
でどこがページが先頭と末尾であるのかを
指定します(see section 編集用の標準正規表現)。
対話的呼出しでは、move-countには数値前置引数が設定されます。
(narrow-to-region 1 (1+ (buffer-size)))
throw
やエラーによる異常終了(see section 非局所脱出)の場合にも
復元されます。そのため、本構文要素は一時的なバッファのナローイングに
きれいな方法です。
save-restriction
が返す値は、bodyの最後の形式が返す値となるか、
あるいはbodyに本体形式が与えられないならばnil
となります。
警告: save-restriction
構文要素を使用する場合、
間違いを犯しやすいです。試す前にここにある全説明を読んでください。
bodyがカレント・バッファを変更しても、save-restriction
は
それでも元のバッファ(制限を保存したバッファ)の制限を復元します。
しかし、カレント・バッファがなんであったかまでは復元しません。
save-restriction
はポイントおよびマークの復元は行ないません。
その目的にはsave-excursion
を使ってください。save-restriction
と
save-excursion
とを両方一緒に使うときは、save-excursion
が
先に(外側に)来なければなりません。さもなくば、古いポイントの値を
一時的ナローイングの最中に復元してしまうからです。
その場合、古いポイントの値が一時的ナローイングの限界の外にあると、
正確に復元できないことになります。
save-restriction
特殊形式はアクセス可能部分の先頭と末尾の値を、
バッファの先頭と末尾からの距離で記録します。いいかえれば、これは
アクセス可能部分の前後にあるアクセス不能なテキストの量を記録するのです。
この方法によって、bodyがさらにナローイングを行なった場合も
正しい結果が得られます。けれどもsave-restriction
は
body本体がワイドニングを行って、保存されたナローイングの外側の範囲を
変更した場合には混乱するかもしれません。こういうことを行ないたい場合には、
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.