マーカーは、(バッファ中で)周囲のテキストに対する相対的な位置を示すのに用いられ る Lisp オブジェクトです。これは(バッファの先頭からの静的なオフセットを示す) ポジションとは異なります。ポジションに関する完全な記述に関してはチャプター 27 [ポジション]、ページ 257 を参照して下さい。
マーカーは (マーカー位置とマーカーバッファの) 2つの属性を持ちます。この位置は マーカーバッファの先頭からの(カレントな) オフセットのように見えますが、この マーカーポジションはバッファが変化すると (Emacs により)自動的にアップデートさ れます。
考えかたとしては、バッファ中の(ある)2文字間に位置付けられたマーカーは、(その バッファの)その部分の前後の (部分の)内容を変更しても、その 2文字間に存在し続け るということです。このため、(バッファの先頭からの)マーカーのオフセットは (その マーカーの存在する間)しばしば変化します。
マーカーの周囲のテキストを削除すると、マーカーはその削除されたテキストの前後の 文字の間に位置付けられます。テキストをマーカー位置の前に挿入すると、 (その新し いテキストが insert-before-markers を用いて挿入されていない限り) その前にマー カーは保持されます。
あるバッファが変更(削除及び "gap motions")されると、しばしば (それに続く)バッ ファ中の(全ての)マーカーをアップデートしそのカレントなオフセットを反映させなく てはいけなくなります。これは、1つのバッファに多くのマーカーを持つとそのバッ ファにおける処理が遅くなることを意味します。このため、使われないマーカーは、捨 てる前にどこも指さないようにしておくべきです。参照されないマーカーは最終的には ガベージコレクトされますが、それまではアップデートされ続けます。
マーカー位置に対しては算術演算がごく一般的に行なえるため、ほとんどの算術演算子 (e.g., +, -, 等) はマーカーをアーギュメントとして受け取ります。このような場 合、マーカーのカレントな位置を用います。
;; 最初、新しいマーカーはどこも指しません: (setq m1 (make-marker)) => #<marker in no buffer>
;; m1 を カレントバッファ中の 文字 99 と 100 ;; の間を指すようにします。 (set-marker m1 100) => #<marker at 100 in markers.texinfo>
;; ここで そのバッファの先頭に 1文字挿入すると、 (goto-char (point-min)) => 1 (insert "Q") => nil
;; m1 は(適切に)アップデートされます。 m1 => #<marker at 101 in markers.texinfo>
;; 同じ位置を指す マーカーは equal ではあるが、 ;; eq ではありません。 (setq m2 (copu-marker m1)) => #<marker at 101 in markers.texinfo> (eq m1 m2) => nil (equal m1 m2) => t
;; マーカーを使い終ったら、どこも指さないようにします。 (set-marker m1 nil) => #<marker in no buffer>