検索エンジンから来た人に注意このマニュアルは、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.