Next: The Region, Previous: Moving Markers, Up: Markers [Contents][Index]
バッファーはそれぞれ、マーク(mark)という、バッファー専用の特別なマーカーをもちますバッファーが新たに作成される際、すでにこのマーカーは存在していますが、どこも指していません。これは、そのバッファーにはまだマークが“存在しない”ことを意味します。それ以降のコマンドがマークをセットできます。
マークは、kill-region
やindent-rigidly
のような多くのコマンドにたいして、テキスト範囲をバインドするための位置を指定します。通常これらのコマンドは、ポイントとマークの間の、リージョン(region)と呼ばれるテキストに作用します。リージョンを操作するコマンドを記述する場合は、マークを直接調べず、かわりに‘r’指定とともにinteractive
を使用してください。このようにすれば、インタラクティブな呼び出しではコマンドの引数としてポイントとマークの値が提供され、かつ他のLispプログラムは引数を明示的に指定できます。Interactive Codesを参照してください。
いくつかのコマンドは、その副作用(side-effect)としてマークをセットします。コマンドは、ユーザーがそれを使用する可能性がある場合のみマークをセットするべきであり、決してコマンドの内部的な目的にたいして使用してはなりません。たとえばreplace-regexp
コマンドは、何らかの置換を行う前にマークにポイントの値をセットしますが、その理由はこれによりユーザーが置換を終えた後、簡単にその位置に戻ることが可能になるからです。
一度バッファー内にマークが“存在”すれば、その存在は通常は決して消えることはありません。しかし、Transient
Markモードが有効な場合、マークが非アクティブ(inactive)になることはあります。バッファーローカル変数mark-active
が非nil
なら、それはマークがアクティブであることを意味します。コマンドはマークを直接非アクティブにするために関数deactivate-mark
を呼び出すことができ、変数deactivate-mark
を非nil
値にセットすることにより、エディターコマンドループ(editor
command loop)にリターン時にマークの非アクティブ化を要求できます。
Transient Markモードが有効な場合、通常ならポイント近傍に適用される特定の編集コマンドは、マークがアクティブなときはかわりにリージョンに適用されます。これがTransient Markモードを使用する主な動機です(他にも、マークアクティブ時にはリージョンのハイライトが有効になるという理由もある。Displayを参照されたい)。
マークに加えて、バッファーはそれぞれマークリング(mark
ring)をもっています。これは、以前のマーク値を含むマーカーのリストです。編集コマンドがマークを変更する際、それらのコマンドは通常はマークの旧値をマークリングに保存するべきです。変数mark-ring-max
は、マークリング内のエントリー最大数を指定します。リストがこの長さに達すると、最後の要素を削除して、新たな要素が追加されます。
これとは別にグローバルマークリング(global mark ring)がありますが、それは少数の特定のユーザーレベルコマンドでのみ使用され、Lispプログラムとは関連しないので、ここでは説明しません。
この関数は、カレントバッファーのマーク位置を整数でリターンする。そのバッファー内でそれまでマークがセットされていなければnil
をリターンする。
Transient
Markモードが有効、かつmark-even-if-inactive
がnil
の場合、マークが非アクティブならmark
はエラーをシグナルする。しかし、forceが非nil
なら、mark
はマークの非アクティブ性を無視して、何にせよマーク位置(かnil
)をリターンする。
この関数は、カレントバッファーのマークを表すマーカーをリターンする。これはコピーではなく、内部的に使用されるマーカーである。したがって、このマーカー位置にたいする変更は、そのバッファーのマークに直接影響する。それが望む効果でなければ、これを行ってはならない。
(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にセットして、そのマークをアクティブにする。マークの旧値はマークリングにpushされない。
注意:
マークが移動したことをユーザーに確認させ、かつ前のマーク位置が失われることを望む場合のみ、この関数を使用すること。通常は、マークセット時に古いマークはmark-ring
にpushされるべきである。この理由により、ほとんどのアプリケーションはset-mark
ではなく、push-mark
およびpop-mark
を使用するべきである。
Emacs Lispの初心者プログラマーは、誤った用途にマークの使用を試みがちである。ユーザーの利便のために位置を保存するのがマークである。編集コマンドは、マーク変更がコマンドのユーザーレベル機能の一部でない限り、マークを変更するべきではない(そして、そのような場合にはその効果をドキュメントするべきである)。Lispプログラムの内部的な使用のために位置を記憶するためには、マークをLisp変数に格納すること。たとえば:
(let ((beg (point))) (forward-line 1) (delete-region beg (point)))
この関数は、カレントバッファーのマークをpositionにセットして、前のマークをmark-ring
にpushする。positionがnil
の場合は、ポイントの値を使用する。
関数push-mark
は通常、マークをアクティブにしない。アクティブにする場合は、引数activateにt
を指定する。
nomsgがnil
なら、メッセージ‘Mark set’が表示される。
この関数は、mark-ring
のトップ要素をpopして、そのマークをバッファーの実際のマークにする。これはバッファー内のポイントを移動せず、mark-ring
が空なら何も行わない。これはマークを非アクティブ化する。
この変数が非nil
なら、Transient Markモードを有効にする。Transient
Markモードでは、すべてのバッファー変更プリミティブがdeactivate-mark
をセットする。結果として、バッファーを変更するほとんどのコマンドも、マークを非アクティブにする。
Transient
Markモードが有効かつマークがアクティブの場合、通常はポイント近傍に適用されるコマンドの多くは、かわりにリージョンに適用される。そのようなコマンドは、リージョンを処理すべきかどうかをテストするために、関数use-region-p
を使用するべきである。The Regionを参照のこと。
Lispプログラムは、一時的にTransient
Markモードを有効にするために、transient-mark-mode
をnil
でもt
でもない値にセットできる。値がlambda
なら、バッファー変更のような通常ならマークを非アクティブ化するような操作の後、Transient
Markモードを自動的にオフに切り替える。値が(only . oldval)
なら、後続のコマンドがポイントを移動かつシフト変換(shift-translationを参照)されていない場合、あるいは通常はマークを非アクティブにするその他の操作の場合は、transient-mark-mode
に値oldvalをセットする。
これが非nil
なら、LispプログラムおよびEmacsユーザーは、たとえ非アクティブでもマークを使用できる。このオプションは、Transient
Markモードの動作に影響を及ぼす。このオプションが非nil
なら、マークの非アクティブ化によりリージョンのハイライトはオフに切り替えられるが、マークを使用するコマンドは、あたかもマークがアクティブであるかのように振る舞う。
エディターコマンドがこの変数を非nil
にセットすると、エディターコマンドループはコマンドのリターン後に、(Transient
Markモードが有効なら)マークを非アクティブにする。バッファーを変更するすべてのプリミティブは、コマンド終了時にマークを非アクティブにするために、deactivate-mark
をセットする。
コマンド終了時にマークを非アクティブにすることなくバッファーを変更するLispコードを記述するためには、変更を行うコードの周辺でdeactivate-mark
をnil
にバインドすること。たとえば:
(let (deactivate-mark) (insert " "))
Transient
Markモードが有効、またはforceが非nil
の場合、この関数はマークを非アクティブにしてノーマルフックdeactivate-mark-hook
を実行し、それ以外は何も行わない。
この変数が非nil
なら、マークはアクティブである。この変数は、それぞれのバッファーにたいして、常にローカルである。通常はポイント近傍を操作するコマンドが、かわりにリージョンを操作すべきかどうかを判断するために、この変数の値を使用してはならない。その目的にたいしては、関数use-region-p
を使用すること(The Regionを参照)。
これらのノーマルフックは、マークがアクティブまたは非アクティブになった際に、順次実行される。マークがアクティブで、かつリージョンが変更された可能性があるなら、コマンドループの最後にフックactivate-mark-hook
も実行される。
この関数は、ポイント移動コマンドの“シフト選択(shift-selection)”の動作を実装する。Shift Selection in The GNU Emacs
Manualを参照のこと。これは、interactive
指定に文字‘^’を含むコマンド呼び出し時は常に、そのコマンド自身を実行する前に、Emacsコマンドループにより自動的に呼び出される(^を参照)。
shift-select-mode
が非nil
、かつカレントコマンドがシフト変換(shift-translationを参照)を通じて呼び出された場合、この関数はマークをセットして一時的にリージョンをアクティブにする(すでにこの方法によりリージョンが一時的にアクティブにされている場合を除く)。それ以外では、リージョンが一時的にアクティブにされていれば、マークを非アクティブにして、変数transient-mark-mode
に前の値をリストアする。
このバッファーローカル変数の値は、もっとも最近のものが先頭となった、カレントバッファーの以前に保存されたマークのリストである。
mark-ring ⇒ (#<marker at 11050 in markers.texi> #<marker at 10832 in markers.texi> …)
この変数の値は、mark-ring
の最大サイズである。これより多くのマークがmark-ring
にpushされると、新たなマーク追加時にpush-mark
は古いマークを破棄する。