Next: , Previous: Moving Markers, Up: Markers


30.7 マーク

各バッファの1つの特別なマーカをマーク(mark)として区別します。 これは、kill-regionindent-rigidlyなどのコマンド向けに ユーザーのために位置を記録するものです。 Lispプログラムでは、ユーザーが使う可能性のある値だけをマークに設定し、 プログラムの内部向けにはけっしてマークを使いません。 たとえば、コマンドreplace-regexpは、 置換を行うまえのポイント値をマークに設定します。 置換を完了したあとに、ユーザーが手軽にまえの位置に戻れるようにするためです。

多くのコマンドは、対話的に呼ばれるとポイントとマークのあいだの テキストに作用するように設計されています。 読者がそのようなコマンドを書くときには、 マークを直接検査しないでください。 そのかわりに、‘r’を指定したinteractiveを使います。 こうすると、 対話的に呼ばれるとポイントとマークの値がコマンドの引数に与えられますが、 別のLispプログラムからは引数を明示できます。 See Interactive Codes

各バッファには、他のバッファのマークの値とは独立な 独自のマークの値があります。 バッファが作成されると、マークは存在しますがどこも指さない状態です。 これを『バッファのマークは欠如している』状態とみなします。

バッファでいったんマークが『存在』するようになれば、 マークが存在しなくなることは普通はありません。 しかし、暫定マーク(transient-mark)モードをオンにすると、 マークが不活性になることはあります。 すべてのバッファでつねにバッファローカルな変数mark-activeが マークが活性かどうかを表します。 その値がnil以外であるとマークは活性です。 コマンドでdeactivate-marknil以外の値を設定すると、 エディタコマンドループに戻ったときにマークを不活性にするようにできます (ただし、暫定マーク(transient-mark)モードがオンの場合に限る)。

暫定マーク(transient-mark)モードを使う主な目的は、 マークが活性であるとこのモードはリージョンを強調表示するからです。 See Display

マークに加えて、各バッファにはマークリング(mark ring)、 つまり、マークの以前の値を保持したリストがあります。 編集コマンドがマークを変更すると、 通常、編集コマンドはマークの古い値をマークリングに保存します。 変数mark-ring-maxで、マークリングに収める要素の最大個数を指定します。 リストがこの長さに達すると、新たな要素を加えるたびに古い要素を削除します。

— Function: mark &optional force

この関数は、カレントバッファのマーク位置を整数で返す。

マークが不活性であると、通常、markはエラーを通知する。 しかし、forcenil以外であるとmarkはマーク位置を返すが、 当該バッファでマークが設定されたことがなければnilを返す。

— Function: mark-marker

この関数は、カレントバッファのマークを返す。 これは、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>

他のマーカと同様に、このマーカは任意のバッファでポイントを指すようにできる。 マークが指しているバッファ以外のバッファ内位置を指すことは勧めない。 そのようにすると、一貫性はあるが妙な結果を生じる。

— Function: set-mark position

この関数は、位置positionにマークを設定し、マークを活性にする。 マークの古い値はマークリングに保存しない

注意: ユーザーにマークが移動したことを示し、かつ、 まえのマーク位置を破棄したい場合にのみこの関数を使うこと。 通常、新たにマークを設定したときには、 古いマークをmark-ringに入れるべきである。 この理由から、ほとんどのアプリケーションでは、 set-markではなくpush-markpop-markを使うべきである。

Emacs Lispの初心者プログラマは、誤った目的にマークを使いがちである。 マークはユーザーの便宜のための位置を保存する。 編集コマンドは、 コマンドのユーザーレベルの機能の一部としてマークを変更する以外には、 マークを変更してはならない。 (変更する場合には、その効果を明文化しておくべきである。) Lispプログラムの内部で使う位置を記録するには、Lisp変数に保存する。 たとえばつぎのようにする。

          (let ((beg (point)))
            (forward-line 1)
            (delete-region beg (point))).
— Function: push-mark &optional position nomsg activate

この関数は、カレントバッファのマークをpositionとし、 以前のマークのコピーをmark-ringへ入れる。 positionnilであると、ポイントの値を使う。 push-marknilを返す。

関数push-markは、通常、マークを活性にしない。 活性にするには引数activatetを指定する。

nomsgnilであると、メッセージ‘Mark set’を表示する。

— Function: pop-mark

この関数は、mark-ringから先頭要素を取り出し、 そのマークをカレントバッファの実際のマークとする。 バッファのポイントは移動しない。 また、mark-ringが空であるとなにもしない。 マークを不活性にする。

戻り値に意味はない。

— User Option: transient-mark-mode

この変数がnil以外であると 暫定マーク(transient-mark)モードがオンであるが、 バッファを変更する各基本関数はdeactivate-markに設定する。 つまり、バッファを変更するコマンドは、通常、マークを不活性にする。

— User Option: mark-even-if-inactive

これがnil以外であると、 LispプログラムやEmacsユーザーは、マークが不活性であってもマークを使える。 このオプションは、暫定マーク(transient-mark)モードのふるまいに影響する。 このオプションがnil以外であると、 マークが不活性になるとリージョンの強調表示を止めるが、 マークを使うコマンドはマークが活性であるものとして動作する。

— Variable: deactivate-mark

編集コマンドがこの変数にnil以外を設定すると、 エディタコマンドループは(暫定マーク(transient-mark)モードがオンであると) コマンドから戻るとマークを不活性にする。 コマンドが終了したらマークを不活性にするために、 バッファを変更するすべての基本関数はdeactivate-markに設定する。

— Function: deactivate-mark

この関数は、暫定マーク(transient-mark)モードが オンであるとマークを不活性にする。 さもなければなにもしない。

— Variable: mark-active

この変数がnil以外であると、マークは活性である。 この変数は各バッファにおいてつねにバッファローカルである。

— Variable: activate-mark-hook
— Variable: deactivate-mark-hook

これらのノーマルフックは、それぞれ、 マークが活性になったとき、不活性になったときに実行される。 マークが活性でありリージョンが変更されたときには、 フックactivate-mark-hookはコマンドの終りでも実行される。

— Variable: mark-ring

このバッファローカルな変数の値は、 カレントバッファで保存したマークを最新のものから順に並べたリストである。

          mark-ring
           (#<marker at 11050 in markers.texi>
              #<marker at 10832 in markers.texi>
              ...)
— User Option: mark-ring-max

この変数の値は、mark-ringの最大の大きさである。 これより多くのマークをmark-ringに積むと、 push-markは新しいものを追加するときに古いものを削除する。