[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

28. マーカ

マーカ(marker)とは、バッファ内のテキストに結び付けられた位置を示 すために使われるLispオブジェクトのことです。テキストの挿入や削除を行なう と、それに追従して、マーカの位置(バッファの先頭を起点とした)が自動的に変 更されます。つまり、マーカは、テキストの特定の場所に貼り付いていることに なります。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

28.1 マーカとは?

マーカとは、バッファと、そのバッファ内での位置を特定するものです。マー カは、位置を表すものとして、通常の整数による表現と同じように、関数の中で 使用することが出来ます。詳しい説明はSee section 位置

マーカには、二つの属性があります。一つはそのマーカの位置であり、もう一 つはそのマーカの属するバッファです。位置属性は、バッファ内のマーカの(そ の瞬間の)位置に等しい整数です。ただし、位置属性の値は、そのマーカが存在 する間に頻繁に変更されることもあります。テキストの挿入や削除が行なわれる と、マーカは再配置されます。これは、挿入や削除によるテキストの移動にマー カも追従させるということで、挿入や削除が行なわれる前後でマーカの両側の文 字が常に同じであるようにマーカの位置を変更するということです。再配置によっ て、マーカの位置属性の値が変更されます。

マーカの周囲のテキストが削除されても、マーカは、削除されたテキストの前 後の文字の間に残ります。また、マーカの存在する位置にテキストが挿入される と、通常は、挿入されたテキストの直前にマーカが残ります。ただし、 insert-before-markersにより挿入された場合は、マーカの位置は、挿入 されたテキストの直後になります。(see section テキストの挿入)。

テキストの挿入・削除にともなって、バッファ内の全てのマーカがチェックさ れ、必要ならば再配置が行なわれます。そのため、マーカの数が多いと、挿入や 削除に時間がかかるようになります。ですから、もはや必要なくなったとわかっ ているマーカは、どこも指さないようにしておくのがよいでしょう。どこからも 参照されていないマーカはいずれガベージ・コレクトされますが、もしそれがど こかを指していたら、ガベージ・コレクトされるまではチェックや再配置の対象 となり、時間を浪費することになります。

マーカの位置に対して算術演算を施すことはよく行なわれることなので、 +-を含むたいていの演算子の引数として、マーカそのものを渡 せるようになっています。このような場合、マーカは、その時点で指し示す位置 を表す整数値であるかのように振る舞います。

以下に、マーカの作り方、マーカの設定、マーカ位置へのポイントの移動の例 を示します。

 
;; とりあえずどこも指していないマーカを作ります。
(setq m1 (make-marker))
     ⇒ #<marker in no buffer>

;; このバッファの99文字目と100文字目の間にマーカm1を置きます。
(set-marker m1 100)
     ⇒ #<marker at 100 in markers.texi>

;; このバッファの先頭に一文字挿入してみましょう。
(goto-char (point-min))
     ⇒ 1
(insert "Q")
     ⇒ nil

;; 一文字挿入に合わせてm1の内容が変更されます。
m1
     ⇒ #<marker at 101 in markers.texi>

;; 同じ場所を指す二つのマーカは、
;;   equalですが、eqではありません。
(setq m2 (copy-marker m1))
     ⇒ #<marker at 101 in markers.texi>
(eq m1 m2)
     ⇒ nil
(equal m1 m2)
     ⇒ t

;; 必要なくなったら、マーカがどこも指さないようにします。
(set-marker m1 nil)
     ⇒ #<marker in no buffer>

[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

28.2 マーカに対する述語

あるオブジェクトがマーカであるか調べることができます。また、マーカと整 数のどちらかであるかを調べることもできます。後者は、マーカと整数のどちら でも引数にとることのできる算術関数を使う際に、便利でしょう。

Function: markerp object

この関数は、objectがマーカであるならtを返し、それ以外なら nilを返します。引数としてマーカと整数のどちらでもとることのできる 関数は多く存在しますが、整数はマーカそのものではないことに注意してくださ い。

Function: integer-or-marker-p object

この関数は、objectがマーカもしくは整数であるならtを返し、そ れ以外ならnilを返します。

Function: number-or-marker-p object

この関数は、objectがマーカもしくは数であるならtを返し、それ 以外ならnilを返します。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

28.3 マーカを作る関数

新たにマーカを作る際、どこも指さないマーカを作ったり、ポイント位置を指 すように設定したり、バッファの(その時点で見ることができる)先頭や最後に置 いたり、ほかのマーカと同じ場所を指すように設定することができます。

Function: make-marker

この関数は、どこも指さないマーカを新たに作って、それを返します。

 
(make-marker)
     ⇒ #<marker in no buffer>
Function: point-marker

この関数は、カレント・バッファのポイント位置を指すマーカを新たに作って、 それを返します。See section ポイント。例は、後述のcopy-markerを参照してく ださい。

Function: point-min-marker

この関数は、バッファの(その時点で見ることができる)先頭を指すマーカを新た に作って、それを返します。バッファがナローイングされていなければ、そのバッ ファの本当の先頭を指すことになります。See section ナローイング

Function: point-max-marker

この関数は、バッファの(その時点で見ることができる)最後を指すマーカを新た に作って、それを返します。バッファがナローイングされていなければ、そのバッ ファの本当の最後を指すことになります。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>
Function: copy-marker marker-or-integer

この関数は、引数としてマーカが渡された場合、そのマーカ 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] [ ? ]

28.4 マーカから情報を得る

この節では、マーカのもつ情報を取り出す関数について説明します。

Function: marker-position marker

この関数は、markerが指す位置を返します。マーカがどこも指していない 場合は、nilを返します。

Function: marker-buffer marker

この関数は、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] [ ? ]

28.5 マーカ位置の変更

この節では、マーカの位置の変更の仕方について述べます。あるマーカの位置 を変更する場合、それが自分のプログラム以外で使われていないか、もし、ほか で使われているなら、実際にそのマーカを動かすことによってどのような影響が でるのか確認してください。このような確認を怠ると、Emacsのほかの処理に混 乱が生じる可能性があります。

Function: set-marker marker position &optional buffer

この関数は、markerbufferpositionへ移します。 bufferが省略された場合は、カレント・バッファに移されます。

positionが1より小さい場合、markerはバッファの先頭に移されま す。positionがバッファの大きさより大きい場合は、バッファの最後に移 されます。positionnilだったり、どこも指していないマーカで あったりした場合は、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>
Function: move-marker marker position &optional buffer

これは、set-markerの別名です。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

28.6 マーク

マーク(the mark)と呼ばれる特殊なマーカが、各バッファに一つずつ存 在しています。これは、C-wC-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は、マーク・リングの最大容量を示しま す。マーク・リングが一杯になってさらに新たにマークの値を保存する際には、 一番古いマーカが消去されます。

Function: mark &optional force

この関数は、カレント・バッファのマークの位置を、整数値で返します。

マークが無効の状態になっている場合は、通常、エラーになります。ただし、 forceが非nilなら、マークの状態いかんに関わらずその位置、も しくはnil(バッファにマークがまだ設定されていない場合)を返します。

Function: mark-marker

この関数は、カレント・バッファのマークを返します。これはマークの位置を記 録しているマーカのコピーではなく、マーカそのものを返します。したがって、 このマーカの位置属性の値を変更すると、マークの位置も変わってしまいます。 意図的でないかぎり、このような変更はしないでください。

 
(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>

ほかのマーカと同じように、このマーカをほかのバッファに移すことができます。 しかし、マークをほかのバッファに移すようなことは止めておいた方がいいでしょ う。仮にそうした場合、問題は起こらないにしても、かなり奇妙な現象が発生す ることになるでしょう。

Function: set-mark position

この関数は、positionを指すようにマークを設定し、また、マークを有効 にします。変更前のマークの値は、マーク・リングには保存されません

注意: この関数を使うのは、マークを動かしたということをユーザに 見せ、なおかつ、直前のマークの位置情報を破棄する場合にのみ使ってください。 通常は、マークを新たに設定するときには、古いマークをmark-ringに保 存しておくべきです。したがってほとんどの場合、set-markは使わずに、 push-markpop-markを使うべきです。

Emacs Lispプログラミングの初心者は、マークを間違った用途に使おうとしがち です。マークはユーザの便宜を図るために、位置を記憶するものです。編集用の コマンドでは、ユーザとのやり取りのためにマークを変更する必要がないかぎり、 マークを変更すべきではありません。また、変更の必要がある場合でも、マーク が変更されることをドキュメントに明記しておくべきです。Lispプログラム内部 の都合でどこかの位置を記録しておくのなら、Lispの変数に保存しましょう。た とえば以下のようにします。

 
(let ((beg (point)))
  (forward-line 1)
  (delete-region beg (point))).
Function: push-mark &optional position nomsg activate

この関数は、カレント・バッファのマークを、positionを指すように設定 します。変更前の値は、mark-ringに保存されます。positionnilならば、ポイントの値が使われます。この関数は、nilを返し ます。

push-markは通常、マークを有効にしませんactivate としてtが渡されれば有効にします。

nomsgが非nilでない限り、`Mark set'というメッセージが表 示されます。

Function: pop-mark

この関数は、mark-ringの先頭の要素を取り出して、それをバッファのマー クとして設定します。ポイントは移動しません。mark-ringが空なら何も しません。また、マークを無効にします。

返される値には、意味がありません。

User Option: transient-mark-mode

この変数が非nilであるとき、Transient Markモードが有効になります。 このモードでは、バッファの内容を変更するプリミティブ関数が、 deactivate-markを非nilに設定するようになります。その結果、 バッファ内容を変更するコマンドを実行するたびに、通常、マークが無効になり ます。

Variable: deactivate-mark

この変数が非nilであるとき、エディタのコマンド・ループは、コマンド を実行するたびにマークを無効にするようになります。ただし、これは Transient Markモードでのみ有効です。

Function: deactivate-mark

マークを無効にします。ただし、これはTransient Markモードでのみ有効です。

Variable: mark-active

この変数を非nilに設定すると、マークが有効になります。この変数は、 常にバッファローカルです。

Variable: activate-mark-hook
Variable: deactivate-mark-hook

これらの正規フックは、それぞれ、マークが有効になった時と無効になった時に 実行されます。また、activate-mark-hookは、マークが有効でリージョ ンが変更された時にも(その変更を行なったコマンドの直後に)実行されます。

Variable: mark-ring

この変数は、バッファローカルな変数であり、以前にカレント・バッファで設定 されたことのあるマークの値を、リストにして保存しています。最も新しいマー クがリストの先頭に入っています。

 
mark-ring
⇒ (#<marker at 11050 in markers.texi> 
    #<marker at 10832 in markers.texi>
    …)
User Option: mark-ring-max

この変数は、mark-ringの容量の最大値を保持します。この値より多くの 個数のマークをpush-markmark-ringに保存しようとすると、一 番古いマークが捨てられます。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

28.7 リージョン

ポイントとマークの間にあるテキストを、リージョン(the region)と呼 びます。ポイントとマークで区切られたテキストを加工する関数はいろいろとあ りますが、ここでは特に、リージョンそのものに関わる関数について説明します。

Function: region-beginning

この関数は、リージョンの先頭位置を、整数値で返します。これは、ポイント位 置かマーク位置のどちらか小さい方です。

マークがどこも指していない場合は、エラーとなります。

Function: region-end

この関数は、リージョンの最後の位置を、整数値で返します。これは、ポイント 位置かマーク位置のどちらか大きい方です。

マークがどこも指していない場合は、エラーとなります。

region-beginningregion-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.