マーカは、バッファとそのバッファ内での位置を指定します。 マーカは、位置を必要とする関数に対して位置を表すものとして使えます。 バッファ内の位置について詳しくはSee Positions。
マーカには2つの属性、つまり、マーカ位置とマーカバッファがあります。 マーカ位置は、当該バッファ内の位置としてのマーカに (その時点で)等価な整数です。 しかし、マーカの生存期間中、マーカ位置の値はしばしば変化します。 バッファにテキストを挿入したり削除すると、マーカは再配置されます。 これは、バッファの任意の箇所で挿入したり削除したとしても、 2つの文字のあいだに置かれたマーカが 同じ文字のあいだに留まるようにするためです。 再配置によって、マーカに等価な整数は変わります。
マーカ位置の周りのテキストを削除すると、
削除されたテキストの前後の文字のあいだにマーカは留まります。
マーカの位置にテキストを挿入すると、
insert-before-markers
(see Insertion)で挿入しない限り、
マーカの挿入型(insertion type)(see Marker Insertion Types)に
依存して、マーカは挿入されたテキストのまえかうしろに留まります。
バッファに対する挿入や削除では、 すべてのマーカを検査し、必要ならばマーカを再配置する必要があります。 マーカを多数抱えるバッファでは、このために処理が遅くなります。 そのため、マーカが不要であると確信したときには、 マーカがどこも指さないようにしておくのがよいです。 参照されていないマーカは最終的には(ガベッジコレクションで)回収されますが、 それまでは、マーカがどこかを指していると処理時間を浪費します。
マーカ位置にはよく算術演算を施すので、
(+
や-
を含む)ほとんどの算術演算は
引数としてマーカを受け付けます。
そのような場合、マーカはその現在位置を表します。
マーカを作って位置を設定し、ポイントをマーカへ移動する例を示します。
;; どこも指していない新しいマーカを作る (setq m1 (make-marker)) ⇒ #<marker in no buffer> ;; マーカm1の位置をカレントバッファの ;; 99番目と100番目の文字のあいだにする (set-marker m1 100) ⇒ #<marker at 100 in markers.texi> ;; バッファの先頭に1文字挿入する (goto-char (point-min)) ⇒ 1 (insert "Q") ⇒ nil ;; それにしたがってm1
が更新される m1 ⇒ #<marker at 101 in markers.texi> ;; 同じ位置を指す2つのマーカはeq
ではないが ;;equal
である (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>