検索エンジンから来た人に注意このマニュアルは、Emacs ver. 19.x 向けのマニュアルを Mule 2.x の開発にあたり邦訳したものを、 電脳外道学会がミラーリングしているものであり、旧版製品パラノイアであるところの椅子人の趣味によるものです。しかしながら、現在の Emacs の主流は ver. 20 以降であり、ver 19.x と ver 20.x とでは、仕様の違いが少なからずあります。 したがって、一般的な Emacs ユーザーにとっては、
このマニュアルと実機の動作とが符合しない場合があります。
|
本章では、バッファ中のテキストを扱う関数について述べます。 ほとんどがカレント・バッファのテキスト、 それもポイント近辺の検査、挿入、消去を行なうものです。 多くは対話的です。 テキストを変更するすべての関数は、 その変更の取り消しが可能です(see section 取り消し)。
テキスト関係の関数の多くは、
startおよびendという引数で渡される、
二つのバッファ内位置で定義されるテキストのリージョンにたいして、
操作を行ないます。
これらの位置はマーカ(see section マーカ)か、
数値による文字の位置(see section 位置)です。
この二つの位置が与えられている順番は重要ではありません。
startで終りendで始まってもかまいません。
たとえば、(delete-region 1 10)と(delete-region 10 1)は等価です。
どちらかの位置がバッファのバッファの範囲に存在しない場合、
args-out-of-rangeエラーになります。
対話的に呼び出した場合、これらの引数値はポイントとマークになります。
本章では、「テキスト」は対象となるバッファ中の文字と、 (もし意味があるときは)テキストの属性を指します。
ポイントのまわりの文字を調べる多くの関数があります。
ここではそのうちいくつかの簡単なものについて述べます。section 正規表現の検索
のlooking-atも参照してください。
nilです。
以下の例において、バッファの最初の文字は`@'になっています。
(char-to-string (char-after 1))
=> "@"
(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"
following-charの下を見てください。
ポイントがバッファの最初の位置にある場合、
preceding-charは0を返します。
tを返します。
ナローイングが用いられている場合、
ここでいう先頭はそのアクセス可能部分の先頭を意味します。section ポイント
のpoint-minも参照してください。
tを返します。
ナローイングが用いられている場合、
ここでいう先頭はそのアクセス可能部分の最後を意味します。See section ポイント
のpoint-maxも参照してください。
tを返します。See section テキスト行単位での移動。
バッファ(あるいはアクセス可能部分)の先頭は、
いつでも行頭のうちにはいります。
tを返します。
バッファ(あるいはアクセス可能部分)の終りは、いつでも行末とみなします。
この節では、 Lispプログラムでバッファのテキストの一部を文字列へ変換するための、 二つの関数について述べます。
buffer-substringはargs-out-of-rangeエラーを通知します。
startをendより前にする必要はなく、 引数はどちらの位置でもかまいません。 しかし普通は、小さい方が前です。
もし転記されるテキストにテキスト属性があるとき、 転記した文字のテキスト属性もいっしょに転記されます。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 "
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)
(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
"
この関数は、 文字列に変換することなく、 バッファ内のある部分を比較します。
nilを指定すると、
カレント・バッファになります。
はじめの部分が小さければ値は負になり、はじめの方が大きければ正、 もし同じなら0になります。 結果の絶対値は、 比較部分で最初の異なる文字の添え字に1を加えたものになります。
case-fold-searchが非nilのとき、
当関数は文字の比較で大文字小文字の違いを無視します。
テキスト属性は常に無視します。
カレント・バッファに`foobarbar haha!rara!'というテキストがあったとします。 そしてこの例で二つの部分を`rbar 'と`rara!'します。 最初の部分が次の部分よりも大きいので、値は2です。
(compare-buffer-substring nil 6 11 nil 16 21)
=> 2
挿入(insertion)とはバッファに新しいテキストを加えることです。 挿入するテキストはポイントに、 つまりポイントの前の文字と後の文字の中間に、入ります。
挿入箇所より後の位置を指すマーカは挿入によって再配置しますので、
まわりのテキストの場所からは止まっているようにみえます(see section マーカ)。
マーカが挿入箇所を指していたとき、普通はマーカの移動はおきないので、
挿入したテキストの先頭を指します。
しかしながらinsert-before-markersのような特殊な関数では、
挿入箇所のマーカを挿入したテキストの後に移動します。
挿入関数のうちあるものは挿入するテキストの前にポイントを残し、 あるものは後に移動します。 前者をポイントの後に(after point)挿入するといい、 後者をポイントの前に(before point)挿入するといいます。
カレント・バッファが読出し専用のとき、挿入関数はエラーを通知します。
この関数群は文字列やバッファからテキスト文字を転記すると同時に、 属性も転記します。 挿入される文字は、転記されてくる文字とちょうど同じ属性をもちます。 その一方、 文字列やバッファの一部としてではなく文字を別々な引数として指定する場合、 その文字はテキスト属性をまわりのテキストから継承します。
nilです。
nilです。
当関数はほかの挿入関数と異なり、 挿入箇所を指していたマーカの位置を挿入したテキストの後に再配置します。
nilです。
もしinheritが非nilならば、
挿入される文字は粘着的テキスト属性を、
挿入箇所の前後の2文字から継承します。See section テキスト属性の粘着性。
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 テキスト属性の粘着性。 字下げ関数で挿入された空白もテキスト属性を継承します。
この節では、 主にユーザが呼ぶことを想定しているものの、 Lispプログラムから呼んでも便利な、 テキストを挿入する上位のコマンドを解説します。
nilです。
nilを返します。
ほとんどの印字文字がこのコマンドにバインドされています。
self-insert-commandは普段もっともよく呼ばれるEmacsの関数ですが、
これをキーマップに入れるときをのぞけば、
プログラムがこれを用いることはほとんどありません。
対話的に呼び出すと、countは数値前置引数になります。
auto-fill-functionが非nilなら、
このコマンドはスペースあるいは改行が挿入されるたびに、
auto-fill-functionを呼び出します(see section 自動的行詰め)。
Abbrevモードが有効で、 挿入した文字が語構成可能構文をもたないとき、 当コマンドは省略形の展開を行ないます。 (section 省略形とその展開そして、See section 構文クラスのテーブル)
入力した文字が閉じ括弧構文をもつとき、
当関数はblink-paren-functionを呼び出します(see section 対応括弧の点滅表示)。
現在の桁数がfill-columnの値よりも大きく、
number-of-newlinesの値がnilのとき、
この関数は、auto-fill-functionを呼び出します。
典型的なauto-fill-functionの実行することとは、改行の挿入です。
この場合最終的には二つ改行を別の場所に挿入することになります。
一つはポイントで、もう一つは行のどこか前の場所です。
newlineはnumber-of-newlinesが非nilのとき、
自動行詰めをしません。
このコマンドは左マージンが0でなければ、 そこまで字下げを行ないます。See section 行詰めのマージン。
返却値はnilです。
対話的に呼ばれた場合、
number-of-newlinesは数値前置引数になります。
indent-to関数で行ないます。
ポイントの位置を返します。
プログラムがこの関数を使うことはめったにありません。
nilの値でモードが有効になります。
どのような方法で変更しても自動的にバッファローカルになります。
消去とはバッファのテキストの一部をkillリングに保存せずに、 なくしてしまうことをいいます(see section killリング)。 消去したテキストはヤンクできません。 しかし、取り消し機構で元に戻すことはできます(see section 取り消し)。 一部の消去の関数は、 ある特別な場合にkillリングにテキストを保存することがあります。
消去の関数はすべて、
カレント・バッファにたいし操作を行ないnilを返します。
buffer-read-onlyエラーを通知します。
そうでない場合、何もきかずにテキストを消去します。
nilを返します。
通常、バッファから多量のテキストが消去されると、
「バッファが縮んだ」("because it has shrunk")ため、
このバッファの自動セーブが禁止になります。
しかしながらerase-bufferはそうしません。
往々にして消去する前のテキストと後のテキストとはお互いに関係がないため、
前のテキストの大きさとの比較をするべきではないからです。
nilです。
nilの場合、
消去した文字をkillリングに保存します。
対話的に呼ばれた場合、countは数値前置引数になり、 killpは未処理の前置引数になります。 したがって前置引数が与えられるとテキストはkillリングに保存されます。 前置引数が与えられない場合、1文字が消去されkillリングには保存されません。
返却値は常にnilです。
nilの場合、
消去した文字をkillリングに保存します。
対話的に呼ばれた場合、countは数値前置引数になり、 killpは未処理の前置引数になります。 したがって前置引数が与えられるとテキストはkillリングに保存されます。 前置引数が与えられない場合、1文字が消去されkillリングには保存されません。
返却値は常にnilです。
nilの場合、
このコマンドは消去した文字をkillリングに保存します。
タブからスペースへの変換はcountが正の場合だけおこります。 負の場合、ポイントの後のちょうど-count文字をを消去します。
対話的に呼ばれた場合、countは数値前置引数になり、 killpは未処理の前置引数になります。 したがって前置引数が与えられるとテキストはkillリングに保存されます。 前置引数が与えられない場合、1文字が消去されkillリングには保存されません。
返却値は常にnilです。
この節では、 主にユーザが呼ぶことを想定しているものの、 Lispプログラムから呼んでも便利な、 テキストを消去する上位のコマンドを解説します。
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 ----------
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で決めます。
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 ----------
nilを返します。
空白行とはタブとスペース以外のものを含まない行のことです。
delete-blank-linesはnilを返します。
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)貼りをしたことのある人には、 意味があるでしょう。 でも今となってはこの用語を変更するのは困難です。
killリングはリストに文字列として、 killされたテキストを最近のものを最初にして記録します。 たとえば、短いkillリングは以下のようになっています。
("some text" "a different piece of text" "even older text")
リストの長さがkill-ring-maxになったら、
新しい項目を追加すると自動的に最後の項目を消去します。
killのコマンドがほかのコマンドにはさまれると、 killのコマンドは新しい項目をつくります。 連続した複数のkillのコマンドはkillリングで単一の項目になり、 ヤンクのときの一つの単位になります。 2回目以降の連続したkillのコマンドは、 最初のそれが作った項目にテキストを追加します。
killリング中の一つの項目は、 ヤンクでリングの「前」へと指示されます。 あるヤンクのコマンドは異なる要素を「前」へと指示すことで、 リングを「まわし」ます。 しかし、この仮想的な回転は実際のリストの変更はしません。 最近の項目が常にリストの最初にきます。
kill-regionはテキストをkillするときにいつも使うサブルーチンです。
このコマンドを呼ぶ関数はすべて「killのコマンド」
(で多分、名前には`kill'がつくべき)です。
kill-regionは新しくkillしたテキストを、
killリングの先頭に置くか、一番最近の要素につけたすかします。
これはlast-command変数で前のコマンドがkillのコマンドだったかを判別し、
もしそうだった場合、killしたテキストを最も新しい項目に追加します。
nilです。
対話的に呼ばれた場合、startとendはポイントとマークになります。
バッファが読出し専用のとき、
kill-regionは同じようにkillリングを変更し、
バッファを修正せずにエラーを通知します。
読出し専用のバッファからkillリングへテキストを写すとき、
ユーザがどんなkillのコマンドを使うこともできて便利です。
nilを返します。
対話的に呼ばれるとstartとendはポイントとマークになります。
一瞬カーソルを動かしたりエコー領域にメッセージを表示したりして、
写したテキストを示します。
このコマンドは、
this-commandをkill-regionにすることはありませんので、
killのコマンドが続いても同じkillリングの項目に追加されません。
Emacs 18をサポートする目的がないのなら、
Lispプログラムではcopy-region-as-killを呼ばないでください。
Emacs 19では、
kill-newやkill-appendを使うほうが
よいでしょう。See section 下位のkillリング。
ヤンク(yanking)とは、 前にkillしたテキストをkillリングから再び挿入することです。 テキスト属性も転記されます。
(対話的にC-uを押下し数字を押下せずに呼んだときのように)
argがリストの場合、yankは上記のようにヤンクしますが、
挿入したテキストの前にポイントを位置づけ
テキストの終りにマークを位置づけます。
argが数字の場合、
yankはkillされたテキストのarg番目に新しいもの、
つまり、killリングのリストのarg番目の要素を挿入します。
yankがその内容を変えたりすることはありません。
(訳注:引数がなければ)killリングを回すこともありません。
nilを返します。
このコマンドはyankかyank-popの直後でしか許されません。
このような場合、
リージョンはその前のyankで挿入されたばかりのテキストをもちます。
yank-popはそのテキストを消去し、
その場所に、killされた別のテキストを挿入します。
消去したテキストはすでにkillリング上のどこかにありますから、
killリングへの追加は行ないません。
argがnilの場合、
置き換えるテキストはkillリングの一つ手前の要素です。
argが数値の場合、
置き換えるのはarg番目に前のkillになります。
argが負の場合、置き換えるのはより最近のkillになります
(訳注: たとえば、引数が2なら二つ手前のkill、
-2なら二つ後のkillということです)。
killリング中のkillのシーケンスは、 前に戻るようになっているため、 最も古いものの後に最も新しいものがきて、 最も新しいものの前に最も古いものがきます。
値は常にnilです。
以下の関数と変数はkillリングへの下位のアクセスのためのものですが、 Lispプログラムから使っても便利です。 X Windowのセレクションを使った対話のめんどうもみます。 これらはEmacsバージョン18には存在しません。
current-killは、
killリングの先頭を指すヤンク・ポインタをリング中でn回
(最近のkillから古いkillへ)まわして、
そこにきたリングのテキストを返します。
省略可能な第2引数do-not-moveが非nilのとき、
current-killは、ヤンク・ポインタを変えません。
現在のヤンク・ポインタから数えてn番目のkillを返すだけです。
nが、(最後のkillを示す)0になっているとき、
current-killは、
killリングを見る前にinterprogram-paste-function
(下記参照)の値を呼びます。
interprogram-cut-function(下記参照)の値の起動も行ないます。
nilのときは先頭につきます。
また、interprogram-cut-function(下記参照)の値の起動も行ないます。
nilか引数のない関数でなければなりません。
値が関数のとき、current-killが「最新のkill」を得るために、
これを呼び出します。
関数が非nilの値を返すと、
その値が「最新のkill」として利用されます。
nilを返すと、kill-ringの最初の要素が利用されます。
このフックの通常の使用例は、 Xサーバーの第1セレクションがほかのクライアントに所属しているときでも、 このセレクションを最新のkillとして取り込むことです。See section Xセレクション。
nilか引数が一つの関数でなければなりません。
値が関数のとき、kill-newとkill-appendは、
killリングの新しい1番目の要素を引数に、
これを呼び出します。
このフックの通常の使用例は、 Xサーバーの第1セレクションに 新しく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-ringとkill-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項目を指している様子を示します。
この状態はC-y(yank)の直後のM-y(yank-pop)で
(監訳者注:あるいはC-u 2 C-yで)
おきるはずです。
kill-ringの後部(tail)で、
CARはyankがヤンクすべきkill文字列を指すものです。
kill-ring-maxのデフォルト値は30です。
ほとんどのバッファは取り消しができるようにするために、
バッファのテキストの全変更を記録した
undoリスト(undo list)があります
(これのないバッファはたいてい、特別な目的のためのバッファで、
Emacsは取り消しが便利でないと仮定します)。
バッファのテキストを修正する全プリミティブ関数は、
自動的に変数buffer-undo-listというundoリストの前に、
要素を追加します。
tという値は、取り消し情報の記録を禁止します。
以下はundoリストの要素の種類です。
整数
(beg . end)
(text . position)
(abs position)です。
(t high . low)
primitive-undoはこの値を使って、
バッファが再び無修正の状態になったかどうかを判別します。
ファイルの修正時刻がこれらの数と一致するとき、
無修正という印をつけます。
(nil property value beg . end)
(put-text-property beg end property value)
position
nil
nilを返します。
エディタのコマンド・ループは、 キー・シーケンスの実行前に自動的に取り消しの境界をつくります。 したがって各取り消しは通常一つのコマンドの効果を取り消します。 自己挿入文字の入力は例外です。 コマンド・ループはそのような最初の文字で境界を作り、 以降連続する19個の自己挿入文字の入力では境界を作りません。 20個目で作り、自己挿入文字が続く間同様に繰り返します。
直前の取り消し可能な変更が別なバッファでなされた場合にはいつも、 すべてのバッファ修正で境界ができます。 こうして、複数のバッファを修正するコマンドは、 変更した各バッファに境界をつくります。
この関数を陽に呼ぶことは、コマンドの効果を複数の単位にわけるとき便利です。
たとえば、query-replaceは、
各置換の後でundo-boundaryを呼び出すので、
ユーザがそれぞれ一つずつの取り消しを行なうことができます。
primitive-undoはバッファを変更したら、
バッファのundoリストに要素を追加してしまいます。
取り消しのコマンドは、
一連の取り消し操作のはじめでundoリストの値を保存し、
混乱を防いでいます。
その後の取り消しの操作では、保管した値を使い、これを更新します。
取り消しで追加された新しい要素はこの保管した方の値に追加されませんから、
続けて取り消しを行なっても影響はありません。
この節では、 与えられたバッファの取り消し情報を禁止したり、 それを解除したりする方法を述べます。 また、undoリストが大きくなりすぎないように、 自動的に切り詰める方法についても説明します。
新規に生成したバッファの取り消し情報の記録は普通、
最初から有効です。
しかし、名前がスペース文字で始まるバッファははじめ、
取り消しの記録を禁止してあります。
以下の二つのコマンドを使ったり、
自分でbuffer-undo-listを設定したりして、
陽に取り消しの記録を禁止したり、解除したりすることができます。
nilを返します。
対話的に呼ばれた場合、buffer-or-nameはカレント・バッファになります。 ほかのバッファは指定できません。
nilを返します。対話的に呼ぶことはできません。
名前のbuffer-flush-undoはまだobsoleteではありませんが、
Emacsバージョン19では、
新しく推奨する名前buffer-disable-undoがあります。
編集を続けると、undoリストはどんどん長くなります。
有効なメモリ空間を使い果たすのを防ぐため、
塵集めの際に、設定のできるある大きさの上限まで切り詰めます
(この目的のため、undoリストの「大きさ」を、
リストを作っているコンス・セルと消去したテキストの文字列を合せて測ります)。
二つの変数undo-limitとundo-strong-limitで、
許容できる大きさの範囲を制御します。
行詰め(filling)とは、(行の変わるところを動かし)行の長さを調節し、
指定した最大幅(でもそれを越えない)くらいにすることです。
そして行を揃える(justified)、つまり、
スペースを挿入し右や左のマージンがちょうど並ぶようにすることもできます。
この幅は変数fill-columnで制御します。
読みやすさのために、行は70桁くらいよりは長くないのがよいでしょう。
Auto Fillモード(see section 自動的行詰め)を使い、 既存のテキストの変更では適切な行詰めをしないまま、 テキストを入力したときは自動的にテキストの行詰めをすることができます。 この場合、後で陽に既存のテキストの行詰めを行なわなければなりません。
この節のほとんどのコマンドは、意味のない値を返します。
行詰めを行なうすべての関数は、現在の左マージン、現在の右マージン、
現在の揃え方のスタイルの影響を受けます(see section 行詰めのマージン)。
現在の揃え方のスタイルがnoneのとき、
行詰めの関数は何もしません。
行詰め関数のうちのいくつかにはjustify引数があります。
もしこれが非nilならば、何らかの揃え方を要求していることになります。
とりうるのはleft(左揃え)、right(右揃え)、
full(両揃え)、center(中揃え)で、
それぞれ指定した揃え方のスタイルになります。
もしこれがtの場合は、
テキストのその部分で現在の揃え方のスタイルを用いることを意味します
(以下のcurrent-justificationを参照)。
行詰めの関数を対話的に呼び出すとき、
前置引数を使ってjustifyを値fullにすることができます。
nilなら、
各行の右揃えも行ないます。
段落の境を見つけるのには、
通常の段落移動コマンドを使います。See section `Paragraphs' in The Emacs Manual。
nilなら右揃えも行ないます。
変数paragraph-separateは、
段落と段落をどうわけるかを制御します。See section 編集用の標準正規表現。
最初の二つの引数startとendは、
行詰めを行なうリージョンの始めと終りです。
3番目と4番目の引数justifyとmail-flagは、
省略可能です。
もしjustifyが非nilなら、
行詰めと同時に右揃えも行ないます。
もしmail-flagが非nilなら、
この関数が扱っているのはメールのメッセージと仮定して、
ヘッダーの行詰めを行ないません。
通常、fill-individual-paragraphsは、
字下げの変化を新しい段落の始まりとみなします。
もしfill-individual-varying-indentが非nilなら、
分割行だけが段落を分割します。
このとき、字下げをしてある段落で、
最初の行にさらに字下げのしてあるものを処理することができます。
fill-individual-paragraphsの動作を変えます。
nilのとき、
この関数は、行詰めと同時に右揃えを行ないます。
対話的に呼び出したとき、 前置引数で右揃えを行ないます。
デフォルトで有効になっているAdaptive Fillモードでは、
行詰め接頭辞のないときに、
字下げをした段落でのfill-region-as-paragraphを実行すると、
段落の2行目の字下げを行詰め接頭辞にします。
fill-columnで終わるようにします。
nilを返します。
もし引数howが非nilのとき、
揃え方のスタイルを陽に指定します。
とりうるのはleft、right、full、
center、noneです。
これがもしtなら指定した揃え方のスタイルにしたがいます
(以下のcurrent-justificationを参照)。
nilは両揃えという意味になります。
もしeopが非nilならば、
current-justificationが両揃えを指定しているとき、
左揃えを行なうことを意味します。
これは段落の最後の行に使用します。
段落全体が両揃えであっても最後の行はそう揃えるべきではありません。
nosqueezeが非nilのときは、
中間の空白をいじらようにします。
left、right、full、center、
noneです。
デフォルト値はleftです。
nilのとき、
fill-paragraphはこの関数に実際の処理をさせます。
この関数が非nilの値を返したとき、
fill-paragraphは処理が終了したとみなし、
ただちにその値を返します。
この機能の通常の利用法は、 プログラミング言語のモードでコメントの行詰めを行なうことです。 通常どおりに段落の行詰めをしなければならないときは、 以下のようになります。
(let ((fill-paragraph-function nil)) (fill-paragraph arg))
nilのとき、
行詰め関数はhardテキスト属性のある改行を消去しません。
「強い改行」は段落のセパレータとして作用します。
左マージンがあるときは、空白の後に行詰め接頭辞がきます。
他人に読んでもらうために実際にテキストを書いているとき、
fill-columnを70以上に設定するべきではないでしょう。
さもないと長すぎて他人に心地好く読んでもらえませんし、
テキストが不格好です。
fill-columnの値を個別に設定していないバッファでのデフォルト値です。
これは(default-value 'fill-column)と同じです。
default-fill-columnのデフォルト値は、70です。
left-margin属性を
marginの値に設定します。
もしAuto Fillモードが有効ならば、
このコマンドは、
リージョンが新しいマージンにあうよう行詰めをやり直します。
right-margin属性を
marginの値に設定します。
もしAuto Fillモードが有効ならば、
このコマンドは、
リージョンが新しいマージンにあうよう行詰めをやり直します。
left-margin属性(なければ0)と、
変数left-marginの値の和です。
fill-column変数の値から、
ポイントの後ろのright-margin属性の値を引いたものです。
current-left-marginを呼び出して決定します。
もし引数nが非nilならば、
move-to-left-marginは、
最初n-1行順方向に移動します。
もしforceが非nilならば、
左マージンの値と一致しない場合、
行の字下げを修正することを意味します。
current-left-marginを呼び出して決定します。
この関数が空白でないものを消去することはありません。
indent-line-functionです。
現在の行の行頭で、
字下げが変数left-marginで指定した値になるよう調節します。
それには空白を挿入したり、消去したりします。
Auto Fillモードは、 テキストが入力されたとき自動的に行の行詰めを行なう副モードです。 この節ではAuto Fillが使うフックについて述べます。 既存のテキストの行詰めと右揃えを陽に行なう関数の説明は、section 行詰めを参照してください。
Auto Fillモードは、 テキストの一部の行詰めを行なうときの、 マージンや右揃えのスタイルを変更する関数を、 有効にするようにもします。See section 行詰めのマージン。
nilであってもかまいません。この場合何も行ないません。
Auto Fillモードのとき、
auto-fill-functionの値はdo-auto-fillです。
これは行を分割する通常処理の実装が目的の関数です。
昔のバージョンのEmacsでは、 この変数を
auto-fill-hookと呼んでいましたが、 フックを呼ぶ際の標準的な方法で呼ばれないため、 バージョン19では名前がauto-fill-functionに変更されました。
この節で述べる整列の関数はみな、
バッファのテキストを並べ換えるものです。
この点で、
リストの要素の順序を並べ換える関数sortと対照的です(see section リストを再構成する関数)。
これらの関数は特に意味のない値を返します。
sort-subrの働きを理解するために、
バッファのアクセス可能部を、
整列レコード(sort record)という互いに素な部分に分割して考えます。
ここで、
レコードは連続しているかもしれないしそうでないかもしれませんが、
重なってはいません。
各整列レコードのある部分(または全部)は、
整列キーとして指示されます。
整列では、この整列キーの順序にしたがってレコードを並べ換えます。
普通、レコードは整列キーの昇順に並べ換えられます。
sort-subr関数の第1引数reverseが非nilなら、
整列レコードは整列キーの逆順で並べ換えられます。
sort-subrへの次の四つの引数は、
整列レコードをとばしてポイントを動かすのに呼び出す関数です。
これはsort-subrから何回も何回も呼び出されます。
sort-subrが呼ばれたときのポイントの位置から始まる、
と仮定します。
したがって、
普通sort-subrを呼ぶ前には、
ポイントをバッファの先頭に動かしておくべきでしょう。
整列レコードがもうない場合、
この関数は、ポイントをバッファの最後に動かします。
nilの値を返すか、
整列キーがバッファのポイントで始まることを示すために、
nilを返すかしなければなりません。
後者のとき、
整列キーの最後を見つけるためendkeyfunが呼び出されます。
nilを返し、
この引数が略された(または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はレコードの終りに動かします。
レコード全体が整列キーですから、
引数startkeyfunとendkeyfunを与えません。
sort-paragraphs関数も同様ですが、
sort-subrの呼出しは以下のようになります。
(sort-subr reverse
(function
(lambda ()
(skip-chars-forward "\n \t\f")))
'forward-paragraph)
英文字順の整列とは、二つの整列キーの最初の文字を比較し、 そして次の文字を比較し、以下同様に続けていくことです。 最初に不一致のあった場所で小さい文字の方が小さい整列キーとなります。 個々の文字は数値で比較されます。EmacsはASCII文字集合を使いますから、 この集合内の順序が英文字順を決定します。
record-regexp引数は、 バッファを整列レコードに分割する方法を指定します。 各レコードの終りからこの正規表現で検索を行ない、 それと一致したのが次のレコードになります。 たとえば、正規表現が`^.+$'の場合、 改行以外の文字が少なくとも一つある行と一致するので、 このような行を整列レコードにすることになります。 正規表現の構文と意味についてはSee section 正規表現。
key-regexp引数の値は、 各レコードの中のどの部分を整列キーにするかを指定します。 key-regexpはレコード全体に照合させても、一部分だけでもかまいません。 後者の場合、残りの部分はレコードの整列順に関係ありませんが、 レコードが新しい場所に移動するときはいっしょになります。
key-regexp引数は、 record-regexpの部分式と一致するテキストも参照できますし、 独自の正規表現を指定することもできます。
もしkey-regexpが
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-regexpとkey-regexpをミニバッファから求めるために、
プロンプトを出します。
nilの場合、整列は逆順に行ないます。
nilの場合、整列は逆順に行ないます。
nilの場合、整列は逆順に行ないます。
reverseが非nilの場合、整列は逆順に行ないます。
このコマンドがほかと一つ違うのは、 begのある行全体とendのある行全体が、 整列するリージョンになるということです。
sort-columnsはsortユーティリティー・プログラムを使うので、
タブ文字を含むテキストではうまくいきません。
整列を行なう前にM-x untabifyを使って、
タブをスペースに変換してください。
桁の関数は、文字の位置(バッファの先頭から文字を数える)と、 桁の位置(行頭から画面上の文字を数える)との変換を行ないます。
文字は画面上で占める桁の数にしたがって数えます。
つまり制御文字は、ctl-arrowの値によって2あるいは4桁を占め、
タブはtab-widthの値とタブの始まる桁によって
占める桁の数を数えます。See section 普通の表示方法。
桁数の計算ではウィンドウの幅と水平スクロールは無視します。 したがって、桁数はいくらでも大きくなり得ます。 最初(一番左)の桁は0です。
current-columnの使用例については、section テキスト行単位での移動
のcount-linesの解説をご覧ください。
もし桁columnが行末を越えてしまう場合、 ポイントを行の終りに位置づけます。 もしcolumnが負のときは、ポイントを行の先頭に位置づけます。
もしタブのように複数桁を占める文字の中に入ってしまい、
桁columnへ動かすことができないとき、
ポイントをその文字の終りに動かします。
しかし、forceが非nilでcolumnがタブの中にあるなら、
move-to-columnはタブをスペースに変えて、
ちょうどそのcolumnに動かすことができます。
複数桁を占めるほかの文字はわけるわけにいきませんから、
forceを指定しても変なことになってしまいます。
引数forceは、 行が桁columnより短いときにも効力があります。 この場合、行末の空白の追加を行ない桁を伸ばします。
columnが整数でないと、エラーを通知します。
返却値は、実際に移動した桁数です。
字下げの関数は行頭の空白を調べたり、 そこへ動いたり、変更したりするのに使います。 関数によっては、行の中にある空白ならどこでも変更できます。 桁と字下げは左端より0から数えます。
この節では、 字下げを数えたり挿入したりするのに使うプリミティブ関数について述べます。 次の節の関数は、これらのプリミティブを使っています。
nilのminimumが指定されると、
columnを越える場合も最低minimumだけスペースを開けます。
そうでないとき、ポイントがすでにcolumnの先にあるなら、
この関数は、何もしません。
値は、挿入した字下げの終わる桁です。
挿入する空白文字は、 まわりのテキスト(通常は先行するテキストだけ) からテキスト属性を継承します。See section テキスト属性の粘着性。
nilの場合、字下げはタブを挿入してもよいことになります。
そうでない場合、スペースだけ挿入します。
この変数が設定されると自動的に、カレント・バッファにたいしローカルになります。
各主モードの重要な機能は、 編集している言語にあわせて正しく字下げをするように TABキーをカスタマイズすることです。 この節ではTABキーのしくみとその制御方法について述べます。 この節の関数は、予期せぬ値を返します。
indent-according-to-modeは、この関数を呼び出すだけです。
Lispモードでの値はシンボルlisp-indent-lineです。
Cモードではc-indent-line、
Fortranモードではfortran-indent-lineです。
FundamentalモードやTextモード、
そして標準的な字下げのないほかの多くのモードでの値は、
デフォルト値のindent-to-left-marginです。
indent-line-functionの関数を、
呼び出します。
indent-line-functionの関数で現在の行の字下げを行ないます。
ただし、その関数がindent-to-left-marginだった場合、
代わりにinsert-tabを呼び出します
(これはタブ文字を挿入する簡単なコマンドです)。
字下げは現在のindent-line-functionを用いて行ないます。
プログラミング言語モードでは、これはTABと同じになります。
いくつかのTextモードではTABはタブを挿入しますが、
newline-and-indentは、
left-marginで指定した桁に字下げします。
このコマンドは、
indent-line-functionの現在の値を呼び出し、
現在の主モードにしたがって両方の行の字下げを行ないます。
プログラミング言語モードでは、これはTABと同じです。
いくつかのTextモードではTABはタブを挿入しますが、
reindent-then-newline-and-indentは、
left-marginで指定された桁に字下げします。
この節では、リージョンの各行の字下げを行なうコマンドについて述べます。 これらは予期せぬ値を返します。
nilならindent-regionは、
現在のモードの字下げの関数、
つまりindent-line-functionの値を呼び出して各行を字下げします。
もしto-columnが非nilなら、
これは字下げを行なう桁の数を指定する整数でなければなりません。
各行の空白を入れたり消したりしてちょうどこの桁になるように字下げします。
もし行詰め接頭辞があるとき、
indent-regionは各行が行詰め接頭辞で始まるようにして、
字下げを行ないます。
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を与えたときは、
別の意味になるので、
この変数は、使いません。
たとえば、 countが3なら、このコマンドは、 指定されたリージョンの始めの行から、3桁分の字下げを加えます。
Mailモードで、C-c C-y (mail-yank-original)は、
indent-rigidlyを使い、
返信するメッセージのテキストのコピーの字下げを行ないます。
indent-rigidlyに似ていますが、
文字列やコメントの行には変更をしません。
また、nochange-regexpが行頭と一致する場合も、
行の変更をしません
(もしnochange-regexpが非nilなら)。
この節では、 前の行の内容を基に現在の行の字下げを行なう二つのコマンドについて述べます。
前にある空白でない行が、次の字下げ点をもたない
(つまり十分大きい桁位置のない)場合、
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.
tにして、
indent-relativeを呼び出します。
これは予期せぬ値を返します。
もし前の空白行でない行が、現在の桁の先に字下げ点をもたないとき、 このコマンドは何もしません。
この節ではユーザが指定する「タブ・ストップ」のしくみと、 これを使ったり、設定したりするしくみについて説明します。 「タブ・ストップ」という言葉は、タイプライターのタブ・ストップの機能と、 この機能が似ているためにつきました。 この機能は次のタブ・ストップ桁になるまで、 適当な数のスペース文字やタブ文字を挿入して実現しています。 バッファの中のタブ文字の表示には影響しません (see section 普通の表示方法)。 入力としてのTAB文字は、 Textモードのような一部の主モードでだけ、 このタブ・ストップの機能を使います。
tab-stop-listで定義された、
次のタブ・ストップの桁までスペースかタブを挿入します。
現在の桁数よりも大きな要素をリストから検索し、
その要素がしめす桁まで字下げします。
このような要素がみつからなかったときは、何もしません。
tab-to-tab-stopsで用いられるタブ・ストップの桁のリストです。
要素は昇順の整数でなければなりません。
タブ・ストップの桁が等間隔である必要は、ありません。
タブ・ストップの位置を対話的に編集するにはM-x edit-tab-stopsを用います。
以下のコマンドはテキストの字下げをもとに動作するもので、 主に対話的に用います。
nilを返します。
nilを返します。
nilを返します。
ここで述べる大文字と小文字の変換を行なう関数は、 カレント・バッファのテキストに作用します。 文字列や文字に作用する変換コマンドについては、See section 大文字・小文字変換。 どの文字が大文字か、小文字か、 またそれらの変換をカスタマイズする方法についてはSee section 大文字小文字変換のカスタマイズ。
nilを返します。
リージョンの一端が語の中間にあるとき、 リージョンの内にある語の一部を語全体とみなします。
capitalize-regionが対話的に呼ばれた場合、
マークとポイントのうち小さい方からstartとendになります。
---------- 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 ----------
nilを返します。
downcase-regionが対話的に呼ばれた場合、
startとendは小さい方を先にしてマークとポイントになります。
nilを返します。
upcase-regionが対話的に呼ばれた場合、
startとendは小さい方を先にしてマークとポイントになります。
nilです。
もしポイントが語の中間にあるなら、 前に進む場合、ポイントの前の語の部分は無視します。 残りは語全体として扱います。
capitalize-wordが対話的に呼ばれた場合、
countは数値前置引数に設定されます。
nilです。
downcase-wordが対話的に呼ばれた場合、
countは数値前置引数に設定されます。
nilです。
upcase-wordが対話的に呼ばれた場合、
countは数値前置引数に設定されます。
バッファや文字列に位置する各文字は、 シンボルの属性リスト(see section 属性リスト)のような、 テキスト属性リスト(text property list)をもたせることができます。 属性は特定の場所にある特定の文字に、 たとえば、(英語の原文の)この文章の先頭にある文字`T'や、 `foo'の中の最初の`o'に、 属します。 違う場所に同じ文字がある場合、一般には異なる属性をもっています。
各属性には名前と値があります。 両方とも任意のLispオブジェクトでかまいませんが、 通常名前はシンボルです。 属性リストへの普通のアクセス方法は、 名前を指定しそれに対応する値を調べることです。
もし文字がcategoryという属性をもつとき、
これを文字の範疇(category)といいます。
これはシンボルでなければなりません。
シンボルの属性が文字の属性のデフォルト値となります。
文字列とバッファの間でテキストを複写しても、
文字の属性は保存されます。
これはsubstring、insert、
buffer-substringのようにテキストの一部分を取り扱う関数
(diverse functions)を含みます。
テキスト属性を調べるもっとも単純な方法は、
特定の文字の特定の属性の値を見ることです。
これにはget-text-propertyを使います。
文字の全属性リストを得るにはtext-properties-atを使います。
一度にいくつもの文字の属性を調べる関数についてはSee section 属性検索関数。
これらの関数は文字列とバッファの両方を扱います。 文字列の位置は0から始まるのにたいして、 バッファは1から始まることに気をつけてください。
もしprop属性がまったくなく、
文字がシンボルの範疇をもつとき、
get-text-propertyはシンボルのprop属性を返します。
get-text-propertyに似ていますが、
最初にオーバレイを調べてからテキスト属性を調べます。See section オーバレイ。
引数のobjectは文字列、バッファ、もしくはウィンドウです。 もしウィンドウならば、 ウィンドウが表示しているバッファのテキスト属性とオーバレイを使います。 もしobjectがバッファなら、 テキスト属性と同様にそのバッファの全オーバレイが対象になります。 文字列にはオーバレイがないので、 もしobjectが文字列ならテキスト属性だけが対象です。
nilなら、
カレント・バッファが対象です。
(setq default-text-properties '(foo 69))
;; 文字位置1には独自の属性のないようにする。
(set-text-properties 1 2 nil)
;; 得たものは聞いた時点でのデフォルト値。
(get-text-property 1 'foo)
=> 69
属性を変更するプリミティブは、
指定したテキストの範囲に適用します。
関数set-text-properties(この節の最後を参照)は、
範囲内のテキストの全属性リストを設定します。
普段は、
名前で指定したある特定の属性だけの追加、変更、消去が役に立ちます。
テキスト属性はバッファの内容の一部なので、 画面でのバッファの見え方に影響し、 テキスト属性の変更はバッファの修正とみなされます。 バッファのテキスト属性の変更は取り消しできます(see section 取り消し)。
nilなら、
カレント・バッファが対象です。
nilなら、
カレント・バッファが対象です。
引数propsは、どの属性を変更するかを指定します。 これは属性リスト(see section 属性リスト)の形式、 つまり属性の名前と対応する値が交互になっている要素をもつリストの形式を、 もたなければなりません。
関数が実際にある属性の値をかえたとき、
返却値はtです。
そうでなければ(propsがnilか、
値がテキストのそれと同じだったら)、
nilです。
たとえば、
テキストのある範囲のcommentとfaceという属性を変えるには、
こうします。
(add-text-properties start end
'(comment t face highlight))
nilなら、
カレント・バッファが対象です。
引数propsは、消去する属性を指定します。
これは属性リスト(see section 属性リスト)の形式、
つまり属性の名前と対応する値が交互になっている要素をもつリストの形式を、
もたなければなりません。
しかし、意味をもつのは、名前だけです。
名前に付随する値は無視されます。
たとえば、face属性を消去するには、こうします。
(remove-text-properties start end '(face nil))
関数が実際にある属性の値をかえたとき、
返却値はtです。
そうでなければ(propsがnilか、
指定したテキストにこれらの属性をもつ文字がまったくなかったら)、
nilです。
nilなら、
カレント・バッファが対象です。
引数propsは新しい属性リストです。 これは、 属性の名前と対応する値が交互になっている要素をもつリストでなければなりません。
set-text-propertiesから戻ると、
指定した範囲にあるすべての文字は、同じ属性をもちます。
もしpropsがnilなら、
指定した範囲のテキストからすべての属性を取り去ることになります。
例をあげます。
(set-text-properties start end nil)
属性は転記せずにバッファのテキストを転記する関数
buffer-substring-no-propertiesについてはSee section バッファ内容の調査。
テキスト属性の典型的な利用法では、 ほとんどの間、いくつかのあるいは多くの連続した文字が、 ある属性にたいし同じ値をとります。 文字を一つひとつ調べるプログラムを書くよりも、 同じ属性の値をもつテキストのかたまりを処理する方が速くなります。
こういうときに使える関数があります。
属性値の比較にはeqを使います。
いずれの場合も、objectのデフォルト値はカレント・バッファです。
効率を上げるため、 これらの関数、特に単一の属性を検索する関数で、 limit引数を使うことはとても大切です。 さもないと、 調べている属性が変化しないなら、 バッファの最後までスキャンするので長い時間がかかるからです。
位置は常に二つの文字の間にあることに注意してください。 この関数が返す値は、 異なる属性をもつ二つの文字の間の位置です。
もしlimitが非nilのとき、
スキャンは位置limitをもって中止します。
その場所までに属性の変更がないとき、
next-property-changeはlimitを返します。
limitがnilでobjectの最後まで属性が変らないときは、
nilを返します。
もし値が非nilなら、
posかそれより大きな値の位置です。
limitとposが等しいときにかぎり、
値は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)))
もしlimitが非nilならば、
スキャンは位置limitで終了します。
その場所までに属性の変更がないとき、
next-single-property-changeはlimitを返します。
属性がobjectの最後まで一定でlimitがnilならば、
値はnilです。
もし値が非nilなら、
posかそれより大きな値の位置です。
limitとposが等しいときにかぎり、
値はposになります。
next-property-changeに似ていますが、
posより順方向ではなく逆方向にスキャンを行ないます。
もし値が非nilなら、
posかそれより小さな値の位置です。
limitとposが等しいときにかぎり、
値はposになります。
next-single-property-changeに似ていますが、
posより順方向ではなく逆方向にスキャンを行ないます。
もし値が非nilなら、
posかそれより小さな値の位置です。
limitとposが等しいときにかぎり、
値はposになります。
nilの値を返します。
より正確にいうと、
そのような最初の文字の位置を返します。
ない場合は、nilを返します。
省略可能な5番目の引数objectは、 スキャンされる文字列もしくはバッファを指定します。 objectのデフォルト値は、カレント・バッファです。
位置はobjectから相対的なものになります。 objectのデフォルト値は、カレント・バッファです。
nilの値を返します。
より正確にいうと、
そのような最初の文字の位置を返します。
ない場合は、nilを返します。
省略可能な5番目の引数objectは、 スキャンされる文字列もしくはバッファを指定します。 位置はobjectから相対的なものになります。 objectのデフォルト値は、カレント・バッファです。
次の表は、組込みで特別な意味をもつテキスト属性の名前です。 次の節には、 行詰めの制御を行なうときに使われる特別な属性名のリストがあります。 これ以外の名前に標準の意味はないので、 好きなように使うことができます。
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属性のリストにある関数群が、
呼び出されます。
挿入されるテキストの最初と最後が、
引数としてこの関数群に渡されます。
バッファのテキストを修正したとき呼び出される
ほかのフックについてはsection 変更フックを参照してください。
point-entered
point-left
point-enteredとpoint-leftには、
ポイントの移動を報告するフック関数群を登録します。
ポイントが移動するたびに、
Emacsは以下の属性値との比較を行ないます。
point-left属性、
そして
point-entered属性。
nilでなければ)いずれも、
ポイントの以前の値と新しい値を引数にして呼び出されます。
同様の比較は新旧各位置の直前の文字についても行ないます。
結果として、
二つのpoint-left関数(両方が同じ場合もあります)と、
二つのpoint-entered関数(両方が同じ場合もあります)が、
実行されることになります。
いずれの場合も全point-left関数が呼び出されてから、
全point-entered関数が呼び出されます。
プリミティブ関数はポイントを動かさずに、
いろいろな位置の文字を調べることがあります。
ポイントの値の実際の変更だけが、
これらのフック関数を作動させます。
nilの場合、
point-leftとpoint-enteredフックは作動せず、
intangible属性の効果はなくなります。
以下のテキスト属性は、行詰めコマンドの振舞いに影響を与えます。 表示用に整形されたテキストに使います。section 行詰めとSee section 行詰めのマージン。
hard
use-hard-newlinesが非nilのときだけ有効です。
right-margin
left-margin
justification
自己挿入文字は通常、 先行する文字と同じ属性をとります。 これを属性の継承(inheritance)といいます。
Lispプログラムでは、
選択した挿入用プリミティブにしたがって、
継承つきや継承なしの挿入を行なうことができます。
insertのような通常のテキスト挿入関数は属性の継承を行ないません。
挿入する文字列と同一の属性だけを挿入し、ほかの属性ははいりません。
テキストをある文脈から別の文脈へ複写するプログラムのときにも、
このことは成立します。
これはたとえば、
killリングからのあるいはkillリングへの複写を行なう場合です。
継承つきの挿入を行なうには、
この節で説明する特殊なプリミティブを使います。
自己挿入文字はこれらのプリミティブを使っているので、
属性の継承を行ないます。
継承つき挿入を行なうときどの属性が継承されるかは、
二つの属性に依存します。
その属性とはfront-stickyとrear-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属性がリストのときは、
リストに名前が出ていない属性が後方粘着的になります。
継承つきでテキストを挿入するとき、 先行する文字の後方粘着的な属性と、 後続する文字の前方粘着的な属性を継承します。 両側で同じ属性が違う値のとき、 前の文字の属性が優先します。
以下の関数が属性の継承を行なうテキストの挿入関数です。
insertのように文字列stringsを挿入しますが、
隣のテキストから粘着的な属性を継承します。
insert-before-markersのように文字列stringsを挿入しますが、
隣のテキストから粘着的な属性を継承します。
テキスト属性をファイルの中に保存したり、 ファイルを挿入するときテキスト属性を復帰したりするには、 以下の二つのフックを使います。
write-regionが作動させるものです。See section ファイルへの書込み。
リスト中の各関数には二つの引数、 書き込むリージョンの最初と最後を渡します。 この関数は、バッファの内容を変えてはなりません。 またこれは、 バッファのテキストのほかにファイルに書き込む注釈を示すリストを、 返さなければなりません。
各関数は、
(position . string)の形をした要素のリストを、
返さなければなりません。
ここでpositionは整数で、
書き込むテキストからの相対位置を示し、
stringはそこに追加する注釈です。
この関数群のうちの一つから返される各リストは、
あらかじめpositionの昇順に整列されていなければなりません。
もし複数の関数があるとき、
write-regionはリストを破壊的に併合し、
一つの整列したリストにします。
write-regionが、
バッファからテキストを実際にファイルへ書き込むとき、
対応する位置にある指定した注釈を混ぜ合せます。
これらはバッファを修正することなく行なわれます。
insert-file-contentsがファイルの内容を挿入した後に呼び出す、
関数のリストを保持します。
この関数群は挿入したテキストをスキャンし対応するテキスト属性に変換します。
各関数は一つの引数、 挿入したテキストの長さを受け取ります。 テキストの始まりは、ポイントで示します。 この関数は、注釈のテキストをスキャン、消去し、 注釈が指定するテキスト属性を生成します。 ある関数の返した値は、次の関数への引数になります。
この関数群が戻るときは、 いつも挿入したテキストの先頭にポイントを置かなければなりません。
想定していたafter-insert-file-functionsの使い方は、
テキスト化した注釈を実際のテキスト属性に変換することです。
しかし、ほかの使い方をしてもかまいません。
私たちはユーザに、 ファイルにテキスト属性を格納したり検索したりするLispプログラムを、 このフックを使って書いていただきたい、 と思います。 そうすれば、いろいろなデータ形式を試して、 いいものを見つけることができます。 私たちはユーザに、 Emacsにインストールできる一般的でよい拡張をうみだしていただくことを、 希望します。
属性の名前やその値に任意のLispオブジェクトを扱うように試みることは、 提案していません。 なぜなら一般的なプログラムというものは多分書くのが難しく遅いからです。 その代わり、 適度に柔軟なデータ型を選んで符号化が難しくならないようにしてください。
これに関連する機能についてはSee section ファイル・フォーマットの変換。
あるエディタは、 テキストの「区間」をユーザに指定させてその区間に属性を付加して、 バッファのテキストに属性を付加することをサポートしています。 このようなエディタはユーザやプログラマに各区間の始めと終りを 決めることを許しています。 私たちは、テキストの修正にまつわるある逆説的な振舞いを避けるため、 Emacs Lispへ異なった種類のインタフェースを慎重に与えました。
もし区間への分割に意味があるならば、 ある属性のある一つの区間をもつバッファと、 同じテキストをもち同じ属性が二つの区間になっているバッファとを、 区別できるはずです。
一つだけの区間をもつバッファがあったとして、 テキストの一部分をkillしたとします。 バッファに残ったテキストは一つの区間で、 killリング(そしてundoリスト)中の複製は別の区間になります。 このときkillしたテキストをヤンクすると、 同じ属性をもつ二つ区間ができてしまいます。 したがって編集の上では、 一つの区間と二つの区間を区別することができないのです。
この問題を「修正」するのに、 テキストが挿入されたときに二つの区間を合体し ようとしたとしましょう。今度は、同じ属性をもつ二つの隣あった区間があると して、片方の区間のテキストをkillしヤンクして戻したとしてください。以前の 問題を解決したのと同一な区間の合体機能が、今度は問題になります。つまりヤン クすると、一つの区間になってしまうからです。繰り返しますが、編集の上で、 一つの区間と二つの区間の区別を保つことができないのです。
区間と区間の境界にテキストを挿入した場合も、満足できる解答のでない問題 をひき起こします。
しかしながら、「この文字の属性は何か?」という形の質問に一貫性をもって 振る舞う編集法を確立するのは、簡単です。そのため、私たちはこういう質問だ けに意味がある、とみなすことに決めました。どこで区間が始まりどこで区間が 終わるのか、という質問に答えるような実装を私たちはとっていません。
実際、たいていは陽な区間の境界の代わりに属性の検索関数を使うことができます。 可能ならばいつでも常に区間が合体すると仮定するならば、 これを区間の境界を見つけたのだ、 と考えることができます。See section 属性検索関数。
表現上の機能としてはEmacsには陽な区間もあります。See section オーバレイ。
以下の関数は指定したリージョンの文字を文字コードにしたがって置換します。
もし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 ----------
変換テーブルtableは文字列です。
(aref tableochar)が、
ocharに対応する変換後の文字になります。
もしtableの長さが256以下なら、
tableの長さより大きな符号の文字は変換によって変化しません。
translate-regionの返却値は、
実際に変換で変更された文字の数です。
変換テーブルで自分自身に射像した文字は、
含みません。
レジスタは、Emacsの編集中に、マーカ、文字列、長方形、 (一つのフレームの)ウィンドウ構成、 (全フレームの)フレーム構成を保管できる変数の一種です。 各レジスタには、単一文字の名前がついています。 (C-gを例外にして)制御文字とメタ文字を含んだすべての文字は、 レジスタ名に使用できます。 したがって255個のレジスタが有り得ます。 Emacs Lispではレジスタをその名前の文字で指し示します。
この節の関数は、特に明記しないかぎり予期せぬ値を返します。
(name . contents)の形をしたalistです。
通常は、使用中の各Emacsレジスタに一つの要素があります。
オブジェクトnameはレジスタを識別する文字(整数)です。 オブジェクトcontentsは、文字列かマーカかリストで、 レジスタの内容を示します。 文字列はレジスタに格納したテキストを示します。 マーカは位置を示します。 リストは長方形を示します。 その要素は長方形の1行あたり一つの文字列です。
nilを返します。
通常、このコマンドは挿入したテキストの前にポイントを、
後にマークを置きます。
しかしながら、
もし省略可能な第2引数beforepが非nilのときは、
マークを前に、ポイントを後に置きます。
前置引数を与えれば、
対話的にこの関数に非nilを第2引数beforepに指定することができます。
レジスタに長方形が入っていたとき、 ポイントを左上にして長方形を挿入します。 これは、現在の行とその下の行にテキストを挿入するということです。
レジスタに、 保存したテキスト(文字列)でも長方形(リスト)でもないものが入っていたとき、 今のところ、役に立たないことがおきます。 これは将来修正されるでしょう。
交換コマンドは次のサブルーチンを使います。
通常、
transpose-regionsは交換するテキストといっしょにマーカも再配置します。
交換した二つの部分の内の片方に入っていたマーカが、
その部分といっしょに動きます。
したがって新しい部分においても文字と文字の間の位置関係は変りません。
しかしながら、もしleave-markersが非nilならば、
transpose-regionsはマーカの移動をしません。
以下のフック変数は、すべてのバッファ (これをバッファローカルにすれば、ある特定のバッファ)におけるすべての変更に 着目するときに使います。 テキストの特定の位置の変更を検出するにはsection 特殊な意味をもつ属性を参照してください。
このフックを使う関数は、 正規表現を使う操作を行なったとき一致データの保存と復帰をしなければなりません。 そうしないと一致データを使う編集が悪影響を受けてしまいます。
nil)。
これはbefore-change-functionsの中の関数のように呼び出されます。
nil)。
これはafter-change-functionsの中の関数のように呼び出されます。
上の四つの変数は、いずれかの関数が作動している間は一時的に、
nilに束縛されます。
そのためこれらの関数の一つがバッファを変更しても、
この関数群を作動させることはありません。
これらの関数を作動させるような変更を行なうフック関数が必要なときは、
この変数群を通常の値に束縛してください。
この見込み機能による不便な結果は、
after-change-functionsやbefore-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)
Go to the first, previous, next, last section, table of contents.