Go to the first, previous, next, last section, table of contents.

マーカー

マーカーは、(バッファ中で)周囲のテキストに対する相対的な位置を示すのに用いられ る 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>

Go to the first, previous, next, last section, table of contents.