Next: , Previous: Markers, Up: Markers


30.1 マーカの概要

マーカは、バッファとそのバッファ内での位置を指定します。 マーカは、位置を必要とする関数に対して位置を表すものとして使えます。 バッファ内の位置について詳しくは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>