検索エンジンから来た人に注意このマニュアルは、Emacs ver. 19.x 向けのマニュアルを Mule 2.x の開発にあたり邦訳したものを、 電脳外道学会がミラーリングしているものであり、旧版製品パラノイアであるところの椅子人の趣味によるものです。しかしながら、現在の Emacs の主流は ver. 20 以降であり、ver 19.x と ver 20.x とでは、仕様の違いが少なからずあります。 したがって、一般的な Emacs ユーザーにとっては、
このマニュアルと実機の動作とが符合しない場合があります。
|
マーカ(marker)とは、バッファ内のテキストに結び付けられた位置を示 すために使われるLispオブジェクトのことです。テキストの挿入や削除を行なう と、それに追従して、マーカの位置(バッファの先頭を起点とした)が自動的に変 更されます。つまり、マーカは、テキストの特定の場所に貼り付いていることに なります。
マーカとは、バッファと、そのバッファ内での位置を特定するものです。マー カは、位置を表すものとして、通常の整数による表現と同じように、関数の中で 使用することが出来ます。詳しい説明はSee section 位置。
マーカには、二つの属性があります。一つはそのマーカの位置であり、もう一 つはそのマーカの属するバッファです。位置属性は、バッファ内のマーカの(そ の瞬間の)位置に等しい整数です。ただし、位置属性の値は、そのマーカが存在 する間に頻繁に変更されることもあります。テキストの挿入や削除が行なわれる と、マーカは再配置されます。これは、挿入や削除によるテキストの移動にマー カも追従させるということで、挿入や削除が行なわれる前後でマーカの両側の文 字が常に同じであるようにマーカの位置を変更するということです。再配置によっ て、マーカの位置属性の値が変更されます。
マーカの周囲のテキストが削除されても、マーカは、削除されたテキストの前
後の文字の間に残ります。また、マーカの存在する位置にテキストが挿入される
と、通常は、挿入されたテキストの直前にマーカが残ります。ただし、
insert-before-markers
により挿入された場合は、マーカの位置は、挿入
されたテキストの直後になります。(see section テキストの挿入)。
テキストの挿入・削除にともなって、バッファ内の全てのマーカがチェックさ れ、必要ならば再配置が行なわれます。そのため、マーカの数が多いと、挿入や 削除に時間がかかるようになります。ですから、もはや必要なくなったとわかっ ているマーカは、どこも指さないようにしておくのがよいでしょう。どこからも 参照されていないマーカはいずれガベージ・コレクトされますが、もしそれがど こかを指していたら、ガベージ・コレクトされるまではチェックや再配置の対象 となり、時間を浪費することになります。
マーカの位置に対して算術演算を施すことはよく行なわれることなので、
+
や-
を含むたいていの演算子の引数として、マーカそのものを渡
せるようになっています。このような場合、マーカは、その時点で指し示す位置
を表す整数値であるかのように振る舞います。
以下に、マーカの作り方、マーカの設定、マーカ位置へのポイントの移動の例 を示します。
;; とりあえずどこも指していないマーカを作ります。 (setq m1 (make-marker)) => #<marker in no buffer> ;; このバッファの99文字目と100文字目の間にマーカm1
を置きます。 (set-marker m1 100) => #<marker at 100 in markers.texi> ;; このバッファの先頭に一文字挿入してみましょう。 (goto-char (point-min)) => 1 (insert "Q") => nil ;; 一文字挿入に合わせてm1
の内容が変更されます。 m1 => #<marker at 101 in markers.texi> ;; 同じ場所を指す二つのマーカは、 ;;equal
ですが、eq
ではありません。 (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>
あるオブジェクトがマーカであるか調べることができます。また、マーカと整 数のどちらかであるかを調べることもできます。後者は、マーカと整数のどちら でも引数にとることのできる算術関数を使う際に、便利でしょう。
t
を返し、それ以外なら
nil
を返します。引数としてマーカと整数のどちらでもとることのできる
関数は多く存在しますが、整数はマーカそのものではないことに注意してくださ
い。
t
を返し、そ
れ以外ならnil
を返します。
t
を返し、それ
以外ならnil
を返します。
新たにマーカを作る際、どこも指さないマーカを作ったり、ポイント位置を指 すように設定したり、バッファの(その時点で見ることができる)先頭や最後に置 いたり、ほかのマーカと同じ場所を指すように設定することができます。
(make-marker) => #<marker in no buffer>
copy-marker
を参照してく
ださい。
この関数とpoint-min-marker
の例を、以下に示します。この章の(訳注:
英語版の)texinfoファイルを読み込んだバッファ上で実行した結果です。
(point-min-marker) => #<marker at 1 in markers.texi> (point-max-marker) => #<marker at 15573 in markers.texi> (narrow-to-region 100 200) => nil (point-min-marker) => #<marker at 100 in markers.texi> (point-max-marker) => #<marker at 200 in markers.texi>
copy-marker
に1よりも小さな整数を渡すと、カレント・バッファの先頭
を指すマーカを返します。バッファの大きさよりも大きい整数を渡すと、バッファ
の最後を指すマーカを返します。
marker-or-integerがマーカでも整数でもなければ、エラーとなります。
(setq p (point-marker)) => #<marker at 2139 in markers.texi> (setq q (copy-marker p)) => #<marker at 2139 in markers.texi> (eq p q) => nil (equal p q) => t (copy-marker 0) => #<marker at 1 in markers.texi> (copy-marker 20000) => #<marker at 7572 in markers.texi>
この節では、マーカのもつ情報を取り出す関数について説明します。
nil
を返します。
nil
を返します。
(setq m (make-marker)) => #<marker in no buffer> (marker-position m) => nil (marker-buffer m) => nil (set-marker m 3770 (current-buffer)) => #<marker at 3770 in markers.texi> (marker-buffer m) => #<buffer markers.texi> (marker-position m) => 3770
二つのマーカが同じバッファの同じ位置に設定されているか、もしくはどちら
もどこも指していない場合、この二つのマーカは(たとえeq
ではなくとも)
equal
と見倣されます。
この節では、マーカの位置の変更の仕方について述べます。あるマーカの位置 を変更する場合、それが自分のプログラム以外で使われていないか、もし、ほか で使われているなら、実際にそのマーカを動かすことによってどのような影響が でるのか確認してください。このような確認を怠ると、Emacsのほかの処理に混 乱が生じる可能性があります。
positionが1より小さい場合、markerはバッファの先頭に移されま
す。positionがバッファの大きさより大きい場合は、バッファの最後に移
されます。positionがnil
だったり、どこも指していないマーカで
あったりした場合は、markerはどこも指さないように設定されます。
返される値は、markerです。
(setq m (point-marker)) => #<marker at 4714 in markers.texi> (set-marker m 55) => #<marker at 55 in markers.texi> (setq b (get-buffer "foo")) => #<buffer foo> (set-marker m 0 b) => #<marker at 1 in foo>
set-marker
の別名です。
マーク(the mark)と呼ばれる特殊なマーカが、各バッファに一つずつ存
在しています。これは、C-wやC-x TABのようなコマンドに備
えて、位置を記憶しておくために使われるものです。Emacs Lispのプログラムが
マークをセットするのは、ユーザが使いそうな場合に限るべきであり、プログラ
ム内部での用途にマークを使用すべきではありません。たとえば、
replace-regexp
命令は、実際に置換を行なう前に、ポイントの位置をマー
クに入れておきます。これは置換が終了した後、元の場所に簡単に戻ることがで
きるようにするためです。
対話的に実行された場合にポイントとマークに囲まれたテキストを加工するよ
うに作られたコマンドが、たくさんあります。このようなコマンドを作る場合は、
直接マークの値を調べてはいけません。かわりに、interactive
関数を
`r'引数とともに呼び出しましょう。こうすると、対話的にコマンドを実行
した場合、ポイントとマークの値が引数として渡されます。また、ほかのLispプ
ログラムから呼び出す場合は、明示的に引数を与えることができます。
See section interactive
用のコード文字。
マークは、ほかのバッファのマークとは独立した、そのバッファ独自の値を持っ ています。バッファが作られるときにマークも一緒に作られますが、このマーク はこの時点ではどこも指していません。この状態は"バッファにマークが存在し ない"ものとして扱われます。
一度バッファ内にマークが"存在する"ようになった後では、マークが消えて
しまうようなことはまずありません。ただし、Transient Markモードでは、マー
クが無効(inactive)になることがあります。mark-active
変数は、
全てのバッファにおいて常にローカルな変数で、マークが有効であるかどうかを
示しています。この変数が非nil
なら、マークが有効であることを表しま
す。また、変数deactivate-mark
を非nil
の値にセットすれば、エ
ディタのコマンド・ループに戻る度にマークが無効になります。ただしこれは、
Transient Markモードでのみ有効です。
ユーザがTransient Markモードを使いはじめる大きな動機になり得るのは、マー クが有効な状態にあるとき、リージョンがわかりやすく強調表示されるという点 です。See section Emacsの表示。
バッファにはマークに加えて、マーク・リング(mark ring)があります。
これは、以前のマークの値を保持しているマーカのリストです。マークの値を変
更するコマンドを実行すると、通常、変更前のマークの値がマーク・リングに保
存されます。変数mark-ring-max
は、マーク・リングの最大容量を示しま
す。マーク・リングが一杯になってさらに新たにマークの値を保存する際には、
一番古いマーカが消去されます。
マークが無効の状態になっている場合は、通常、エラーになります。ただし、
forceが非nil
なら、マークの状態いかんに関わらずその位置、も
しくは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>
ほかのマーカと同じように、このマーカをほかのバッファに移すことができます。 しかし、マークをほかのバッファに移すようなことは止めておいた方がいいでしょ う。仮にそうした場合、問題は起こらないにしても、かなり奇妙な現象が発生す ることになるでしょう。
注意: この関数を使うのは、マークを動かしたということをユーザに
見せ、なおかつ、直前のマークの位置情報を破棄する場合にのみ使ってください。
通常は、マークを新たに設定するときには、古いマークをmark-ring
に保
存しておくべきです。したがってほとんどの場合、set-mark
は使わずに、
push-mark
とpop-mark
を使うべきです。
Emacs Lispプログラミングの初心者は、マークを間違った用途に使おうとしがち です。マークはユーザの便宜を図るために、位置を記憶するものです。編集用の コマンドでは、ユーザとのやり取りのためにマークを変更する必要がないかぎり、 マークを変更すべきではありません。また、変更の必要がある場合でも、マーク が変更されることをドキュメントに明記しておくべきです。Lispプログラム内部 の都合でどこかの位置を記録しておくのなら、Lispの変数に保存しましょう。た とえば以下のようにします。
(let ((beg (point))) (forward-line 1) (delete-region beg (point))).
mark-ring
に保存されます。positionが
nil
ならば、ポイントの値が使われます。この関数は、nil
を返し
ます。
push-mark
は通常、マークを有効にしません。activate
としてt
が渡されれば有効にします。
nomsgが非nil
でない限り、`Mark set'というメッセージが表
示されます。
mark-ring
の先頭の要素を取り出して、それをバッファのマー
クとして設定します。ポイントは移動しません。mark-ring
が空なら何も
しません。また、マークを無効にします。
返される値には、意味がありません。
nil
であるとき、Transient Markモードが有効になります。
このモードでは、バッファの内容を変更するプリミティブ関数が、
deactivate-mark
を非nil
に設定するようになります。その結果、
バッファ内容を変更するコマンドを実行するたびに、通常、マークが無効になり
ます。
nil
であるとき、エディタのコマンド・ループは、コマンド
を実行するたびにマークを無効にするようになります。ただし、これは
Transient Markモードでのみ有効です。
nil
に設定すると、マークが有効になります。この変数は、
常にバッファローカルです。
activate-mark-hook
は、マークが有効でリージョ
ンが変更された時にも(その変更を行なったコマンドの直後に)実行されます。
mark-ring => (#<marker at 11050 in markers.texi> #<marker at 10832 in markers.texi> ...)
mark-ring
の容量の最大値を保持します。この値より多くの
個数のマークをpush-mark
でmark-ring
に保存しようとすると、一
番古いマークが捨てられます。
ポイントとマークの間にあるテキストを、リージョン(the region)と呼 びます。ポイントとマークで区切られたテキストを加工する関数はいろいろとあ りますが、ここでは特に、リージョンそのものに関わる関数について説明します。
マークがどこも指していない場合は、エラーとなります。
マークがどこも指していない場合は、エラーとなります。
region-beginning
やregion-end
を使う必要があるプログラムは
ほとんどないはずです。リージョンを使用するようなコマンドは、通常、
interactive
関数を`r'引数とともに呼び出してリージョンの始まり
と終りの位置を得るように作られるべきです。このようにすれば、ほかのLispプ
ログラムからこのようなコマンドを呼び出す場合にも、リージョンの境界を引数
として明示的に渡すことができます(See section interactive
用のコード文字)。
Go to the first, previous, next, last section, table of contents.