次: The Region, 前: Moving Markers, 上: Markers
各バッファの1つの特別なマーカをマーク(mark)として区別します。
これは、kill-region
やindent-rigidly
などのコマンド向けに
ユーザーのために位置を記録するものです。
Lispプログラムでは、ユーザーが使う可能性のある値だけをマークに設定し、
プログラムの内部向けにはけっしてマークを使いません。
たとえば、コマンドreplace-regexp
は、
置換を行うまえのポイント値をマークに設定します。
置換を完了したあとに、ユーザーが手軽にまえの位置に戻れるようにするためです。
多くのコマンドは、対話的に呼ばれるとポイントとマークのあいだの
テキストに作用するように設計されています。
読者がそのようなコマンドを書くときには、
マークを直接検査しないでください。
そのかわりに、`r'を指定したinteractive
を使います。
こうすると、
対話的に呼ばれるとポイントとマークの値がコマンドの引数に与えられますが、
別のLispプログラムからは引数を明示できます。
See Interactive Codes。
各バッファには、他のバッファのマークの値とは独立な 独自のマークの値があります。 バッファが作成されると、マークは存在しますがどこも指さない状態です。 これを『バッファのマークは欠如している』状態とみなします。
バッファでいったんマークが『存在』するようになれば、
マークが存在しなくなることは普通はありません。
しかし、暫定マーク(transient-mark)モードをオンにすると、
マークが不活性になることはあります。
すべてのバッファでつねにバッファローカルな変数mark-active
が
マークが活性かどうかを表します。
その値がnil
以外であるとマークは活性です。
コマンドでdeactivate-mark
にnil
以外の値を設定すると、
エディタコマンドループに戻ったときにマークを不活性にするようにできます
(ただし、暫定マーク(transient-mark)モードがオンの場合に限る)。
暫定マーク(transient-mark)モードを使う主な目的は、 マークが活性であるとこのモードはリージョンを強調表示するからです。 See Display。
マークに加えて、各バッファにはマークリング(mark ring)、
つまり、マークの以前の値を保持したリストがあります。
編集コマンドがマークを変更すると、
通常、編集コマンドはマークの古い値をマークリングに保存します。
変数mark-ring-max
で、マークリングに収める要素の最大個数を指定します。
リストがこの長さに達すると、新たな要素を加えるたびに古い要素を削除します。
マークが不活性であると、通常、
mark
はエラーを通知する。 しかし、forceがnil
以外であるとmark
はマーク位置を返すが、 当該バッファでマークが設定されたことがなければnil
を返す。
この関数は、カレントバッファのマークを返す。 これは、Emacs内部のマーク位置を記録したマーカそのものであり、コピーではない。 したがって、このマーカの位置を変更すると、マークの位置に直接影響する。 この効果を望まない限り、そのようにしないこと。
(setq m (mark-marker)) => #<marker at 3420 in markers.texi> (set-marker m 100) => #<marker at 100 in markers.texi> (mark-marker) => #<marker at 100 in markers.texi>他のマーカと同様に、このマーカは任意のバッファでポイントを指すようにできる。 マークが指しているバッファ以外のバッファ内位置を指すことは勧めない。 そのようにすると、一貫性はあるが妙な結果を生じる。
この関数は、位置positionにマークを設定し、マークを活性にする。 マークの古い値はマークリングに保存しない。
注意: ユーザーにマークが移動したことを示し、かつ、 まえのマーク位置を破棄したい場合にのみこの関数を使うこと。 通常、新たにマークを設定したときには、 古いマークを
mark-ring
に入れるべきである。 この理由から、ほとんどのアプリケーションでは、set-mark
ではなくpush-mark
とpop-mark
を使うべきである。Emacs Lispの初心者プログラマは、誤った目的にマークを使いがちである。 マークはユーザーの便宜のための位置を保存する。 編集コマンドは、 コマンドのユーザーレベルの機能の一部としてマークを変更する以外には、 マークを変更してはならない。 (変更する場合には、その効果を明文化しておくべきである。) Lispプログラムの内部で使う位置を記録するには、Lisp変数に保存する。 たとえばつぎのようにする。
(let ((beg (point))) (forward-line 1) (delete-region beg (point))).
この関数は、カレントバッファのマークをpositionとし、 以前のマークのコピーを
mark-ring
へ入れる。 positionがnil
であると、ポイントの値を使う。push-mark
はnil
を返す。関数
push-mark
は、通常、マークを活性にしない。 活性にするには引数activateにt
を指定する。nomsgが
nil
であると、メッセージ`Mark set'を表示する。
この関数は、
mark-ring
から先頭要素を取り出し、 そのマークをカレントバッファの実際のマークとする。 バッファのポイントは移動しない。 また、mark-ring
が空であるとなにもしない。 マークを不活性にする。戻り値に意味はない。
この変数が
nil
以外であると 暫定マーク(transient-mark)モードがオンであるが、 バッファを変更する各基本関数はdeactivate-mark
に設定する。 つまり、バッファを変更するコマンドは、通常、マークを不活性にする。
これが
nil
以外であると、 LispプログラムやEmacsユーザーは、マークが不活性であってもマークを使える。 このオプションは、暫定マーク(transient-mark)モードのふるまいに影響する。 このオプションがnil
以外であると、 マークが不活性になるとリージョンの強調表示を止めるが、 マークを使うコマンドはマークが活性であるものとして動作する。
編集コマンドがこの変数に
nil
以外を設定すると、 エディタコマンドループは(暫定マーク(transient-mark)モードがオンであると) コマンドから戻るとマークを不活性にする。 コマンドが終了したらマークを不活性にするために、 バッファを変更するすべての基本関数はdeactivate-mark
に設定する。
これらのノーマルフックは、それぞれ、 マークが活性になったとき、不活性になったときに実行される。 マークが活性でありリージョンが変更されたときには、 フック
activate-mark-hook
はコマンドの終りでも実行される。