[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

29. テキスト

本章では、バッファ中のテキストを扱う関数について述べます。 ほとんどがカレント・バッファのテキスト、 それもポイント近辺の検査、挿入、消去を行なうものです。 多くは対話的です。 テキストを変更するすべての関数は、 その変更の取り消しが可能です(see section 取り消し)。

テキスト関係の関数の多くは、 startおよびendという引数で渡される、 二つのバッファ内位置で定義されるテキストのリージョンにたいして、 操作を行ないます。 これらの位置はマーカ(see section マーカ)か、 数値による文字の位置(see section 位置)です。 この二つの位置が与えられている順番は重要ではありません。 startで終りendで始まってもかまいません。 たとえば、(delete-region 1 10)(delete-region 10 1)は等価です。 どちらかの位置がバッファのバッファの範囲に存在しない場合、 args-out-of-rangeエラーになります。 対話的に呼び出した場合、これらの引数値はポイントとマークになります。

本章では、「テキスト」は対象となるバッファ中の文字と、 (もし意味があるときは)テキストの属性を指します。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

29.1 ポイント近くのテキストの検査

ポイントのまわりの文字を調べる多くの関数があります。 ここではそのうちいくつかの簡単なものについて述べます。正規表現の検索looking-atも参照してください。

Function: char-after position

この関数は、カレント・バッファの位置positionの(直後の)文字を返します。 positionが範囲の外にある場合、つまり、バッファの先頭より前や、 末尾の後の場合、値はnilです。

以下の例において、バッファの最初の文字は`@'になっています。

 
(char-to-string (char-after 1))
     ⇒ "@"
Function: following-char

この関数は、カレント・バッファ中のポイントに続く文字を返します。 これは(char-after (point))と似ています。 ポイントがバッファの最後の位置にある場合、 following-charは0を返します。

ポイントは文字と文字の間にあるのですが、端末のカーソルは普通 ポイントの直後の文字にかぶさって見えます。 したがってfollowing-charが返す文字は、カーソル上の文字です。

次の例において、ポイントは`a'`c'の間にあります。

 
---------- Buffer: foo ----------
Gentlemen may cry ``Pea∗ce! Peace!,''
but there is no peace.
---------- Buffer: foo ----------

(char-to-string (preceding-char))
     ⇒ "a"
(char-to-string (following-char))
     ⇒ "c"
Function: preceding-char

この関数は、カレント・バッファのポイントの前にある文字を返します。 上記の例のfollowing-charの下を見てください。 ポイントがバッファの最初の位置にある場合、 preceding-charは0を返します。

Function: bobp

この関数は、ポイントがバッファの先頭にある場合tを返します。 ナローイングが用いられている場合、 ここでいう先頭はそのアクセス可能部分の先頭を意味します。ポイントpoint-minも参照してください。

Function: eobp

この関数は、ポイントがバッファの最後にある場合tを返します。 ナローイングが用いられている場合、 ここでいう先頭はそのアクセス可能部分の最後を意味します。See section ポイントpoint-maxも参照してください。

Function: bolp

この関数は、 ポイントが行の先頭にある場合tを返します。See section テキスト行単位での移動。 バッファ(あるいはアクセス可能部分)の先頭は、 いつでも行頭のうちにはいります。

Function: eolp

この関数は、ポイントが行の終りにある場合tを返します。 バッファ(あるいはアクセス可能部分)の終りは、いつでも行末とみなします。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

29.2 バッファ内容の調査

この節では、 Lispプログラムでバッファのテキストの一部を文字列へ変換するための、 二つの関数について述べます。

Function: buffer-substring start end

この関数は、カレント・バッファ中の位置startendで定義された リージョンのテキストのコピーを文字列に変換して返します。 引数がバッファのアクセス可能部分を指さない場合、 buffer-substringargs-out-of-rangeエラーを通知します。

startendより前にする必要はなく、 引数はどちらの位置でもかまいません。 しかし普通は、小さい方が前です。

もし転記されるテキストにテキスト属性があるとき、 転記した文字のテキスト属性もいっしょに転記されます。See section テキスト属性。 しかしながらバッファのオーバレイ(see section オーバレイ)とその属性は、 無視され転記されません。

 
---------- Buffer: foo ----------
This is the contents of buffer foo

---------- Buffer: foo ----------

(buffer-substring 1 10)
⇒ "This is t"
(buffer-substring (point-max) 10)
⇒ "he contents of buffer foo
"
Function: buffer-substring-no-properties start end

これはbuffer-substringに似ていますが、 テキスト属性の転記をしません。See section テキスト属性。 この関数を使いalistを参照して文字列をとってくる例を示します。

 
(setq flammable
      ;; 訳注: 原文はbuffer-substringだった。
      (assoc (buffer-substring-no-properties start end)
             '(("wood" . t) ("paper" . t)
               ("steel" . nil) ("asbestos" . nil))))

もしこれをbuffer-substringで書いても、 必ずしも正しく動作しません。 バッファから転記した文字列にたまたまテキスト属性があったときは、 比較に失敗してしまいます。 (28)

Function: buffer-string

この関数は、カレント・バッファのアクセス可能部分の内容を文字列として返します。 これは(point-min)(point-max)の間の部分です(see section ナローイング)。

 
---------- Buffer: foo ----------
This is the contents of buffer foo

---------- Buffer: foo ----------

(buffer-string)
     ⇒ "This is the contents of buffer foo
"

[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

29.3 テキストの比較

この関数は、 文字列に変換することなく、 バッファ内のある部分を比較します。

Function: compare-buffer-substrings buffer1 start1 end1 buffer2 start2 end2

この関数は、 文字列に変換することなく、 同じあるいは異なるバッファ内のある部分を比較します。 はじめの三つの引数でバッファと二つの位置を与えて、 これで一つの部分を指定します。 終りの三つの引数で同様に別の部分を指定します。 buffer1buffer2、あるいは両方にnilを指定すると、 カレント・バッファになります。

はじめの部分が小さければ値は負になり、はじめの方が大きければ正、 もし同じなら0になります。 結果の絶対値は、 比較部分で最初の異なる文字の添え字に1を加えたものになります。

case-fold-searchが非nilのとき、 当関数は文字の比較で大文字小文字の違いを無視します。 テキスト属性は常に無視します。

カレント・バッファに`foobarbar haha!rara!'というテキストがあったとします。 そしてこの例で二つの部分を`rbar '`rara!'します。 最初の部分が次の部分よりも大きいので、値は2です。

 
(compare-buffer-substring nil 6 11 nil 16 21)
     ⇒ 2

[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

29.4 テキストの挿入

挿入(insertion)とはバッファに新しいテキストを加えることです。 挿入するテキストはポイントに、 つまりポイントの前の文字と後の文字の中間に、入ります。

挿入箇所より後の位置を指すマーカは挿入によって再配置しますので、 まわりのテキストの場所からは止まっているようにみえます(see section マーカ)。 マーカが挿入箇所を指していたとき、普通はマーカの移動はおきないので、 挿入したテキストの先頭を指します。 しかしながらinsert-before-markersのような特殊な関数では、 挿入箇所のマーカを挿入したテキストの後に移動します。

挿入関数のうちあるものは挿入するテキストの前にポイントを残し、 あるものは後に移動します。 前者をポイントの後に(after point)挿入するといい、 後者をポイントの前に(before point)挿入するといいます。

カレント・バッファが読出し専用のとき、挿入関数はエラーを通知します。

この関数群は文字列やバッファからテキスト文字を転記すると同時に、 属性も転記します。 挿入される文字は、転記されてくる文字とちょうど同じ属性をもちます。 その一方、 文字列やバッファの一部としてではなく文字を別々な引数として指定する場合、 その文字はテキスト属性をまわりのテキストから継承します。

Function: insert &rest args

この関数は、カレント・バッファのポイントを先に進めながら、 ポイントのある位置にいくつかの文字列や文字argsを挿入する、 つまり、ポイントの前にテキストを挿入します。 args中に文字列でも文字でないものが含まれている場合、エラーになります。 値はnilです。

Function: insert-before-markers &rest args

この関数は、カレント・バッファのポイントを先に進めながら、 ポイントのある位置にいくつかの文字列や文字argsを挿入します。 args中に文字列でも文字でないものが含まれている場合、エラーになります。 値はnilです。

当関数はほかの挿入関数と異なり、 挿入箇所を指していたマーカの位置を挿入したテキストの後に再配置します。

Function: insert-char character count &optional inherit

この関数は、count個のcharacterを カレント・バッファのポイントの前に挿入します。 引数countは数値でなくてはいけません。 また、characterは文字でなくてはいけません。 値はnilです。

もしinheritが非nilならば、 挿入される文字は粘着的テキスト属性を、 挿入箇所の前後の2文字から継承します。See section テキスト属性の粘着性

Function: insert-buffer-substring from-buffer-or-name &optional start end

この関数は、バッファfrom-buffer-or-name (あらかじめ存在しなくてはいけません)の一部分を、 カレント・バッファのポイントの前に挿入します。 挿入するテキストはstartendで定義されるリージョンです (省略するとバッファのアクセス可能な先頭と末尾になります)。 当関数はnilを返します。

次の例では、バッファ`bar'をカレント・バッファとしてこの形式を実行します。 最初、バッファ`bar'は空とします。

 
---------- Buffer: foo ----------
We hold these truths to be self-evident, that all
---------- Buffer: foo ----------

(insert-buffer-substring "foo" 1 20)
     ⇒ nil

---------- Buffer: bar ----------
We hold these truth∗
---------- Buffer: bar ----------

挿入に加えてまわりのテキストからテキスト属性を継承する ほかの挿入用の関数については、See section テキスト属性の粘着性。 字下げ関数で挿入された空白もテキスト属性を継承します。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

29.5 ユーザ・レベルの挿入コマンド

この節では、 主にユーザが呼ぶことを想定しているものの、 Lispプログラムから呼んでも便利な、 テキストを挿入する上位のコマンドを解説します。

Command: insert-buffer from-buffer-or-name

このコマンドは、バッファfrom-buffer-or-name (これは存在しなくてはいけません)の全内容をカレント・ バッファのポイントの後に挿入します。挿入されたテキストの後にマークを置きます。 値はnilです。

Command: self-insert-command count

このコマンドは、最後にタイプされた文字を挿入します。 count回、ポイントの前で挿入を繰り返してnilを返します。 ほとんどの印字文字がこのコマンドにバインドされています。 self-insert-commandは普段もっともよく呼ばれるEmacsの関数ですが、 これをキーマップに入れるときをのぞけば、 プログラムがこれを用いることはほとんどありません。

対話的に呼び出すと、countは数値前置引数になります。

auto-fill-functionが非nilなら、 このコマンドはスペースあるいは改行が挿入されるたびに、 auto-fill-functionを呼び出します(see section 自動的行詰め)。

Abbrevモードが有効で、 挿入した文字が語構成可能構文をもたないとき、 当コマンドは省略形の展開を行ないます。 (省略形とその展開そして、See section 構文クラスのテーブル)

入力した文字が閉じ括弧構文をもつとき、 当関数はblink-paren-functionを呼び出します(see section 対応括弧の点滅表示)。

Command: newline &optional number-of-newlines

このコマンドは、改行をカレント・バッファのポイントの前に挿入します。 number-of-newlinesが与えられると、改行をその個数だけ挿入します。

現在の桁数がfill-columnの値よりも大きく、 number-of-newlinesの値がnilのとき、 この関数は、auto-fill-functionを呼び出します。 典型的なauto-fill-functionの実行することとは、改行の挿入です。 この場合最終的には二つ改行を別の場所に挿入することになります。 一つはポイントで、もう一つは行のどこか前の場所です。 newlinenumber-of-newlinesが非nilのとき、 自動行詰めをしません。

このコマンドは左マージンが0でなければ、 そこまで字下げを行ないます。See section 行詰めのマージン

返却値はnilです。 対話的に呼ばれた場合、 number-of-newlinesは数値前置引数になります。

Command: split-line

このコマンドは、現在の行をわけ、 ポイントの後の (監訳者注: 空白でないところから行末までの) 部分を垂直に下に動かし、 前にあった場所のすぐ下の行とします。 下の行の先頭に必要に応じて空白をあけるのは、 indent-to関数で行ないます。 ポイントの位置を返します。

プログラムがこの関数を使うことはめったにありません。

Variable: overwrite-mode

この変数は、Overwriteモードが有効かどうかを制御します。 非nilの値でモードが有効になります。 どのような方法で変更しても自動的にバッファローカルになります。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

29.6 テキストの消去

消去とはバッファのテキストの一部をkillリングに保存せずに、 なくしてしまうことをいいます(see section killリング)。 消去したテキストはヤンクできません。 しかし、取り消し機構で元に戻すことはできます(see section 取り消し)。 一部の消去の関数は、 ある特別な場合にkillリングにテキストを保存することがあります。

消去の関数はすべて、 カレント・バッファにたいし操作を行ないnilを返します。

Function: erase-buffer

この関数は、カレント・バッファ中の全テキストを消去し、空にします。 バッファが読出し専用の場合、buffer-read-onlyエラーを通知します。 そうでない場合、何もきかずにテキストを消去します。 nilを返します。

通常、バッファから多量のテキストが消去されると、 「バッファが縮んだ」("because it has shrunk")ため、 このバッファの自動セーブが禁止になります。 しかしながらerase-bufferはそうしません。 往々にして消去する前のテキストと後のテキストとはお互いに関係がないため、 前のテキストの大きさとの比較をするべきではないからです。

Command: delete-region start end

この関数は、 カレント・バッファ中のstartendで定義される リージョン内のテキストを消去します。 値はnilです。

Command: delete-char count &optional killp

このコマンドは、 ポイントの直後(countが負の場合は、直前) のcount文字を消去します。 killpが非nilの場合、 消去した文字をkillリングに保存します。

対話的に呼ばれた場合、countは数値前置引数になり、 killpは未処理の前置引数になります。 したがって前置引数が与えられるとテキストはkillリングに保存されます。 前置引数が与えられない場合、1文字が消去されkillリングには保存されません。

返却値は常にnilです。

Command: delete-backward-char count &optional killp

このコマンドは、 ポイントの直前(countが負の場合は、直後) のcount文字を消去します。 killpが非nilの場合、 消去した文字をkillリングに保存します。

対話的に呼ばれた場合、countは数値前置引数になり、 killpは未処理の前置引数になります。 したがって前置引数が与えられるとテキストはkillリングに保存されます。 前置引数が与えられない場合、1文字が消去されkillリングには保存されません。

返却値は常にnilです。

Command: backward-delete-char-untabify count &optional killp

このコマンドは、タブをスペースに変え、 後ろの方向にcount文字を消去します。 タブをスペースに変える際、ポイントを同じ桁に保持するよう十分な数 のスペースをバッファに挿入します。 killpが非nilの場合、 このコマンドは消去した文字をkillリングに保存します。

タブからスペースへの変換はcountが正の場合だけおこります。 負の場合、ポイントの後のちょうど-count文字をを消去します。

対話的に呼ばれた場合、countは数値前置引数になり、 killpは未処理の前置引数になります。 したがって前置引数が与えられるとテキストはkillリングに保存されます。 前置引数が与えられない場合、1文字が消去されkillリングには保存されません。

返却値は常にnilです。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

29.7 ユーザ・レベルの消去コマンド

この節では、 主にユーザが呼ぶことを想定しているものの、 Lispプログラムから呼んでも便利な、 テキストを消去する上位のコマンドを解説します。

Command: delete-horizontal-space

この関数は、ポイントのまわりのスペースやタブをすべて消去します。 nilを返します。

次の例において、 delete-horizontal-spaceを各行に1回ずつ4回呼んでいます。 (訳注: この関数を呼ぶ前に) ポイントは各行の2番目と3番目の文字の間に存在しています。

 
---------- Buffer: foo ----------
I ∗thought
I ∗     thought
We∗ thought
Yo∗u thought
---------- Buffer: foo ----------

(delete-horizontal-space)   ; 4回。
     ⇒ nil

---------- Buffer: foo ----------
Ithought
Ithought
Wethought
You thought
---------- Buffer: foo ----------
Command: delete-indentation &optional join-following-p

この関数は、ポイントの存在する行を前の行と結合し、 場合によってスペースを一つ残してその結合部分にある空白を消去します。 join-following-pが非nilの場合、 delete-indentationは、この行と後に続く行をつなげます。 値はnilです。

行詰め接頭辞があり、 つながる行がその接頭辞で始まるとき、 delete-indentationは、 行をつなぐ前に行詰め接頭辞を消去します。See section 行詰めのマージン

次の例において、ポイントは`events'で始まる行に位置しています。 前の行の行末がスペースで終わっていても違いは生じません。

 
---------- Buffer: foo ----------
When in the course of human
∗    events, it becomes necessary
---------- Buffer: foo ----------

(delete-indentation)
     ⇒ nil

---------- Buffer: foo ----------
When in the course of human∗ events, it becomes necessary
---------- Buffer: foo ----------

行をつないだ後つなぎ目にスペースを残すかどうかは、 関数fixup-whitspaceで決めます。

Function: fixup-whitespace

この関数は、文脈にしたがって、 ポイントの前後にある空白をなくしたり、 一つのスペースに置き換えたりします。 nilを返します。

行頭や行末の場合、スペースを残すことはありません。 閉じ括弧構文をもつ文字の前の場合、 開き括弧や表現接頭辞の構文をもつ文字の後の場合も、 スペースは残しません。 上記の場合をのぞいてスペースを一つ残します。See section 構文クラスのテーブル

以下の例において、fixup-whitespaceを最初に呼ぶ際、 ポイントは1番目の行の`spaces'という語の前に位置しています。 2回目に呼ぶ時、ポイントは`('の直後に位置しています。

 
---------- Buffer: foo ----------
This has too many     ∗spaces
This has too many spaces at the start of (∗   this list)
---------- Buffer: foo ----------

(fixup-whitespace)
     ⇒ nil
(fixup-whitespace)
     ⇒ nil

---------- Buffer: foo ----------
This has too many spaces
This has too many spaces at the start of (this list)
---------- Buffer: foo ----------
Command: just-one-space

このコマンドはポイントのまわりのすべてのスペースとタブを、 一つのスペースに置き換えます。 nilを返します。

Command: delete-blank-lines

この関数は、ポイントを囲む空白行を消去します。 ポイントが1行以上の空白行をその前か後ろにもつ空白行に位置する場合、 1行を残しあとはみな消去します。 ポイントが1行のみの空白行に存在する場合、その空白行を消去します。 ポイントが空白行でない行に位置する場合、 その後に続く空白行をすべて消去します。

空白行とはタブとスペース以外のものを含まない行のことです。

delete-blank-linesnilを返します。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

29.8 killリング

killの関数は消去の関数のようにテキストを消去しますが、 ユーザがヤンク(yanking)して再び挿入できるように テキストを記録しておきます。 ほとんどの関数名には`kill-'がつきます。 一方、`delete-'で始まる名前の関数は、 ヤンクのための保存をしません(取り消しはできます)。 これらは「消去」の関数です。

killのコマンドのほとんどは主に対話的な目的のためで、ここでは解説しません。 ここで解説するのは、そのようなコマンドを作るための関数群です。 テキストをkillするコマンドを書こうと思ったらこの関数群を使ってください。 Lisp関数の中で内部的な目的のためにテキストを消去するときは、 killリングの内容を壊さないようにするため、 通常は消去のほうの関数を使う必要があります。See section テキストの消去

ヤンクのためにkillしたテキストはkillリング(kill ring)に保存します。 これは、一番最後のkillだけでなく、 最後の何回かのkillを保存したリストです。 これを"ring"(リング)というのは、 ヤンクがリングの要素を周期的な順序で扱うためです。 リストは変数kill-ringに保管してあり、 リストを扱うごく普通の関数でも操作できますが、 この節で述べるようにそれをリングとして使う専門の関数もあります。

killした(殺した)ものだからといっても破壊をしないので、 "kill"という語が使われているのは残念だという人がいます。 死は永久的なもので、 殺された("killed")ものは二度と戻ってこないという点では、 日常生活とは対照的です。 そのためほかのたとえが提案されています。 たとえば、"cut ring"という用語では、 それ以前にハサミと糊で手書きの切り(cut up)貼りをしたことのある人には、 意味があるでしょう。 でも今となってはこの用語を変更するのは困難です。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

29.8.1 killリングの概念

killリングはリストに文字列として、 killされたテキストを最近のものを最初にして記録します。 たとえば、短いkillリングは以下のようになっています。

 
("some text" "a different piece of text" "even older text")

リストの長さがkill-ring-maxになったら、 新しい項目を追加すると自動的に最後の項目を消去します。

killのコマンドがほかのコマンドにはさまれると、 killのコマンドは新しい項目をつくります。 連続した複数のkillのコマンドはkillリングで単一の項目になり、 ヤンクのときの一つの単位になります。 2回目以降の連続したkillのコマンドは、 最初のそれが作った項目にテキストを追加します。

killリング中の一つの項目は、 ヤンクでリングの「前」へと指示されます。 あるヤンクのコマンドは異なる要素を「前」へと指示すことで、 リングを「まわし」ます。 しかし、この仮想的な回転は実際のリストの変更はしません。 最近の項目が常にリストの最初にきます。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

29.8.2 killの関数

kill-regionはテキストをkillするときにいつも使うサブルーチンです。 このコマンドを呼ぶ関数はすべて「killのコマンド」 (で多分、名前には`kill'がつくべき)です。 kill-regionは新しくkillしたテキストを、 killリングの先頭に置くか、一番最近の要素につけたすかします。 これはlast-command変数で前のコマンドがkillのコマンドだったかを判別し、 もしそうだった場合、killしたテキストを最も新しい項目に追加します。

Command: kill-region start end

この関数は、 startendで定義されるリージョン内のテキストをkillします。 このテキストはテキスト属性といっしょに消去されますが、 killリングに保存されます。 値は常にnilです。

対話的に呼ばれた場合、startendはポイントとマークになります。

バッファが読出し専用のとき、 kill-regionは同じようにkillリングを変更し、 バッファを修正せずにエラーを通知します。 読出し専用のバッファからkillリングへテキストを写すとき、 ユーザがどんなkillのコマンドを使うこともできて便利です。

Command: copy-region-as-kill start end

この関数は、 startendで定義されたリージョンを (テキスト属性も含めて)killリング上に保存します。 そのテキストをバッファから消去することはしません。 nilを返します。 対話的に呼ばれるとstartendはポイントとマークになります。 一瞬カーソルを動かしたりエコー領域にメッセージを表示したりして、 写したテキストを示します。

このコマンドは、 this-commandkill-regionにすることはありませんので、 killのコマンドが続いても同じkillリングの項目に追加されません。

Emacs 18をサポートする目的がないのなら、 Lispプログラムではcopy-region-as-killを呼ばないでください。 Emacs 19では、 kill-newkill-appendを使うほうが よいでしょう。See section 下位のkillリング


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

29.8.3 ヤンクの関数

ヤンク(yanking)とは、 前にkillしたテキストをkillリングから再び挿入することです。 テキスト属性も転記されます。

Command: yank &optional arg

この関数は、 killリングの最初の項目にあるテキストをポイントの前に挿入します。 テキストの前にマークを置き後にポイントを置きます。

(対話的にC-uを押下し数字を押下せずに呼んだときのように) argがリストの場合、yankは上記のようにヤンクしますが、 挿入したテキストの前にポイントを位置づけ テキストの終りにマークを位置づけます。

argが数字の場合、 yankはkillされたテキストのarg番目に新しいもの、 つまり、killリングのリストのarg番目の要素を挿入します。

yankがその内容を変えたりすることはありません。 (訳注:引数がなければ)killリングを回すこともありません。 nilを返します。

Command: yank-pop arg

この関数は、 killリングからヤンクされたばかりの項目を killリングの別の項目で置き換えます。

このコマンドはyankyank-popの直後でしか許されません。 このような場合、 リージョンはその前のyankで挿入されたばかりのテキストをもちます。 yank-popはそのテキストを消去し、 その場所に、killされた別のテキストを挿入します。 消去したテキストはすでにkillリング上のどこかにありますから、 killリングへの追加は行ないません。

argnilの場合、 置き換えるテキストはkillリングの一つ手前の要素です。 argが数値の場合、 置き換えるのはarg番目に前のkillになります。 argが負の場合、置き換えるのはより最近のkillになります (訳注: たとえば、引数が2なら二つ手前のkill、 -2なら二つ後のkillということです)。

killリング中のkillのシーケンスは、 前に戻るようになっているため、 最も古いものの後に最も新しいものがきて、 最も新しいものの前に最も古いものがきます。

値は常にnilです。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

29.8.4 下位のkillリング

以下の関数と変数はkillリングへの下位のアクセスのためのものですが、 Lispプログラムから使っても便利です。 X Windowのセレクションを使った対話のめんどうもみます。 これらはEmacsバージョン18には存在しません。

Function: current-kill n &optional do-not-move

関数current-killは、 killリングの先頭を指すヤンク・ポインタをリング中でn回 (最近のkillから古いkillへ)まわして、 そこにきたリングのテキストを返します。

省略可能な第2引数do-not-moveが非nilのとき、 current-killは、ヤンク・ポインタを変えません。 現在のヤンク・ポインタから数えてn番目のkillを返すだけです。

nが、(最後のkillを示す)0になっているとき、 current-killは、 killリングを見る前にinterprogram-paste-function (下記参照)の値を呼びます。

Function: kill-new string

この関数は、killリングの先頭にテキストstringを、 新しい項目として入れます。 必要に応じて一番古い項目をすてます。 また、interprogram-cut-function(下記参照)の値の起動も行ないます。

Function: kill-append string before-p

この関数は、 テキストstringをkillリングの最初の項目として追加します。 普通はstringは項目の末尾につきますが、 before-pが非nilのときは先頭につきます。 また、interprogram-cut-function(下記参照)の値の起動も行ないます。

Variable: interprogram-paste-function

この変数は、 ウィンドウ・システムを使っているときに、 killしたテキストをほかのプログラムに転送する方法を提供します。 値はnilか引数のない関数でなければなりません。

値が関数のとき、current-killが「最新のkill」を得るために、 これを呼び出します。 関数が非nilの値を返すと、 その値が「最新のkill」として利用されます。 nilを返すと、kill-ringの最初の要素が利用されます。

このフックの通常の使用例は、 Xサーバーの第1セレクションがほかのクライアントに所属しているときでも、 このセレクションを最新のkillとして取り込むことです。See section Xセレクション

Variable: interprogram-cut-function

この変数は、 ウィンドウ・システムを使っているときに、 killしたテキストをほかのプログラムに通信する方法を提供します。 値はnilか引数が一つの関数でなければなりません。

値が関数のとき、kill-newkill-appendは、 killリングの新しい1番目の要素を引数に、 これを呼び出します。

このフックの通常の使用例は、 Xサーバーの第1セレクションに 新しくkillしたテキストとして設定することです。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

29.8.5 killリングの内部

変数kill-ringは、 killリングの内容を文字列のリストとして保持します。 最も最近のkillは常にリストの先頭にきます。

kill-ring-yank-pointer変数は、 CARが次にヤンクするテキストであるような、 killリングのリストの中の連鎖を指します。 これで輪の「先頭」を特定(identify)します。 kill-ring-yank-pointerを違う連鎖に動かすことを、 killリングの回転(rotating the kill ring)といいます。 killリングを"ring"(リング)というのは、 ヤンク・ポインタを動かす関数がリストの最後から最初へ、 あるいはその逆におりかえす(wrap around)ためです。 killリングの回転は論理的なことなので、 kill-ringの値を変えません。

kill-ringkill-ring-yank-pointerはLispの変数で、 普通はリストを値にもちます。 kill-ring-yank-pointerの"pointer"という語は、 変数の目的が次のヤンクコマンドで使うリスト中の一つの要素を特定する ことを示しています。

kill-ring-yank-pointerの値は常に、 killリングのリスト中の一つの連鎖にeqです。 それが特定する要素とは、その連鎖のCARのことです。 killリングを変えるkillのコマンドもこの変数をkill-ringの値へ変えます。 これで新しくkillしたテキストが前になるように、 輪を回したことになります。

次の図は、変数kill-ring-yank-pointerがkillリング ("some text" "a different piece of text" "yet older text") の第2項目を指している様子を示します。

 
kill-ring       kill-ring-yank-pointer
  |               |
  |     ___ ___    --->  ___ ___      ___ ___
   --> |___|___|------> |___|___|--> |___|___|--> nil
         |                |            |            
         |                |            |            
         |                |             -->"yet older text" 
         |                |
         |                 --> "a different piece of text" 
         |
          --> "some text"

この状態はC-y(yank)の直後のM-y(yank-pop)で (監訳者注:あるいはC-u 2 C-yで) おきるはずです。

Variable: kill-ring

この変数は、killされたテキストの並びを、 最近にkillしたものを前にして、保持します。

Variable: kill-ring-yank-pointer

この変数の値は、 killリングのどの要素がヤンクの輪の「先頭」なのかを示します。 厳密にいうと、 この値はkill-ringの後部(tail)で、 CARyankがヤンクすべきkill文字列を指すものです。

User Option: kill-ring-max

この変数の値は、 末尾の(最も古い)要素が捨てられ始める前にkillリングの長くなりうる最大の長さです。 kill-ring-maxのデフォルト値は30です。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

29.9 取り消し

ほとんどのバッファは取り消しができるようにするために、 バッファのテキストの全変更を記録した undoリスト(undo list)があります (これのないバッファはたいてい、特別な目的のためのバッファで、 Emacsは取り消しが便利でないと仮定します)。 バッファのテキストを修正する全プリミティブ関数は、 自動的に変数buffer-undo-listというundoリストの前に、 要素を追加します。

Variable: buffer-undo-list

この変数の値はカレント・バッファのundoリストです。 tという値は、取り消し情報の記録を禁止します。

以下はundoリストの要素の種類です。

整数

この種の要素はポイントの以前の値を示します。 普通のカーソル移動はどんな種類の取り消し記録もつくりませんが、 消去のコマンドはこの項目を使って、 コマンドの前にポイントがどこにあったかを記録します。

(beg . end)

この種の要素は挿入されたテキストを消去する方法を示します。 挿入によりテキストはバッファでbeg-endの範囲を占めます。

(text . position)

この種の要素は消去されたテキストを挿入する方法を示します。 消去されたテキストは文字列textです。 再挿入すべき場所は(abs position)です。

(t high . low)

この種の要素は無修正のバッファが修正されたことを示します。 要素のhighlowは二つの整数で、 以前にセーブした時刻や読み込んだときの(訳注: ファイルの修正)時刻のように、 対応づけられたファイルの修正時刻を、 おのおの16ビットずつ記録します。 primitive-undoはこの値を使って、 バッファが再び無修正の状態になったかどうかを判別します。 ファイルの修正時刻がこれらの数と一致するとき、 無修正という印をつけます。

(nil property value beg . end)

この種の要素はテキストの属性が変更されたことを示します。 これを取り消す方法は以下のとおりです。

 
(put-text-property beg end property value)
position

この要素は、前にポイントがどこにあったかを示します。 この要素の取り消しでポイントをpositionにします。 通常、消去で再挿入の要素といっしょにこの要素が作られます。

nil

この要素は境界です。 二つの境界にはさまれた要素を変更群(change group)といいます。 普通、各変更群は一つのキーボード・コマンドに対応します。 取り消しのコマンドは普通群全体を一つの単位として取り消します。

Function: undo-boundary

この関数は、境界の要素をundoリストに入れます。 取り消しのコマンドはこのような境界で止まり、 連続した取り消しのコマンドはどんどん前の境界へ取り消していきます。 この関数は、nilを返します。

エディタのコマンド・ループは、 キー・シーケンスの実行前に自動的に取り消しの境界をつくります。 したがって各取り消しは通常一つのコマンドの効果を取り消します。 自己挿入文字の入力は例外です。 コマンド・ループはそのような最初の文字で境界を作り、 以降連続する19個の自己挿入文字の入力では境界を作りません。 20個目で作り、自己挿入文字が続く間同様に繰り返します。

直前の取り消し可能な変更が別なバッファでなされた場合にはいつも、 すべてのバッファ修正で境界ができます。 こうして、複数のバッファを修正するコマンドは、 変更した各バッファに境界をつくります。

この関数を陽に呼ぶことは、コマンドの効果を複数の単位にわけるとき便利です。 たとえば、query-replaceは、 各置換の後でundo-boundaryを呼び出すので、 ユーザがそれぞれ一つずつの取り消しを行なうことができます。

Function: primitive-undo count list

これは、undoリストの要素で取り消すための基本的な関数です。 listの最初からcount個の要素で取り消しをします。 listの残りを返します。 Lispでこの関数を書くことも可能ですが、 Cにしておくと便利です。

primitive-undoはバッファを変更したら、 バッファのundoリストに要素を追加してしまいます。 取り消しのコマンドは、 一連の取り消し操作のはじめでundoリストの値を保存し、 混乱を防いでいます。 その後の取り消しの操作では、保管した値を使い、これを更新します。 取り消しで追加された新しい要素はこの保管した方の値に追加されませんから、 続けて取り消しを行なっても影響はありません。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

29.10 undoリストの保守

この節では、 与えられたバッファの取り消し情報を禁止したり、 それを解除したりする方法を述べます。 また、undoリストが大きくなりすぎないように、 自動的に切り詰める方法についても説明します。

新規に生成したバッファの取り消し情報の記録は普通、 最初から有効です。 しかし、名前がスペース文字で始まるバッファははじめ、 取り消しの記録を禁止してあります。 以下の二つのコマンドを使ったり、 自分でbuffer-undo-listを設定したりして、 陽に取り消しの記録を禁止したり、解除したりすることができます。

Command: buffer-enable-undo &optional buffer-or-name

このコマンドは、 以降の変更が取り消せるように、 バッファbuffer-or-nameにたいする取り消し情報を保持していくようにします。 引数が与えられない場合、カレント・バッファが対象です。 バッファがすでに取り消し情報を保持している場合、何も変更しません。 nilを返します。

対話的に呼ばれた場合、buffer-or-nameはカレント・バッファになります。 ほかのバッファは指定できません。

Function: buffer-disable-undo &optional buffer
Function: buffer-flush-undo &optional buffer

この関数は、 バッファbufferのundoリストを捨て、 取り消し情報の記録を禁止します。 その結果として、以前や以後の変更の取り消しが不可能になります。 bufferがundoリストを保持しないようにしてある場合、 当関数は効果がありません。

nilを返します。対話的に呼ぶことはできません。

名前のbuffer-flush-undoはまだobsoleteではありませんが、 Emacsバージョン19では、 新しく推奨する名前buffer-disable-undoがあります。

編集を続けると、undoリストはどんどん長くなります。 有効なメモリ空間を使い果たすのを防ぐため、 塵集めの際に、設定のできるある大きさの上限まで切り詰めます (この目的のため、undoリストの「大きさ」を、 リストを作っているコンス・セルと消去したテキストの文字列を合せて測ります)。 二つの変数undo-limitundo-strong-limitで、 許容できる大きさの範囲を制御します。

Variable: undo-limit

これはundoリストとして許容できる弱い上限です。 この大きさを越える変更群は最後のものを保存します。

Variable: undo-strong-limit

これはundoリストとして許容できる上限です。 この大きさを越える変更群は、 (それ以前のすべての変更群といっしょに)すべて捨てられてしまいます。 一つだけ例外があります。 一番最後の変更群はどんなに大きくても保存されます。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

29.11 行詰め

行詰め(filling)とは、(行の変わるところを動かし)行の長さを調節し、 指定した最大幅(でもそれを越えない)くらいにすることです。 そして行を揃える(justified)、つまり、 スペースを挿入し右や左のマージンがちょうど並ぶようにすることもできます。 この幅は変数fill-columnで制御します。 読みやすさのために、行は70桁くらいよりは長くないのがよいでしょう。

Auto Fillモード(see section 自動的行詰め)を使い、 既存のテキストの変更では適切な行詰めをしないまま、 テキストを入力したときは自動的にテキストの行詰めをすることができます。 この場合、後で陽に既存のテキストの行詰めを行なわなければなりません。

この節のほとんどのコマンドは、意味のない値を返します。 行詰めを行なうすべての関数は、現在の左マージン、現在の右マージン、 現在の揃え方のスタイルの影響を受けます(see section 行詰めのマージン)。 現在の揃え方のスタイルがnoneのとき、 行詰めの関数は何もしません。

行詰め関数のうちのいくつかにはjustify引数があります。 もしこれが非nilならば、何らかの揃え方を要求していることになります。 とりうるのはleft(左揃え)、right(右揃え)、 full(両揃え)、center(中揃え)で、 それぞれ指定した揃え方のスタイルになります。 もしこれがtの場合は、 テキストのその部分で現在の揃え方のスタイルを用いることを意味します (以下のcurrent-justificationを参照)。

行詰めの関数を対話的に呼び出すとき、 前置引数を使ってjustifyを値fullにすることができます。

Command: fill-paragraph justify

このコマンドは、 ポイントのあるまたはポイントの後の段落の行詰めを行ないます。 もしjustifyが非nilなら、 各行の右揃えも行ないます。 段落の境を見つけるのには、 通常の段落移動コマンドを使います。See (emacs)Paragraphs section `Paragraphs' in The Emacs Manual

Command: fill-region start end &optional justify

このコマンドはstartからendまでのリージョンにある段落の、 行詰めを行ないます。 justifyが非nilなら右揃えも行ないます。

変数paragraph-separateは、 段落と段落をどうわけるかを制御します。See section 編集用の標準正規表現

Command: fill-individual-paragraphs start end &optional justify mail-flag

このコマンドは、個別の行詰め接頭辞を使って、 リージョン内の段落の行詰めをします。 したがって、段落の行がスペースで字下げしてあるとき、 行詰めを行なった段落は同じように字下げをしたままになります。

最初の二つの引数startendは、 行詰めを行なうリージョンの始めと終りです。 3番目と4番目の引数justifymail-flagは、 省略可能です。 もしjustifyが非nilなら、 行詰めと同時に右揃えも行ないます。 もしmail-flagが非nilなら、 この関数が扱っているのはメールのメッセージと仮定して、 ヘッダーの行詰めを行ないません。

通常、fill-individual-paragraphsは、 字下げの変化を新しい段落の始まりとみなします。 もしfill-individual-varying-indentが非nilなら、 分割行だけが段落を分割します。 このとき、字下げをしてある段落で、 最初の行にさらに字下げのしてあるものを処理することができます。

User Option: fill-individual-varying-indent

この変数は、上で述べたように、 fill-individual-paragraphsの動作を変えます。

Command: fill-region-as-paragraph start end &optional justify

このコマンドは、 リージョンのテキストを一つの段落として行詰めを行ないます。 リージョンにいくつも段落があるときは、 段落の間の空行はなくなります。 justifyが非nilのとき、 この関数は、行詰めと同時に右揃えを行ないます。

対話的に呼び出したとき、 前置引数で右揃えを行ないます。

デフォルトで有効になっているAdaptive Fillモードでは、 行詰め接頭辞のないときに、 字下げをした段落でのfill-region-as-paragraphを実行すると、 段落の2行目の字下げを行詰め接頭辞にします。

Command: justify-current-line how eop nosqueeze

このコマンドは現在の行の語間にスペースを挿入し、 行末がちょうどfill-columnで終わるようにします。 nilを返します。

もし引数howが非nilのとき、 揃え方のスタイルを陽に指定します。 とりうるのはleftrightfullcenternoneです。 これがもしtなら指定した揃え方のスタイルにしたがいます (以下のcurrent-justificationを参照)。 nilは両揃えという意味になります。

もしeopが非nilならば、 current-justificationが両揃えを指定しているとき、 左揃えを行なうことを意味します。 これは段落の最後の行に使用します。 段落全体が両揃えであっても最後の行はそう揃えるべきではありません。

nosqueezeが非nilのときは、 中間の空白をいじらようにします。

User Option: default-justification

この変数の値は、 テキストを揃えるときのスタイルがテキスト属性で指定されていないときの スタイルを指定します。 とりうる値はleftrightfullcenternoneです。 デフォルト値はleftです。

Function: current-justification

この関数は、 ポイントのまわりのテキストの行詰めを行なうときの、 適正な揃えのスタイルを返します。

Variable: fill-paragraph-function

この変数は、 主モードにたいして段落の行詰めを行なう際の別法を与えます。 もし値が非nilのとき、 fill-paragraphはこの関数に実際の処理をさせます。 この関数が非nilの値を返したとき、 fill-paragraphは処理が終了したとみなし、 ただちにその値を返します。

この機能の通常の利用法は、 プログラミング言語のモードでコメントの行詰めを行なうことです。 通常どおりに段落の行詰めをしなければならないときは、 以下のようになります。

 
(let ((fill-paragraph-function nil))
  (fill-paragraph arg))
Variable: use-hard-newlines

この変数が非nilのとき、 行詰め関数はhardテキスト属性のある改行を消去しません。 「強い改行」は段落のセパレータとして作用します。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

29.12 行詰めのマージン

User Option: fill-prefix

この変数は、通常のテキストの始めにきて、 行詰めを行なうときには無視されるテキスト文字列です。 行詰め接頭辞で始まっていないすべての行は、 段落の始まりとみなされます。 行詰め接頭辞の後に空白のくる行もそうなります。 行詰め接頭辞で始まり、次に空白のこない行は、 行詰めを施される通常の行です。 行詰めを行なった行は行詰め接頭辞で始めます。

左マージンがあるときは、空白の後に行詰め接頭辞がきます。

User Option: fill-column

このバッファローカル変数は、行詰めをしたときの最大幅を指定します。 これは、桁の数として解釈される整数でなくてはいけません。 Auto Fillモード(see section 自動的行詰め)の場合を含め、 すべての行詰め、右揃え、中寄せのコマンドは、この変数の影響を受けます。

他人に読んでもらうために実際にテキストを書いているとき、 fill-columnを70以上に設定するべきではないでしょう。 さもないと長すぎて他人に心地好く読んでもらえませんし、 テキストが不格好です。

Variable: default-fill-column

この変数の値は、 fill-columnの値を個別に設定していないバッファでのデフォルト値です。 これは(default-value 'fill-column)と同じです。

default-fill-columnのデフォルト値は、70です。

Command: set-left-margin from to margin

これは、 fromからtoまでのテキストのleft-margin属性を marginの値に設定します。 もしAuto Fillモードが有効ならば、 このコマンドは、 リージョンが新しいマージンにあうよう行詰めをやり直します。

Command: set-right-margin from to margin

これは、 fromからtoまでのテキストのright-margin属性を marginの値に設定します。 もしAuto Fillモードが有効ならば、 このコマンドは、 リージョンが新しいマージンにあうよう行詰めをやり直します。

Function: current-left-margin

この関数は、 ポイントのまわりで行詰めを行なうときに使用する適正な行詰め桁の値を返します。 値は現在の行の先頭文字のleft-margin属性(なければ0)と、 変数left-marginの値の和です。

Function: current-fill-column

この関数は、 ポイントのまわりで行詰めを行なうときに使用する適正な行詰め桁の値を返します。 値はfill-column変数の値から、 ポイントの後ろのright-margin属性の値を引いたものです。

Command: move-to-left-margin &optional n force

この関数は、 現在の行の左マージンまでポイントを動かします。 動かす桁は関数current-left-marginを呼び出して決定します。 もし引数nが非nilならば、 move-to-left-marginは、 最初n-1行順方向に移動します。

もしforceが非nilならば、 左マージンの値と一致しない場合、 行の字下げを修正することを意味します。

Function: delete-to-left-margin from to

この関数は、 fromからtoまでのテキストの左マージンの字下げを消去します。 消去する字下げの数はcurrent-left-marginを呼び出して決定します。 この関数が空白でないものを消去することはありません。

Function: indent-to-left-margin

これはFundamentalモード、 Textモードなどにおいて用いられるデフォルトのindent-line-functionです。 現在の行の行頭で、 字下げが変数left-marginで指定した値になるよう調節します。 それには空白を挿入したり、消去したりします。

Variable: left-margin

この変数は、基本の左マージン桁を指定します。 FundamentalモードでLFDは、この桁まで字下げを行ないます。 この変数は、どのような方法で設定しても、バッファローカルになります。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

29.13 自動的行詰め

Auto Fillモードは、 テキストが入力されたとき自動的に行の行詰めを行なう副モードです。 この節ではAuto Fillが使うフックについて述べます。 既存のテキストの行詰めと右揃えを陽に行なう関数の説明は、行詰めを参照してください。

Auto Fillモードは、 テキストの一部の行詰めを行なうときの、 マージンや右揃えのスタイルを変更する関数を、 有効にするようにもします。See section 行詰めのマージン

Variable: auto-fill-function

この変数の値は、 スペースや改行を自己挿入した後に呼び出される、 (引数をもたない)関数でなくてはいけません。 これはnilであってもかまいません。この場合何も行ないません。

Auto Fillモードのとき、 auto-fill-functionの値はdo-auto-fillです。 これは行を分割する通常処理の実装が目的の関数です。

昔のバージョンのEmacsでは、 この変数をauto-fill-hookと呼んでいましたが、 フックを呼ぶ際の標準的な方法で呼ばれないため、 バージョン19では名前がauto-fill-functionに変更されました。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

29.14 整列

この節で述べる整列の関数はみな、 バッファのテキストを並べ換えるものです。 この点で、 リストの要素の順序を並べ換える関数sortと対照的です(see section リストを再構成する関数)。 これらの関数は特に意味のない値を返します。

Function: sort-subr reverse nextrecfun endrecfun &optional startkeyfun endkeyfun

この関数は、バッファをレコードに分割してそれの整列を行なう、 一般的なテキストの整列ルーチンです。 この節のほとんどのコマンドは、この関数を呼び出します。

sort-subrの働きを理解するために、 バッファのアクセス可能部を、 整列レコード(sort record)という互いに素な部分に分割して考えます。 ここで、 レコードは連続しているかもしれないしそうでないかもしれませんが、 重なってはいません。 各整列レコードのある部分(または全部)は、 整列キーとして指示されます。 整列では、この整列キーの順序にしたがってレコードを並べ換えます。

普通、レコードは整列キーの昇順に並べ換えられます。 sort-subr関数の第1引数reverseが非nilなら、 整列レコードは整列キーの逆順で並べ換えられます。

sort-subrへの次の四つの引数は、 整列レコードをとばしてポイントを動かすのに呼び出す関数です。 これはsort-subrから何回も何回も呼び出されます。

  1. nextrecfunは、ポイントをレコードの終りにして呼び出されます。 この関数は、次のレコードの始めにポイントを動かします。 最初のレコードは、 sort-subrが呼ばれたときのポイントの位置から始まる、 と仮定します。 したがって、 普通sort-subrを呼ぶ前には、 ポイントをバッファの先頭に動かしておくべきでしょう。

    整列レコードがもうない場合、 この関数は、ポイントをバッファの最後に動かします。

  2. endrecfunは、ポイントをレコードの中に置いて呼び出されます。 これはレコードの終りにポイントを動かします。
  3. startkeyfunは、 ポイントをレコードの始めから整列キーの始めに動かすときに呼び出されます。 この引数は省略可能です。 省いたときには、レコード全体を整列キーにします。 与えた場合、関数は整列キーとして使われる非nilの値を返すか、 整列キーがバッファのポイントで始まることを示すために、 nilを返すかしなければなりません。 後者のとき、 整列キーの最後を見つけるためendkeyfunが呼び出されます。
  4. endkeyfunは、 ポイントを整列キーの最初から整列キーの最後へ動かすのに呼び出されます。 この引数は省略可能です。 startkeyfunnilを返し、 この引数が略された(またはnilだった)場合、 レコードの最後までを整列キーとします。 startkeyfunが非nilの値を返したとき、 endkeyfunは不要です。

sort-subrの例として、 sort-linesの関数の完全な定義を次に示します。

 
;; 説明文字列の最初の2行は、
;; ユーザから見たとき本当は1行です。
(defun sort-lines (reverse beg end)
  "リージョン中の行を英文字順に整列する。
プログラムから呼び出したとき、引数を三つとります。
REVERSE (非nilは逆順),
とBEGとEND(整列するリージョン)。"
  (interactive "P\nr")
  (save-restriction
    (narrow-to-region beg end)
    (goto-char (point-min))
    (sort-subr reverse
               'forward-line
               'end-of-line)))

ここでforward-lineは、ポイントを次のレコードの始めに動かし、 end-of-lineはレコードの終りに動かします。 レコード全体が整列キーですから、 引数startkeyfunendkeyfunを与えません。

sort-paragraphs関数も同様ですが、 sort-subrの呼出しは以下のようになります。

 
(sort-subr reverse
           (function 
            (lambda () 
              (skip-chars-forward "\n \t\f")))
           'forward-paragraph)
Command: sort-regexp-fields reverse record-regexp key-regexp start end

この関数は、 record-regexpkey-regexpで指定されたとおりに、 startendの間のリージョンを、 英文字順に整列します。 reverseが負の整数の場合、整列は逆順に行ないます。

英文字順の整列とは、二つの整列キーの最初の文字を比較し、 そして次の文字を比較し、以下同様に続けていくことです。 最初に不一致のあった場所で小さい文字の方が小さい整列キーとなります。 個々の文字は数値で比較されます。EmacsはASCII文字集合を使いますから、 この集合内の順序が英文字順を決定します。

record-regexp引数は、 バッファを整列レコードに分割する方法を指定します。 各レコードの終りからこの正規表現で検索を行ない、 それと一致したのが次のレコードになります。 たとえば、正規表現が`^.+$'の場合、 改行以外の文字が少なくとも一つある行と一致するので、 このような行を整列レコードにすることになります。 正規表現の構文と意味についてはSee section 正規表現

key-regexp引数の値は、 各レコードの中のどの部分を整列キーにするかを指定します。 key-regexpはレコード全体に照合させても、一部分だけでもかまいません。 後者の場合、残りの部分はレコードの整列順に関係ありませんが、 レコードが新しい場所に移動するときはいっしょになります。

key-regexp引数は、 record-regexpの部分式と一致するテキストも参照できますし、 独自の正規表現を指定することもできます。

もしkey-regexp

`\digit'

の場合、 record-regexpdigit番目の`\(...\)'括弧でくくったグループに、 一致するテキストが、整列キーになります。

`\&'

の場合、レコード全部が整列キーになります。

正規表現

の場合、sort-regexp-fieldsはレコード中からこの正規表現の一致を 検索します。見つかればそれが整列キーになります。 あるレコード中でkey-regexpに一致するものが見つからない場合、 そのレコードは無視、つまり、 バッファ内の位置は変わりません(まわりにあるほかのレコードは動きます)。

たとえば、 リージョン中の各行を文字`f'で始まる最初の語で整列するためには、 record-regexp`^.*$'に、 key-regexp`\<f\w*\>'とします。 したがって最終的な式は以下のようになります。

 
(sort-regexp-fields nil "^.*$" "\\<f\\w*\\>"
                    (region-beginning)
                    (region-end))

sort-regexp-fieldsを対話的に呼んだ場合、 record-regexpkey-regexpをミニバッファから求めるために、 プロンプトを出します。

Command: sort-lines reverse start end

このコマンドは、 startendの間のリージョンにある行を、 英文字順に整列します。 reverseが非nilの場合、整列は逆順に行ないます。

Command: sort-paragraphs reverse start end

このコマンドは、 startendの間のリージョンにある段落を、 英文字順に整列します。 reverseが非nilの場合、整列は逆順に行ないます。

Command: sort-pages reverse start end

このコマンドは、 startendの間のリージョンにあるページを、 英文字順に整列します。 reverseが非nilの場合、整列は逆順に行ないます。

Command: sort-fields field start end

このコマンドは、 startendの間のリージョンにある行を、 各行のfield番目をフィールドを英文字順に比較して、 整列します。 フィールドは空白で区切られ、1から数えます。 fieldが負の整数の場合、 行の終りから-field番目のフィールドで整列します。 このコマンドは、表の整列に便利です。

Command: sort-numeric-fields field start end

このコマンドは、 startendの間のリージョンにある行の field番目のフィールドを数値で比較して、 整列を行ないます。 リージョンの各行の指定されたフィールドは数を含んでいなければなりません。 フィールドは空白で区切られ、1から数えます。 fieldが負の場合、 行の終りから-field番目のフィールドで整列します。 このコマンドは、表の整列に便利です。

Command: sort-columns reverse &optional beg end

このコマンドは、 ある範囲の桁を英文字順で比較しながら、 begendの間のリージョンにある行の整列を行ないます。 begendの桁位置がそのまま整列範囲の桁になります。

reverseが非nilの場合、整列は逆順に行ないます。

このコマンドがほかと一つ違うのは、 begのある行全体とendのある行全体が、 整列するリージョンになるということです。

sort-columnssortユーティリティー・プログラムを使うので、 タブ文字を含むテキストではうまくいきません。 整列を行なう前にM-x untabifyを使って、 タブをスペースに変換してください。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

29.15 桁を数える

桁の関数は、文字の位置(バッファの先頭から文字を数える)と、 桁の位置(行頭から画面上の文字を数える)との変換を行ないます。

文字は画面上で占める桁の数にしたがって数えます。 つまり制御文字は、ctl-arrowの値によって2あるいは4桁を占め、 タブはtab-widthの値とタブの始まる桁によって 占める桁の数を数えます。See section 普通の表示方法

桁数の計算ではウィンドウの幅と水平スクロールは無視します。 したがって、桁数はいくらでも大きくなり得ます。 最初(一番左)の桁は0です。

Function: current-column

この関数は、ポイントの水平方向位置を返します。 桁で数えて、行の先頭を0桁とします。 桁の位置は、 現在の行の先頭とポイントとの間の文字の、 すべての表示された表現の幅を足し合わせて得られる値です。

current-columnの使用例については、テキスト行単位での移動count-linesの解説をご覧ください。

Function: move-to-column column &optional force

この関数は、現在の行のcolumnにポイントを動かします。 columnの計算は、 現在の行の先頭とポイントとの間の文字の、 すべての表示された表現の幅を足し合わせて得られる値です。

もし桁columnが行末を越えてしまう場合、 ポイントを行の終りに位置づけます。 もしcolumnが負のときは、ポイントを行の先頭に位置づけます。

もしタブのように複数桁を占める文字の中に入ってしまい、 桁columnへ動かすことができないとき、 ポイントをその文字の終りに動かします。 しかし、forceが非nilcolumnがタブの中にあるなら、 move-to-columnはタブをスペースに変えて、 ちょうどそのcolumnに動かすことができます。 複数桁を占めるほかの文字はわけるわけにいきませんから、 forceを指定しても変なことになってしまいます。

引数forceは、 行が桁columnより短いときにも効力があります。 この場合、行末の空白の追加を行ない桁を伸ばします。

columnが整数でないと、エラーを通知します。

返却値は、実際に移動した桁数です。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

29.16 字下げ

字下げの関数は行頭の空白を調べたり、 そこへ動いたり、変更したりするのに使います。 関数によっては、行の中にある空白ならどこでも変更できます。 桁と字下げは左端より0から数えます。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

29.16.1 字下げのプリミティブ

この節では、 字下げを数えたり挿入したりするのに使うプリミティブ関数について述べます。 次の節の関数は、これらのプリミティブを使っています。

Function: current-indentation

この関数は、 現在の行の字下げを返します。 これは空白でない最初の文字の、水平方向の位置です。 空白文字だけの場合、行末の水平位置を返します。

Command: indent-to column &optional minimum

この関数は、 ポイントからcolumnに達するまで、タブとスペースで字下げします。 非nilminimumが指定されると、 columnを越える場合も最低minimumだけスペースを開けます。 そうでないとき、ポイントがすでにcolumnの先にあるなら、 この関数は、何もしません。 値は、挿入した字下げの終わる桁です。

挿入する空白文字は、 まわりのテキスト(通常は先行するテキストだけ) からテキスト属性を継承します。See section テキスト属性の粘着性

User Option: indent-tabs-mode

nilの場合、字下げはタブを挿入してもよいことになります。 そうでない場合、スペースだけ挿入します。 この変数が設定されると自動的に、カレント・バッファにたいしローカルになります。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

29.16.2 主モードで制御される字下げ

各主モードの重要な機能は、 編集している言語にあわせて正しく字下げをするように TABキーをカスタマイズすることです。 この節ではTABキーのしくみとその制御方法について述べます。 この節の関数は、予期せぬ値を返します。

Variable: indent-line-function

この変数の値は、TABが (そして、いろいろな関数が)現在の行の字下げを行なうのに使う関数です。 indent-according-to-modeは、この関数を呼び出すだけです。

Lispモードでの値はシンボルlisp-indent-lineです。 Cモードではc-indent-line、 Fortranモードではfortran-indent-lineです。 FundamentalモードやTextモード、 そして標準的な字下げのないほかの多くのモードでの値は、 デフォルト値のindent-to-left-marginです。

Command: indent-according-to-mode

このコマンドは、 現在の主モードにおける適切な方法で 現在の行の字下げを行なうindent-line-functionの関数を、 呼び出します。

Command: indent-for-tab-command

このコマンドは、 indent-line-functionの関数で現在の行の字下げを行ないます。 ただし、その関数がindent-to-left-marginだった場合、 代わりにinsert-tabを呼び出します (これはタブ文字を挿入する簡単なコマンドです)。

Command: newline-and-indent

この関数は、改行を挿入し、 主モードにしたがって(今、挿入したばかりの改行の次にある) 新しい行の字下げを行ないます。

字下げは現在のindent-line-functionを用いて行ないます。 プログラミング言語モードでは、これはTABと同じになります。 いくつかのTextモードではTABはタブを挿入しますが、 newline-and-indentは、 left-marginで指定した桁に字下げします。

Command: reindent-then-newline-and-indent

この関数は、現在の行の再字下げを行ない、改行を挿入し、 (今、挿入したばかりの改行の次にある) 新しい行の字下げを行ないます。

このコマンドは、 indent-line-functionの現在の値を呼び出し、 現在の主モードにしたがって両方の行の字下げを行ないます。 プログラミング言語モードでは、これはTABと同じです。 いくつかのTextモードではTABはタブを挿入しますが、 reindent-then-newline-and-indentは、 left-marginで指定された桁に字下げします。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

29.16.3 リージョン全体の字下げ

この節では、リージョンの各行の字下げを行なうコマンドについて述べます。 これらは予期せぬ値を返します。

Command: indent-region start end to-column

このコマンドは、 start(を含む行)からend(は含まない)までにある、 空白行以外の各行を字下げします。 もしto-columnnilならindent-regionは、 現在のモードの字下げの関数、 つまりindent-line-functionの値を呼び出して各行を字下げします。

もしto-columnが非nilなら、 これは字下げを行なう桁の数を指定する整数でなければなりません。 各行の空白を入れたり消したりしてちょうどこの桁になるように字下げします。

もし行詰め接頭辞があるとき、 indent-regionは各行が行詰め接頭辞で始まるようにして、 字下げを行ないます。

Variable: indent-region-function

この変数の値は、 indent-regionが処理速度を上げるために(as a short cut) 使う関数です。 (訳注: 処理にかかる時間の)速さをのぞいて、 リージョン中の各行が1行1行字下げするのと同じ結果になるよう、 この関数を設計しなければなりません。

これがnilであるときshort cutはなく、 indent-regionが各行にたいし実際に処理することになります。

short-cut関数は、 CモードやLispモードのように、 indent-line-functionが、 関数定義の始まりをスキャンしなければならないときに、 役に立ちます。 各行にこれを適用すると、処理時間は自乗に比例して増大するようになります。 short cutは行の字下げを行ないながらスキャン情報を更新できるので、 処理時間は線形に増大するようになります。 行を個別に字下げする方が速くなるようなモードでは、 short cutの必要はありません。

indent-regionに非nilの引数to-columnを与えたときは、 別の意味になるので、 この変数は、使いません。

Command: indent-rigidly start end count

このコマンドは、 start(を含む行)からend(は含まない)までにある、 すべての行をcount桁だけ横に字下げします。 これは、 影響するリージョンを一つのきっちりした単位として動かし、 「形を保存」します。

たとえば、 countが3なら、このコマンドは、 指定されたリージョンの始めの行から、3桁分の字下げを加えます。

Mailモードで、C-c C-y (mail-yank-original)は、 indent-rigidlyを使い、 返信するメッセージのテキストのコピーの字下げを行ないます。

Function: indent-code-rigidly start end columns &optional nochange-regexp

これはindent-rigidlyに似ていますが、 文字列やコメントの行には変更をしません。

また、nochange-regexpが行頭と一致する場合も、 行の変更をしません (もしnochange-regexpが非nilなら)。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

29.16.4 前の行からの相対的な字下げ

この節では、 前の行の内容を基に現在の行の字下げを行なう二つのコマンドについて述べます。

Command: indent-relative &optional unindented-ok

前にある空白でない行における次の 字下げ点(indent point)まで空白を開けます。 字下げ点とは空白に続く空白以外の文字です。 次の字下げ点とは、現在のポイントの桁より大きい桁で最初のものです。 たとえば、ポイントがテキスト行の最初の空白でない文字の左にあるとき、 空白を挿入してその桁に移動します。

前にある空白でない行が、次の字下げ点をもたない (つまり十分大きい桁位置のない)場合、 indent-relativeは何もしない (unindented-okが非nilのとき)かあるいは、 かわりにtab-to-tab-stopを行ないます。 したがってポイントが短いテキスト行の最後の桁よりも右下にあるとき、 このコマンドは、空白を挿入して次のタブ・ストップへ移動します。

indent-relativeは予期せぬ値を返します。

次の例において、ポイントは2行目の先頭にあります。

 
            This line is indented twelve spaces.
∗The quick brown fox jumped.

(indent-relative nil)を評価するとこうなります。

 
            This line is indented twelve spaces.
            ∗The quick brown fox jumped.

この例では、 ポイントが`jumped'`m'`p'の間にあります。

 
            This line is indented twelve spaces.
The quick brown fox jum∗ped.

(indent-relative nil)を評価するとこうなります。

 
            This line is indented twelve spaces.
The quick brown fox jum  ∗ped.
Command: indent-relative-maybe

このコマンドは、 前にある空白でない行と同じように現在の行を字下げします。 unindented-ok引数をtにして、 indent-relativeを呼び出します。 これは予期せぬ値を返します。

もし前の空白行でない行が、現在の桁の先に字下げ点をもたないとき、 このコマンドは何もしません。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

29.16.5 調節可能な「タブ・ストップ」

この節ではユーザが指定する「タブ・ストップ」のしくみと、 これを使ったり、設定したりするしくみについて説明します。 「タブ・ストップ」という言葉は、タイプライターのタブ・ストップの機能と、 この機能が似ているためにつきました。 この機能は次のタブ・ストップ桁になるまで、 適当な数のスペース文字やタブ文字を挿入して実現しています。 バッファの中のタブ文字の表示には影響しません (see section 普通の表示方法)。 入力としてのTAB文字は、 Textモードのような一部の主モードでだけ、 このタブ・ストップの機能を使います。

Command: tab-to-tab-stop

このコマンドは、 tab-stop-listで定義された、 次のタブ・ストップの桁までスペースかタブを挿入します。 現在の桁数よりも大きな要素をリストから検索し、 その要素がしめす桁まで字下げします。 このような要素がみつからなかったときは、何もしません。

User Option: tab-stop-list

この変数は、 tab-to-tab-stopsで用いられるタブ・ストップの桁のリストです。 要素は昇順の整数でなければなりません。 タブ・ストップの桁が等間隔である必要は、ありません。

タブ・ストップの位置を対話的に編集するにはM-x edit-tab-stopsを用います。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

29.16.6 字下げベースの移動コマンド

以下のコマンドはテキストの字下げをもとに動作するもので、 主に対話的に用います。

Command: back-to-indentation

このコマンドは、 ポイントを現在の行(ポイントの位置する行)の最初の空白でない文字に動かします。 これはnilを返します。

Command: backward-to-indentation arg

ポイントをarg行逆方向に動かし、 その行の最初の空白でない文字に動かします。 これはnilを返します。

Command: forward-to-indentation arg

arg行先に動かし、その行の最初の空白でない文字に位置づけます。 この関数は、nilを返します。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

29.17 大文字/小文字の変換

ここで述べる大文字と小文字の変換を行なう関数は、 カレント・バッファのテキストに作用します。 文字列や文字に作用する変換コマンドについては、See section 大文字・小文字変換。 どの文字が大文字か、小文字か、 またそれらの変換をカスタマイズする方法についてはSee section 大文字小文字変換のカスタマイズ

Command: capitalize-region start end

この関数は、 startendで定義されるリージョン内のすべての語を、 大文字で始めます。 大文字で始めるとは、各語の最初の文字を大文字に、 残りの文字を小文字にすることを意味します。nilを返します。

リージョンの一端が語の中間にあるとき、 リージョンの内にある語の一部を語全体とみなします。

capitalize-regionが対話的に呼ばれた場合、 マークとポイントのうち小さい方からstartendになります。

 
---------- Buffer: foo ----------
This is the contents of the 5th foo.
---------- Buffer: foo ----------

(capitalize-region 1 44)
⇒ nil

---------- Buffer: foo ----------
This Is The Contents Of The 5th Foo.
---------- Buffer: foo ----------
Command: downcase-region start end

この関数は、 startendで定義されるリージョン中のすべての語を小文字にします。 nilを返します。

downcase-regionが対話的に呼ばれた場合、 startendは小さい方を先にしてマークとポイントになります。

Command: upcase-region start end

この関数は、 startendで定義されるリージョン中のすべての語を大文字にします。 nilを返します。

upcase-regionが対話的に呼ばれた場合、 startendは小さい方を先にしてマークとポイントになります。

Command: capitalize-word count

この関数は、 ポイントの後のcount語を、 ポイントを動かしながら 大文字で始めます。 大文字で始めるとは、各語の最初の文字を大文字に、 残りの文字を小文字にすることを意味します。 countが負の場合、 これは前の-count語を 大文字で始めますが、 ポイントは動かしません。 値はnilです。

もしポイントが語の中間にあるなら、 前に進む場合、ポイントの前の語の部分は無視します。 残りは語全体として扱います。

capitalize-wordが対話的に呼ばれた場合、 countは数値前置引数に設定されます。

Command: downcase-word count

この関数は、ポイントの後のcount語をポイントを動かしながら、 すべて小文字に変換します。 countが負の場合、 これは前の-count語を変換しますが、ポイントは動かしません。 値はnilです。

downcase-wordが対話的に呼ばれた場合、 countは数値前置引数に設定されます。

Command: upcase-word count

この関数は、ポイントの後のcount語をポイントを動かしながら、 すべて大文字に変換します。 countが負の場合、これは前の-count語を変換しますが、 ポイントは動かしません。 値はnilです。

upcase-wordが対話的に呼ばれた場合、 countは数値前置引数に設定されます。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

29.18 テキスト属性

バッファや文字列に位置する各文字は、 シンボルの属性リスト(see section 属性リスト)のような、 テキスト属性リスト(text property list)をもたせることができます。 属性は特定の場所にある特定の文字に、 たとえば、(英語の原文の)この文章の先頭にある文字`T'や、 `foo'の中の最初の`o'に、 属します。 違う場所に同じ文字がある場合、一般には異なる属性をもっています。

各属性には名前と値があります。 両方とも任意のLispオブジェクトでかまいませんが、 通常名前はシンボルです。 属性リストへの普通のアクセス方法は、 名前を指定しそれに対応する値を調べることです。

もし文字がcategoryという属性をもつとき、 これを文字の範疇(category)といいます。 これはシンボルでなければなりません。 シンボルの属性が文字の属性のデフォルト値となります。

文字列とバッファの間でテキストを複写しても、 文字の属性は保存されます。 これはsubstringinsertbuffer-substringのようにテキストの一部分を取り扱う関数 (diverse functions)を含みます。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

29.18.1 テキスト属性の調査

テキスト属性を調べるもっとも単純な方法は、 特定の文字の特定の属性の値を見ることです。 これにはget-text-propertyを使います。 文字の全属性リストを得るにはtext-properties-atを使います。 一度にいくつもの文字の属性を調べる関数についてはSee section 属性検索関数

これらの関数は文字列とバッファの両方を扱います。 文字列の位置は0から始まるのにたいして、 バッファは1から始まることに気をつけてください。

Function: get-text-property pos prop &optional object

この関数は、object(バッファあるいは文字列)の位置posの 後の文字のprop属性の値を返します。 引数objectは省略可能で、デフォルト値はカレント・バッファです。

もしprop属性がまったくなく、 文字がシンボルの範疇をもつとき、 get-text-propertyはシンボルのprop属性を返します。

Function: get-char-property pos prop &optional object

この関数は、get-text-propertyに似ていますが、 最初にオーバレイを調べてからテキスト属性を調べます。See section オーバレイ

引数のobjectは文字列、バッファ、もしくはウィンドウです。 もしウィンドウならば、 ウィンドウが表示しているバッファのテキスト属性とオーバレイを使います。 もしobjectがバッファなら、 テキスト属性と同様にそのバッファの全オーバレイが対象になります。 文字列にはオーバレイがないので、 もしobjectが文字列ならテキスト属性だけが対象です。

Function: text-properties-at position &optional object

この関数は、 文字列やバッファのobjectの中のpositionにある文字について、 すべての属性リストを返します。 もしobjectnilなら、 カレント・バッファが対象です。

Variable: default-text-properties

この変数は、テキスト属性のデフォルト値を与える属性リストを保持しています。 文字がある属性の値を直接にも範疇シンボルにも指定していないときは、 いつもこのリストに格納した値を代用します。

 
(setq default-text-properties '(foo 69))
;; 文字位置1には独自の属性のないようにする。
(set-text-properties 1 2 nil)
;; 得たものは聞いた時点でのデフォルト値。
(get-text-property 1 'foo)
     ⇒ 69

[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

29.18.2 テキスト属性の変更

属性を変更するプリミティブは、 指定したテキストの範囲に適用します。 関数set-text-properties(この節の最後を参照)は、 範囲内のテキストの全属性リストを設定します。 普段は、 名前で指定したある特定の属性だけの追加、変更、消去が役に立ちます。

テキスト属性はバッファの内容の一部なので、 画面でのバッファの見え方に影響し、 テキスト属性の変更はバッファの修正とみなされます。 バッファのテキスト属性の変更は取り消しできます(see section 取り消し)。

Function: put-text-property start end prop value &optional object

この関数は、 文字列もしくはバッファobjectのテキストの、 startendの間にあるprop属性を、 valueに設定します。 もしobjectnilなら、 カレント・バッファが対象です。

Function: add-text-properties start end props &optional object

この関数は、 文字列もしくはバッファobjectのテキストの、 startendの間にあるテキスト属性を変更します。 もしobjectnilなら、 カレント・バッファが対象です。

引数propsは、どの属性を変更するかを指定します。 これは属性リスト(see section 属性リスト)の形式、 つまり属性の名前と対応する値が交互になっている要素をもつリストの形式を、 もたなければなりません。

関数が実際にある属性の値をかえたとき、 返却値はtです。 そうでなければ(propsnilか、 値がテキストのそれと同じだったら)、 nilです。

たとえば、 テキストのある範囲のcommentfaceという属性を変えるには、 こうします。

 
(add-text-properties start end
                     '(comment t face highlight))
Function: remove-text-properties start end props &optional object

この関数は、 文字列もしくはバッファobjectstartendの間のテキストから、 指定したテキスト属性を消去します。 もしobjectnilなら、 カレント・バッファが対象です。

引数propsは、消去する属性を指定します。 これは属性リスト(see section 属性リスト)の形式、 つまり属性の名前と対応する値が交互になっている要素をもつリストの形式を、 もたなければなりません。 しかし、意味をもつのは、名前だけです。 名前に付随する値は無視されます。 たとえば、face属性を消去するには、こうします。

 
(remove-text-properties start end '(face nil))

関数が実際にある属性の値をかえたとき、 返却値はtです。 そうでなければ(propsnilか、 指定したテキストにこれらの属性をもつ文字がまったくなかったら)、 nilです。

Function: set-text-properties start end props &optional object

この関数は、 文字列もしくはバッファobjectの、 startendのテキストの間のテキスト属性を、 指定したものと置き換えます。 もしobjectnilなら、 カレント・バッファが対象です。

引数propsは新しい属性リストです。 これは、 属性の名前と対応する値が交互になっている要素をもつリストでなければなりません。

set-text-propertiesから戻ると、 指定した範囲にあるすべての文字は、同じ属性をもちます。

もしpropsnilなら、 指定した範囲のテキストからすべての属性を取り去ることになります。 例をあげます。

 
(set-text-properties start end nil)

属性は転記せずにバッファのテキストを転記する関数 buffer-substring-no-propertiesについてはSee section バッファ内容の調査


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

29.18.3 属性検索関数

テキスト属性の典型的な利用法では、 ほとんどの間、いくつかのあるいは多くの連続した文字が、 ある属性にたいし同じ値をとります。 文字を一つひとつ調べるプログラムを書くよりも、 同じ属性の値をもつテキストのかたまりを処理する方が速くなります。

こういうときに使える関数があります。 属性値の比較にはeqを使います。 いずれの場合も、objectのデフォルト値はカレント・バッファです。

効率を上げるため、 これらの関数、特に単一の属性を検索する関数で、 limit引数を使うことはとても大切です。 さもないと、 調べている属性が変化しないなら、 バッファの最後までスキャンするので長い時間がかかるからです。

位置は常に二つの文字の間にあることに注意してください。 この関数が返す値は、 異なる属性をもつ二つの文字の間の位置です。

Function: next-property-change pos &optional object limit

この関数は、 位置posから文字列もしくはバッファのobjectのテキストを、 あるテキスト属性が変化するまで前方にスキャンします。 いいかえると、 pos以降で文字の属性がposの文字の属性と異なる 最初の文字の位置を返します。

もしlimitが非nilのとき、 スキャンは位置limitをもって中止します。 その場所までに属性の変更がないとき、 next-property-changelimitを返します。

limitnilobjectの最後まで属性が変らないときは、 nilを返します。 もし値が非nilなら、 posかそれより大きな値の位置です。 limitposが等しいときにかぎり、 値はposになります。

以下に、 すべての属性が一定のテキストのひとかたまりずつ、 バッファをスキャンする方法の例を示します。

 
(while (not (eobp))
  (let ((plist (text-properties-at (point)))
        (next-change
         (or (next-property-change (point) (current-buffer))
             (point-max))))
    ポイントからnext-changeまでを処理する…
    (goto-char next-change)))
Function: next-single-property-change pos prop &optional object limit

この関数は、 位置posから文字列もしくはバッファのobjectのテキストを、 prop属性が変化するまで前方にスキャンし、 変化のあった位置を返します。 いいかえると、 pos以降でprop属性がpos直後の文字の属性と異なる 最初の文字の位置を返します。

もしlimitが非nilならば、 スキャンは位置limitで終了します。 その場所までに属性の変更がないとき、 next-single-property-changelimitを返します。

属性がobjectの最後まで一定でlimitnilならば、 値はnilです。 もし値が非nilなら、 posかそれより大きな値の位置です。 limitposが等しいときにかぎり、 値はposになります。

Function: previous-property-change pos &optional object limit

これはnext-property-changeに似ていますが、 posより順方向ではなく逆方向にスキャンを行ないます。 もし値が非nilなら、 posかそれより小さな値の位置です。 limitposが等しいときにかぎり、 値はposになります。

Function: previous-single-property-change pos prop &optional object limit

これはnext-single-property-changeに似ていますが、 posより順方向ではなく逆方向にスキャンを行ないます。 もし値が非nilなら、 posかそれより小さな値の位置です。 limitposが等しいときにかぎり、 値はposになります。

Function: text-property-any start end prop value &optional object

この関数は、 startからendまでの間に、 属性propの値がvalueであるような文字が 少なくとも一つあるとき非nilの値を返します。 より正確にいうと、 そのような最初の文字の位置を返します。 ない場合は、nilを返します。

省略可能な5番目の引数objectは、 スキャンされる文字列もしくはバッファを指定します。 objectのデフォルト値は、カレント・バッファです。

位置はobjectから相対的なものになります。 objectのデフォルト値は、カレント・バッファです。

Function: text-property-not-all start end prop value &optional object

この関数は、 startからendまでの間に、 属性propの値がvalueと異なるような文字が 少なくとも一つあるとき非nilの値を返します。 より正確にいうと、 そのような最初の文字の位置を返します。 ない場合は、nilを返します。

省略可能な5番目の引数objectは、 スキャンされる文字列もしくはバッファを指定します。 位置はobjectから相対的なものになります。 objectのデフォルト値は、カレント・バッファです。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

29.18.4 特殊な意味をもつ属性

次の表は、組込みで特別な意味をもつテキスト属性の名前です。 次の節には、 行詰めの制御を行なうときに使われる特別な属性名のリストがあります。 これ以外の名前に標準の意味はないので、 好きなように使うことができます。

category

文字にcategory属性があるとき、 これをその文字の範疇(category)といいます。 これはシンボルでなければなりません。 このシンボルの属性は、 この文字の属性のデフォルト値となります。

face

属性faceを使ってテキストの字体や色を制御することができます。 値は字体のフェース名かあるいはフェース名のリストです。 詳しくはSee section フェース。 この機能は一時的なものになるかもしれません。 将来は、ほかの方法でテキストの表示の仕方をするよう変えるかもしれません。

mouse-face

属性mouse-faceは、 文字の上または近くにマウスがきたときfaceの代わりに使います。 ここで「近い」というのは、 マウスの場所とその文字の間のテキストが すべて同じmouse-face属性の値をもつということです。

local-map

local-map属性でテキストの一部分に別なキーマップを指定できます。 ポイントの次の文字の属性の値が非nilならば、 バッファのローカル・マップを置き換えます。See section アクティブ・キーマップ

read-only

文字が属性read-onlyをもつとき、 その文字の変更はできません。 そのようなことをするコマンドはエラーになります。

(訳注: 属性の)粘着性により、 通常のテキストの挿入でread-only属性が継承された場合、 読出し専用文字の前後 への挿入はエラーになります。 したがって、 粘着性を制御することにより、 読出し専用テキストのまわりへの挿入の権限を 制御することができます。See section テキスト属性の粘着性

属性の変更はバッファの修正に入るので、 inhibit-read-onlyを非nilの値に束縛してから 属性を消去するという方法を使わないかぎり、 read-only属性を消去することは不可能です。See section 読みだし専用バッファ

invisible

invisible属性が非nilの場合、 文字を画面上で不可視にすることができます。 詳細はSee section 不可視テキスト(invisible text)

intangible

もし連続した文字群に、 非nilでequalのintangible属性がある場合、 その文字群の中間にポイントを置くことができなくなります。 もし順方向にポイントをその群の中へ入れようとしたとき、 実際のポイントは群の後に移動します。 もし逆方向にポイントをその群の中へ入れようとしたとき、 実際のポイントは群の前に移動します。

変数inhibit-point-motion-hooksが非nilのとき、 intangible属性は無視されます。

modification-hooks

文字に属性modification-hooksがあるとき、 これは関数のリストでなければなりません。 この関数群は、その文字の修正時に呼び出されます。 各関数には二つの引数、 すなわちバッファの修正部分の最初と最後が、 渡されます。 ある特定の修正フック関数が複数の文字上にあるとき、 単一のプリミティブによる修正では、 何回呼び出されるのかを予期することはできません。

insert-in-front-hooks
insert-behind-hooks

バッファへのテキスト挿入操作では、実際にバッファを修正する前に、 後続する文字のinsert-in-front-hooks 属性のリストにある関数群と、 先行する文字のinsert-behind-hooks属性のリストにある関数群が、 呼び出されます。 挿入されるテキストの最初と最後が、 引数としてこの関数群に渡されます。

バッファのテキストを修正したとき呼び出される ほかのフックについては変更フックを参照してください。

point-entered
point-left

特殊な属性point-enteredpoint-leftには、 ポイントの移動を報告するフック関数群を登録します。 ポイントが移動するたびに、 Emacsは以下の属性値との比較を行ないます。

もしこれら二つの値が違うとき、 それらは(nilでなければ)いずれも、 ポイントの以前の値と新しい値を引数にして呼び出されます。

同様の比較は新旧各位置の直前の文字についても行ないます。 結果として、 二つのpoint-left関数(両方が同じ場合もあります)と、 二つのpoint-entered関数(両方が同じ場合もあります)が、 実行されることになります。 いずれの場合も全point-left関数が呼び出されてから、 全point-entered関数が呼び出されます。

プリミティブ関数はポイントを動かさずに、 いろいろな位置の文字を調べることがあります。 ポイントの値の実際の変更だけが、 これらのフック関数を作動させます。

Variable: inhibit-point-motion-hooks

この変数が非nilの場合、 point-leftpoint-enteredフックは作動せず、 intangible属性の効果はなくなります。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

29.18.5 整形済みテキスト属性

以下のテキスト属性は、行詰めコマンドの振舞いに影響を与えます。 表示用に整形されたテキストに使います。行詰めとSee section 行詰めのマージン

hard

もし改行文字にこの属性があるとき、 それは「強い」意味の改行であることを示します。 行詰めコマンドは強い改行を変えたり、 あるいは強い改行を越えて語を動かしたりすることはありません。 しかし、この効果は、 use-hard-newlinesが非nilのときだけ有効です。

right-margin

この属性は、この部分のテキストの行詰めを行なうときの、 右マージンの追加を指定します。

left-margin

この属性は、この部分のテキストの行詰めを行なうときの、 左マージンの追加を指定します。

justification

この属性は、この部分のテキストの行詰めを行なうときの、 右揃えのスタイルを指定します。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

29.18.6 テキスト属性の粘着性

自己挿入文字は通常、 先行する文字と同じ属性をとります。 これを属性の継承(inheritance)といいます。

Lispプログラムでは、 選択した挿入用プリミティブにしたがって、 継承つきや継承なしの挿入を行なうことができます。 insertのような通常のテキスト挿入関数は属性の継承を行ないません。 挿入する文字列と同一の属性だけを挿入し、ほかの属性ははいりません。 テキストをある文脈から別の文脈へ複写するプログラムのときにも、 このことは成立します。 これはたとえば、 killリングからのあるいはkillリングへの複写を行なう場合です。 継承つきの挿入を行なうには、 この節で説明する特殊なプリミティブを使います。 自己挿入文字はこれらのプリミティブを使っているので、 属性の継承を行ないます。

継承つき挿入を行なうときどの属性が継承されるかは、 二つの属性に依存します。 その属性とはfront-stickyrear-nonstickyです。

文字の後への挿入は後方粘着的(rear-sticky)な属性を継承します。 文字の前への挿入は前方粘着的(front-sticky)な属性を継承します。 デフォルトでテキスト属性は後方粘着的ですが、 前方粘着的ではありません。 したがってデフォルトでは先行する文字の全属性を継承し、 後続する文字の属性はまったく継承しません。 ある属性の粘着性を指定して、この振舞いを変えることができます。

もし文字のfront-sticky属性がtならば、 その文字のすべての属性は、前方粘着的です。 もしfront-stickyがリストならば、 その文字の粘着的属性はリストに名前が出ているものになります。 たとえば、もしある文字のfront-sticky属性の値が (face read-only)だったならば、 前に挿入した文字はface属性とread-only属性を継承しますが、 ほかには継承を行ないません。

rear-nonstickyは逆向きに作用します。 すべての属性はデフォルトで後方粘着的ですから、 rear-nonsticky属性はどの属性が後方粘着的かを示すわけです。 もし文字のrear-nonsticky属性がtならば、 後方粘着的な属性はなくなります。 もしrear-nonsticky属性がリストのときは、 リストに名前が出ていない属性が後方粘着的になります。

継承つきでテキストを挿入するとき、 先行する文字の後方粘着的な属性と、 後続する文字の前方粘着的な属性を継承します。 両側で同じ属性が違う値のとき、 前の文字の属性が優先します。

以下の関数が属性の継承を行なうテキストの挿入関数です。

Function: insert-and-inherit &rest strings

関数insertのように文字列stringsを挿入しますが、 隣のテキストから粘着的な属性を継承します。

Function: insert-before-markers-and-inherit &rest strings

関数insert-before-markersのように文字列stringsを挿入しますが、 隣のテキストから粘着的な属性を継承します。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

29.18.7 テキスト属性をファイルへセーブする

テキスト属性をファイルの中に保存したり、 ファイルを挿入するときテキスト属性を復帰したりするには、 以下の二つのフックを使います。

Variable: write-region-annotate-functions

この変数の値は関数のリストで、 書き込もうとするファイルのテキストにたいする注釈のように、 ある方法でテキスト属性を符号化するために、 write-regionが作動させるものです。See section ファイルへの書込み

リスト中の各関数には二つの引数、 書き込むリージョンの最初と最後を渡します。 この関数は、バッファの内容を変えてはなりません。 またこれは、 バッファのテキストのほかにファイルに書き込む注釈を示すリストを、 返さなければなりません。

各関数は、 (position . string)の形をした要素のリストを、 返さなければなりません。 ここでpositionは整数で、 書き込むテキストからの相対位置を示し、 stringはそこに追加する注釈です。

この関数群のうちの一つから返される各リストは、 あらかじめpositionの昇順に整列されていなければなりません。 もし複数の関数があるとき、 write-regionはリストを破壊的に併合し、 一つの整列したリストにします。

write-regionが、 バッファからテキストを実際にファイルへ書き込むとき、 対応する位置にある指定した注釈を混ぜ合せます。 これらはバッファを修正することなく行なわれます。

Variable: after-insert-file-functions

この変数は、 insert-file-contentsがファイルの内容を挿入した後に呼び出す、 関数のリストを保持します。 この関数群は挿入したテキストをスキャンし対応するテキスト属性に変換します。

各関数は一つの引数、 挿入したテキストの長さを受け取ります。 テキストの始まりは、ポイントで示します。 この関数は、注釈のテキストをスキャン、消去し、 注釈が指定するテキスト属性を生成します。 ある関数の返した値は、次の関数への引数になります。

この関数群が戻るときは、 いつも挿入したテキストの先頭にポイントを置かなければなりません。

想定していたafter-insert-file-functionsの使い方は、 テキスト化した注釈を実際のテキスト属性に変換することです。 しかし、ほかの使い方をしてもかまいません。

私たちはユーザに、 ファイルにテキスト属性を格納したり検索したりするLispプログラムを、 このフックを使って書いていただきたい、 と思います。 そうすれば、いろいろなデータ形式を試して、 いいものを見つけることができます。 私たちはユーザに、 Emacsにインストールできる一般的でよい拡張をうみだしていただくことを、 希望します。

属性の名前やその値に任意のLispオブジェクトを扱うように試みることは、 提案していません。 なぜなら一般的なプログラムというものは多分書くのが難しく遅いからです。 その代わり、 適度に柔軟なデータ型を選んで符号化が難しくならないようにしてください。

これに関連する機能についてはSee section ファイル・フォーマットの変換


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

29.18.8 テキスト属性が区間ではない理由

あるエディタは、 テキストの「区間」をユーザに指定させてその区間に属性を付加して、 バッファのテキストに属性を付加することをサポートしています。 このようなエディタはユーザやプログラマに各区間の始めと終りを 決めることを許しています。 私たちは、テキストの修正にまつわるある逆説的な振舞いを避けるため、 Emacs Lispへ異なった種類のインタフェースを慎重に与えました。

もし区間への分割に意味があるならば、 ある属性のある一つの区間をもつバッファと、 同じテキストをもち同じ属性が二つの区間になっているバッファとを、 区別できるはずです。

一つだけの区間をもつバッファがあったとして、 テキストの一部分をkillしたとします。 バッファに残ったテキストは一つの区間で、 killリング(そしてundoリスト)中の複製は別の区間になります。 このときkillしたテキストをヤンクすると、 同じ属性をもつ二つ区間ができてしまいます。 したがって編集の上では、 一つの区間と二つの区間を区別することができないのです。

この問題を「修正」するのに、 テキストが挿入されたときに二つの区間を合体し ようとしたとしましょう。今度は、同じ属性をもつ二つの隣あった区間があると して、片方の区間のテキストをkillしヤンクして戻したとしてください。以前の 問題を解決したのと同一な区間の合体機能が、今度は問題になります。つまりヤン クすると、一つの区間になってしまうからです。繰り返しますが、編集の上で、 一つの区間と二つの区間の区別を保つことができないのです。

区間と区間の境界にテキストを挿入した場合も、満足できる解答のでない問題 をひき起こします。

しかしながら、「この文字の属性は何か?」という形の質問に一貫性をもって 振る舞う編集法を確立するのは、簡単です。そのため、私たちはこういう質問だ けに意味がある、とみなすことに決めました。どこで区間が始まりどこで区間が 終わるのか、という質問に答えるような実装を私たちはとっていません。

実際、たいていは陽な区間の境界の代わりに属性の検索関数を使うことができます。 可能ならばいつでも常に区間が合体すると仮定するならば、 これを区間の境界を見つけたのだ、 と考えることができます。See section 属性検索関数

表現上の機能としてはEmacsには陽な区間もあります。See section オーバレイ


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

29.19 文字符号の置換

以下の関数は指定したリージョンの文字を文字コードにしたがって置換します。

Function: subst-char-in-region start end old-char new-char &optional noundo

この関数は、カレント・バッファ中のstartendで定義 されるリージョン内の文字old-charを文字new-charで置き換えます。

もしnoundoが非nilの場合、 subst-char-in-regionはこの変更を取り消し用に記録することはせず、 また修正されたとしてバッファをマークすることもしません。 この機能は、選択表示の制御に使用します (see section 選択表示)。

subst-char-in-regionはポイントを動かさず、 nilを返します。

 
---------- Buffer: foo ----------
This is the contents of the buffer before.
---------- Buffer: foo ----------

(subst-char-in-region 1 20 ?i ?X)
     ⇒ nil

---------- Buffer: foo ----------
ThXs Xs the contents of the buffer before.
---------- Buffer: foo ----------
Function: translate-region start end table

この関数は、バッファの位置startendの間の文字に、 変換テーブルを適用します。

変換テーブルtableは文字列です。 (aref tableochar)が、 ocharに対応する変換後の文字になります。 もしtableの長さが256以下なら、 tableの長さより大きな符号の文字は変換によって変化しません。

translate-regionの返却値は、 実際に変換で変更された文字の数です。 変換テーブルで自分自身に射像した文字は、 含みません。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

29.20 レジスタ

レジスタは、Emacsの編集中に、マーカ、文字列、長方形、 (一つのフレームの)ウィンドウ構成、 (全フレームの)フレーム構成を保管できる変数の一種です。 各レジスタには、単一文字の名前がついています。 (C-gを例外にして)制御文字とメタ文字を含んだすべての文字は、 レジスタ名に使用できます。 したがって255個のレジスタが有り得ます。 Emacs Lispではレジスタをその名前の文字で指し示します。

この節の関数は、特に明記しないかぎり予期せぬ値を返します。

Variable: register-alist

この変数は、要素が(name . contents)の形をしたalistです。 通常は、使用中の各Emacsレジスタに一つの要素があります。

オブジェクトnameはレジスタを識別する文字(整数)です。 オブジェクトcontentsは、文字列かマーカかリストで、 レジスタの内容を示します。 文字列はレジスタに格納したテキストを示します。 マーカは位置を示します。 リストは長方形を示します。 その要素は長方形の1行あたり一つの文字列です。

Function: get-register reg

この関数は、 レジスタregの内容あるいはそれがなければnilを返します。

Function: set-register reg value

この関数は、レジスタregの内容をvalueに設定します。 レジスタはどんな値でももつことができますが、 ほかのレジスタ関数はあるデータ型だけを期待します。 返却値はvalueです。

Command: view-register reg

このコマンドはレジスタregに格納されているものを表示します。

Command: insert-register reg &optional beforep

このコマンドは、レジスタregの内容をカレント・バッファに挿入します。

通常、このコマンドは挿入したテキストの前にポイントを、 後にマークを置きます。 しかしながら、 もし省略可能な第2引数beforepが非nilのときは、 マークを前に、ポイントを後に置きます。 前置引数を与えれば、 対話的にこの関数に非nilを第2引数beforepに指定することができます。

レジスタに長方形が入っていたとき、 ポイントを左上にして長方形を挿入します。 これは、現在の行とその下の行にテキストを挿入するということです。

レジスタに、 保存したテキスト(文字列)でも長方形(リスト)でもないものが入っていたとき、 今のところ、役に立たないことがおきます。 これは将来修正されるでしょう。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

29.21 テキストの交換

交換コマンドは次のサブルーチンを使います。

Function: transpose-regions start1 end1 start2 end2 &optional leave-markers

この関数は、二つの重ならないバッファの部分を交換します。 引数start1end1が片方の境界を指定し、 引数start2end2がもう片方の境界を指定します。

通常、 transpose-regionsは交換するテキストといっしょにマーカも再配置します。 交換した二つの部分の内の片方に入っていたマーカが、 その部分といっしょに動きます。 したがって新しい部分においても文字と文字の間の位置関係は変りません。 しかしながら、もしleave-markersが非nilならば、 transpose-regionsはマーカの移動をしません。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

29.22 変更フック

以下のフック変数は、すべてのバッファ (これをバッファローカルにすれば、ある特定のバッファ)におけるすべての変更に 着目するときに使います。 テキストの特定の位置の変更を検出するには特殊な意味をもつ属性を参照してください。

このフックを使う関数は、 正規表現を使う操作を行なったとき一致データの保存と復帰をしなければなりません。 そうしないと一致データを使う編集が悪影響を受けてしまいます。

Variable: before-change-functions

この変数は、すべてのバッファ修正の前に呼ばれる関数のリストです。 各関数は、変更されようとするリージョンの始めと終りを表わす二つの整数を、 引数にうけとります。 変更しようとしているバッファは常にカレント・バッファです。

Variable: after-change-functions

この変数は、すべてのバッファ修正の後に呼ばれる関数のリストです。 各関数は、変更されたリージョンの始めと終り、 そして変更前のテキストの長さを引数に受取ります (現在の長さは、リージョンの終りから始めを引いた値です)。 三つの引数はすべて整数です。 変更しようとしているバッファは常にカレント・バッファです。

Variable: before-change-function

このobsolete変数は、 すべてのバッファの修正の前に呼び出される関数を一つ保持します (関数がないときはnil)。 これはbefore-change-functionsの中の関数のように呼び出されます。

Variable: after-change-function

このobsolete変数は、 すべてのバッファの修正の後に呼び出される関数を一つ保持します (関数がないときはnil)。 これはafter-change-functionsの中の関数のように呼び出されます。

上の四つの変数は、いずれかの関数が作動している間は一時的に、 nilに束縛されます。 そのためこれらの関数の一つがバッファを変更しても、 この関数群を作動させることはありません。 これらの関数を作動させるような変更を行なうフック関数が必要なときは、 この変数群を通常の値に束縛してください。

この見込み機能による不便な結果は、 after-change-functionsbefore-change-functionsの中で、 この変数の値の変更をする関数ができないということです。 しかし、これは真の制限ではありません。 この関数群に作動させる関数のリストを変更させたいときは、 単にある固定した一つの関数をフックに追加し、 呼び出すほかの関数を別な変数から見るような関数を書きます。 例をあげます。

 
(setq my-own-after-change-functions nil)
(defun indirect-after-change-function (beg end len)
  (let ((list my-own-after-change-functions))
    (while list
      (funcall (car list) beg end len)
      (setq list (cdr list)))))
(add-hooks 'after-change-functions
           'indirect-after-change-function)
Variable: first-change-hook

この変数は、 それまで修正されていない状態からバッファの変更があったときに必ず作動する、 正規フックです。


[ << ] [ >> ]           [Top] [Contents] [Index] [ ? ]

This document was generated by Yasutaka SHINDOH on September, 29 2006 using texi2html 1.76.