マーカーは、バッファとそのバッファ内の位置を指定します。マーカーは、位置を必要とする関数において、整数と同様に位置を表すために使用できます。その場合、通常マーカーのバッファは無視されます。もちろん、このように使用されるマーカーは通常、関数が操作するバッファ内の位置を指しますが、それは完全にプログラマの責任となります。位置に関する詳細な説明については、Positionsを参照してください。
マーカーには、マーカー位置、マーカーバッファ、挿入タイプという3つの属性があります。マーカー位置は整数であり、(ある時点において)そのバッファ内におけるマーカーの位置と等価です。ただし、マーカーの位置値はマーカーの生存期間中に変化することがあり、実際に頻繁に変化します。バッファ内でのテキストの挿入や削除によって、マーカーの位置が移動します。これは、2つの文字の間に配置されたマーカーが、バッファの他の場所で挿入や削除が行われたとしても、引き続きその2つの文字の間に留まるという考え方に基づいています。位置の移動により、マーカーの整数としての等価値が変化します。
マーカーの位置周辺のテキストを削除すると、マーカーは削除されたテキストの直前と直後の文字の間に配置されます。マーカーの位置にテキストを挿入する場合、通常はマーカーの挿入タイプに応じて、新しいテキストの前または後に配置されます(マーカーの挿入タイプを参照)。ただし、insert-before-markers を用いて挿入する場合はこの限りではありません(テキストの挿入を参照)。
バッファへの挿入および削除では、すべてのマーカーを確認し、必要に応じて再配置する必要があります。これにより、マーカー数が多いバッファでは処理速度が低下します。そのため、不要であることが確実なマーカーは、どこにも指さないようにしておくのが得策です。アクセスできなくなったマーカーは、最終的に削除されます(ガベージコレクションを参照)。
マーカーの位置に対して算術演算を行うことが一般的であるため、これらの演算のほとんど(+ や
- を含む)はマーカーを引数として受け取ります。このような場合、マーカーは現在の位置を表します。
マーカーの作成、マーカーの設定、ポイントからマーカーへの移動の例を以下に示します。
;; Make a new marker that initially does not point anywhere:
(setq m1 (make-marker))
⇒ #<marker in no buffer>
;; Set m1 to point between the 99th and 100th characters
;; in the current buffer:
(set-marker m1 100)
⇒ #<marker at 100 in markers.texi>
;; Now insert one character at the beginning of the buffer:
(goto-char (point-min))
⇒ 1
(insert "Q")
⇒ nil
;; m1 is updated appropriately.
m1
⇒ #<marker at 101 in markers.texi>
;; Two markers that point to the same position ;; are noteq, but they areequal. (setq m2 (copy-marker m1)) ⇒ #<marker at 101 in markers.texi> (eq m1 m2) ⇒ nil (equal m1 m2) ⇒ t
;; When you are finished using a marker, make it point nowhere.
(set-marker m1 nil)
⇒ #<marker in no buffer>