[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
マーカ(marker)とは、バッファ内のテキストに結び付けられた位置を示 すために使われるLispオブジェクトのことです。テキストの挿入や削除を行なう と、それに追従して、マーカの位置(バッファの先頭を起点とした)が自動的に変 更されます。つまり、マーカは、テキストの特定の場所に貼り付いていることに なります。
28.1 マーカとは? | ||
28.2 マーカに対する述語 | ||
28.3 マーカを作る関数 | ||
28.4 マーカから情報を得る | ||
28.5 マーカ位置の変更 | ||
28.6 マーク | ||
28.7 リージョン |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
マーカとは、バッファと、そのバッファ内での位置を特定するものです。マー カは、位置を表すものとして、通常の整数による表現と同じように、関数の中で 使用することが出来ます。詳しい説明はSee section 位置。
マーカには、二つの属性があります。一つはそのマーカの位置であり、もう一 つはそのマーカの属するバッファです。位置属性は、バッファ内のマーカの(そ の瞬間の)位置に等しい整数です。ただし、位置属性の値は、そのマーカが存在 する間に頻繁に変更されることもあります。テキストの挿入や削除が行なわれる と、マーカは再配置されます。これは、挿入や削除によるテキストの移動にマー カも追従させるということで、挿入や削除が行なわれる前後でマーカの両側の文 字が常に同じであるようにマーカの位置を変更するということです。再配置によっ て、マーカの位置属性の値が変更されます。
マーカの周囲のテキストが削除されても、マーカは、削除されたテキストの前
後の文字の間に残ります。また、マーカの存在する位置にテキストが挿入される
と、通常は、挿入されたテキストの直前にマーカが残ります。ただし、
insert-before-markers
により挿入された場合は、マーカの位置は、挿入
されたテキストの直後になります。(see section テキストの挿入)。
テキストの挿入・削除にともなって、バッファ内の全てのマーカがチェックさ れ、必要ならば再配置が行なわれます。そのため、マーカの数が多いと、挿入や 削除に時間がかかるようになります。ですから、もはや必要なくなったとわかっ ているマーカは、どこも指さないようにしておくのがよいでしょう。どこからも 参照されていないマーカはいずれガベージ・コレクトされますが、もしそれがど こかを指していたら、ガベージ・コレクトされるまではチェックや再配置の対象 となり、時間を浪費することになります。
マーカの位置に対して算術演算を施すことはよく行なわれることなので、
+
や-
を含むたいていの演算子の引数として、マーカそのものを渡
せるようになっています。このような場合、マーカは、その時点で指し示す位置
を表す整数値であるかのように振る舞います。
以下に、マーカの作り方、マーカの設定、マーカ位置へのポイントの移動の例 を示します。
;; とりあえずどこも指していないマーカを作ります。 (setq m1 (make-marker)) ⇒ #<marker in no buffer> ;; このバッファの99文字目と100文字目の間にマーカ |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
あるオブジェクトがマーカであるか調べることができます。また、マーカと整 数のどちらかであるかを調べることもできます。後者は、マーカと整数のどちら でも引数にとることのできる算術関数を使う際に、便利でしょう。
この関数は、objectがマーカであるならt
を返し、それ以外なら
nil
を返します。引数としてマーカと整数のどちらでもとることのできる
関数は多く存在しますが、整数はマーカそのものではないことに注意してくださ
い。
この関数は、objectがマーカもしくは整数であるならt
を返し、そ
れ以外ならnil
を返します。
この関数は、objectがマーカもしくは数であるならt
を返し、それ
以外ならnil
を返します。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
新たにマーカを作る際、どこも指さないマーカを作ったり、ポイント位置を指 すように設定したり、バッファの(その時点で見ることができる)先頭や最後に置 いたり、ほかのマーカと同じ場所を指すように設定することができます。
この関数は、どこも指さないマーカを新たに作って、それを返します。
(make-marker) ⇒ #<marker in no buffer> |
この関数は、カレント・バッファのポイント位置を指すマーカを新たに作って、
それを返します。See section ポイント。例は、後述のcopy-marker
を参照してく
ださい。
この関数は、バッファの(その時点で見ることができる)先頭を指すマーカを新た に作って、それを返します。バッファがナローイングされていなければ、そのバッ ファの本当の先頭を指すことになります。See section ナローイング。
この関数は、バッファの(その時点で見ることができる)最後を指すマーカを新た に作って、それを返します。バッファがナローイングされていなければ、そのバッ ファの本当の最後を指すことになります。See section ナローイング。
この関数とpoint-min-marker
の例を、以下に示します。この章の(訳注:
英語版の)texinfoファイルを読み込んだバッファ上で実行した結果です。
(point-min-marker) ⇒ #<marker at 1 in markers.texi> (point-max-marker) ⇒ #<marker at 15573 in markers.texi> (narrow-to-region 100 200) ⇒ nil (point-min-marker) ⇒ #<marker at 100 in markers.texi> (point-max-marker) ⇒ #<marker at 200 in markers.texi> |
この関数は、引数としてマーカが渡された場合、そのマーカ marker-or-integerと同じバッファ、同じ位置を指すマーカを作り、それ を返します。引数として整数が渡された場合、カレント・バッファ上の位置 marker-or-integerを指すマーカを新たに作り、それを返します。
copy-marker
に1よりも小さな整数を渡すと、カレント・バッファの先頭
を指すマーカを返します。バッファの大きさよりも大きい整数を渡すと、バッファ
の最後を指すマーカを返します。
marker-or-integerがマーカでも整数でもなければ、エラーとなります。
(setq p (point-marker)) ⇒ #<marker at 2139 in markers.texi> (setq q (copy-marker p)) ⇒ #<marker at 2139 in markers.texi> (eq p q) ⇒ nil (equal p q) ⇒ t (copy-marker 0) ⇒ #<marker at 1 in markers.texi> (copy-marker 20000) ⇒ #<marker at 7572 in markers.texi> |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
この節では、マーカのもつ情報を取り出す関数について説明します。
この関数は、markerが指す位置を返します。マーカがどこも指していない
場合は、nil
を返します。
この関数は、markerが指す位置を含むバッファを返します。マーカがどこ
も指していない場合は、nil
を返します。
(setq m (make-marker)) ⇒ #<marker in no buffer> (marker-position m) ⇒ nil (marker-buffer m) ⇒ nil (set-marker m 3770 (current-buffer)) ⇒ #<marker at 3770 in markers.texi> (marker-buffer m) ⇒ #<buffer markers.texi> (marker-position m) ⇒ 3770 |
二つのマーカが同じバッファの同じ位置に設定されているか、もしくはどちら
もどこも指していない場合、この二つのマーカは(たとえeq
ではなくとも)
equal
と見倣されます。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
この節では、マーカの位置の変更の仕方について述べます。あるマーカの位置 を変更する場合、それが自分のプログラム以外で使われていないか、もし、ほか で使われているなら、実際にそのマーカを動かすことによってどのような影響が でるのか確認してください。このような確認を怠ると、Emacsのほかの処理に混 乱が生じる可能性があります。
この関数は、markerをbufferのpositionへ移します。 bufferが省略された場合は、カレント・バッファに移されます。
positionが1より小さい場合、markerはバッファの先頭に移されま
す。positionがバッファの大きさより大きい場合は、バッファの最後に移
されます。positionがnil
だったり、どこも指していないマーカで
あったりした場合は、markerはどこも指さないように設定されます。
返される値は、markerです。
(setq m (point-marker)) ⇒ #<marker at 4714 in markers.texi> (set-marker m 55) ⇒ #<marker at 55 in markers.texi> (setq b (get-buffer "foo")) ⇒ #<buffer foo> (set-marker m 0 b) ⇒ #<marker at 1 in foo> |
これは、set-marker
の別名です。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
マーク(the mark)と呼ばれる特殊なマーカが、各バッファに一つずつ存
在しています。これは、C-wやC-x TABのようなコマンドに備
えて、位置を記憶しておくために使われるものです。Emacs Lispのプログラムが
マークをセットするのは、ユーザが使いそうな場合に限るべきであり、プログラ
ム内部での用途にマークを使用すべきではありません。たとえば、
replace-regexp
命令は、実際に置換を行なう前に、ポイントの位置をマー
クに入れておきます。これは置換が終了した後、元の場所に簡単に戻ることがで
きるようにするためです。
対話的に実行された場合にポイントとマークに囲まれたテキストを加工するよ
うに作られたコマンドが、たくさんあります。このようなコマンドを作る場合は、
直接マークの値を調べてはいけません。かわりに、interactive
関数を
`r'引数とともに呼び出しましょう。こうすると、対話的にコマンドを実行
した場合、ポイントとマークの値が引数として渡されます。また、ほかのLispプ
ログラムから呼び出す場合は、明示的に引数を与えることができます。
See section interactive
用のコード文字。
マークは、ほかのバッファのマークとは独立した、そのバッファ独自の値を持っ ています。バッファが作られるときにマークも一緒に作られますが、このマーク はこの時点ではどこも指していません。この状態は"バッファにマークが存在し ない"ものとして扱われます。
一度バッファ内にマークが"存在する"ようになった後では、マークが消えて
しまうようなことはまずありません。ただし、Transient Markモードでは、マー
クが無効(inactive)になることがあります。mark-active
変数は、
全てのバッファにおいて常にローカルな変数で、マークが有効であるかどうかを
示しています。この変数が非nil
なら、マークが有効であることを表しま
す。また、変数deactivate-mark
を非nil
の値にセットすれば、エ
ディタのコマンド・ループに戻る度にマークが無効になります。ただしこれは、
Transient Markモードでのみ有効です。
ユーザがTransient Markモードを使いはじめる大きな動機になり得るのは、マー クが有効な状態にあるとき、リージョンがわかりやすく強調表示されるという点 です。See section Emacsの表示。
バッファにはマークに加えて、マーク・リング(mark ring)があります。
これは、以前のマークの値を保持しているマーカのリストです。マークの値を変
更するコマンドを実行すると、通常、変更前のマークの値がマーク・リングに保
存されます。変数mark-ring-max
は、マーク・リングの最大容量を示しま
す。マーク・リングが一杯になってさらに新たにマークの値を保存する際には、
一番古いマーカが消去されます。
この関数は、カレント・バッファのマークの位置を、整数値で返します。
マークが無効の状態になっている場合は、通常、エラーになります。ただし、
forceが非nil
なら、マークの状態いかんに関わらずその位置、も
しくはnil
(バッファにマークがまだ設定されていない場合)を返します。
この関数は、カレント・バッファのマークを返します。これはマークの位置を記 録しているマーカのコピーではなく、マーカそのものを返します。したがって、 このマーカの位置属性の値を変更すると、マークの位置も変わってしまいます。 意図的でないかぎり、このような変更はしないでください。
(setq m (mark-marker)) ⇒ #<marker at 3420 in markers.texi> (set-marker m 100) ⇒ #<marker at 100 in markers.texi> (mark-marker) ⇒ #<marker at 100 in markers.texi> |
ほかのマーカと同じように、このマーカをほかのバッファに移すことができます。 しかし、マークをほかのバッファに移すようなことは止めておいた方がいいでしょ う。仮にそうした場合、問題は起こらないにしても、かなり奇妙な現象が発生す ることになるでしょう。
この関数は、positionを指すようにマークを設定し、また、マークを有効 にします。変更前のマークの値は、マーク・リングには保存されません。
注意: この関数を使うのは、マークを動かしたということをユーザに
見せ、なおかつ、直前のマークの位置情報を破棄する場合にのみ使ってください。
通常は、マークを新たに設定するときには、古いマークをmark-ring
に保
存しておくべきです。したがってほとんどの場合、set-mark
は使わずに、
push-mark
とpop-mark
を使うべきです。
Emacs Lispプログラミングの初心者は、マークを間違った用途に使おうとしがち です。マークはユーザの便宜を図るために、位置を記憶するものです。編集用の コマンドでは、ユーザとのやり取りのためにマークを変更する必要がないかぎり、 マークを変更すべきではありません。また、変更の必要がある場合でも、マーク が変更されることをドキュメントに明記しておくべきです。Lispプログラム内部 の都合でどこかの位置を記録しておくのなら、Lispの変数に保存しましょう。た とえば以下のようにします。
(let ((beg (point))) (forward-line 1) (delete-region beg (point))). |
この関数は、カレント・バッファのマークを、positionを指すように設定
します。変更前の値は、mark-ring
に保存されます。positionが
nil
ならば、ポイントの値が使われます。この関数は、nil
を返し
ます。
push-mark
は通常、マークを有効にしません。activate
としてt
が渡されれば有効にします。
nomsgが非nil
でない限り、`Mark set'というメッセージが表
示されます。
この関数は、mark-ring
の先頭の要素を取り出して、それをバッファのマー
クとして設定します。ポイントは移動しません。mark-ring
が空なら何も
しません。また、マークを無効にします。
返される値には、意味がありません。
この変数が非nil
であるとき、Transient Markモードが有効になります。
このモードでは、バッファの内容を変更するプリミティブ関数が、
deactivate-mark
を非nil
に設定するようになります。その結果、
バッファ内容を変更するコマンドを実行するたびに、通常、マークが無効になり
ます。
この変数が非nil
であるとき、エディタのコマンド・ループは、コマンド
を実行するたびにマークを無効にするようになります。ただし、これは
Transient Markモードでのみ有効です。
マークを無効にします。ただし、これはTransient Markモードでのみ有効です。
この変数を非nil
に設定すると、マークが有効になります。この変数は、
常にバッファローカルです。
これらの正規フックは、それぞれ、マークが有効になった時と無効になった時に
実行されます。また、activate-mark-hook
は、マークが有効でリージョ
ンが変更された時にも(その変更を行なったコマンドの直後に)実行されます。
この変数は、バッファローカルな変数であり、以前にカレント・バッファで設定 されたことのあるマークの値を、リストにして保存しています。最も新しいマー クがリストの先頭に入っています。
mark-ring ⇒ (#<marker at 11050 in markers.texi> #<marker at 10832 in markers.texi> …) |
この変数は、mark-ring
の容量の最大値を保持します。この値より多くの
個数のマークをpush-mark
でmark-ring
に保存しようとすると、一
番古いマークが捨てられます。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
ポイントとマークの間にあるテキストを、リージョン(the region)と呼 びます。ポイントとマークで区切られたテキストを加工する関数はいろいろとあ りますが、ここでは特に、リージョンそのものに関わる関数について説明します。
この関数は、リージョンの先頭位置を、整数値で返します。これは、ポイント位 置かマーク位置のどちらか小さい方です。
マークがどこも指していない場合は、エラーとなります。
この関数は、リージョンの最後の位置を、整数値で返します。これは、ポイント 位置かマーク位置のどちらか大きい方です。
マークがどこも指していない場合は、エラーとなります。
region-beginning
やregion-end
を使う必要があるプログラムは
ほとんどないはずです。リージョンを使用するようなコマンドは、通常、
interactive
関数を`r'引数とともに呼び出してリージョンの始まり
と終りの位置を得るように作られるべきです。このようにすれば、ほかのLispプ
ログラムからこのようなコマンドを呼び出す場合にも、リージョンの境界を引数
として明示的に渡すことができます(See section interactive
用のコード文字)。
[ << ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This document was generated by Yasutaka SHINDOH on September, 29 2006 using texi2html 1.76.