[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] |
本章では、バッファ内のテキストを扱う関数について述べます。 それらのほとんどは、カレントバッファ内のテキストを 調べたり挿入したり削除しますが、しばしばポイント付近で行います。 多くは対話的に使えます。 テキストを変更するすべての関数は、変更を取り消せます(see 節 31.9 アンドゥ)。
テキスト関連の多くの関数は、startとendという名前の引数で渡された 2つのバッファ内位置で定義されるテキストの領域に作用します。 これらの引数は、マーカ(see 節 30. マーカ)であるか 文字の位置を表す数値(see 節 29. バッファ内の位置)である必要があります。 これらの引数の順番は関係なく、startが領域の終了位置で endが開始位置であってもまったく問題ありません。 たとえば、(delete-region 1 10)
と(delete-region 10 1)
は同値です。 startやendがバッファの参照可能部分の外側にあると エラーargs-out-of-range
を通知します。 対話的な呼び出しでは、ポイントとマークをこれらの引数として使います。
本章では、バッファ内の文字を(関係あるときには) それらのテキスト属性を含めて『テキスト』と呼びます。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] |
多くの関数は、ポイント付近の文字を調べるためのものです。 ここでは、数個の単純な関数について述べます。 33.3 正規表現の探索のlooking-at
も参照してください。
nil
である。 positionのデフォルトはポイントである。
つぎの例では、バッファの最初の文字は`@'であると仮定する。
(char-to-string (char-after 1)) => "@" |
nil
である。 positionのデフォルトはポイントである。(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
を返す。 ナロイングしていると、これはバッファの参照可能部分の先頭を意味する。 29.1 ポイントのpoint-min
も参照。t
を返す。 ナロイングしていると、これはバッファの参照可能部分の末尾を意味する。 29.1 ポイントのpoint-max
も参照。t
を返す。 see 節 29.2.4 テキスト行単位の移動。 バッファ(あるいはその参照可能部分)の先頭は、 つねに行頭とみなす。t
を返す。 see 節 29.2.4 テキスト行単位の移動。 バッファ(あるいはその参照可能部分)の末尾は、 つねに行末とみなす。[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] |
本節では、Lispプログラムでバッファ内の任意の部分のテキストを文字列に変換する ための2つの関数について述べます。
buffer-substring
はエラーargs-out-of-range
を通知する。
startがendより小さい必要はなく、引数の順番はどちらでもよい。 しかし、ほとんどの場合、小さい引数を先に書く。
コピーされるテキストにテキスト属性がある場合、 テキスト属性もそれが属する文字とともに文字列へコピーされる。 see 節 31.19 テキスト属性。 しかし、バッファのオーバレイ(see 節 37.8 オーバレイ)とそれらの属性は 無視されコピーされない。
---------- 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 節 31.19 テキスト属性。
(buffer-substring (point-min) (point-max)) |
---------- Buffer: foo ---------- This is the contents of buffer foo ---------- Buffer: foo ---------- (buffer-string) => "This is the contents of buffer foo " |
引数thingは、構文上の要素の種類を指定するシンボルである。 可能な値は、symbol
、list
、sexp
、 defun
、filename
、url
、word
、sentence
、 whitespace
、line
、page
などである。
---------- Buffer: foo ---------- Gentlemen may cry ``Pea-!-ce! Peace!,'' but there is no peace. ---------- Buffer: foo ---------- (thing-at-point 'word) => "Peace" (thing-at-point 'line) => "Gentlemen may cry ``Peace! Peace!,''\n" (thing-at-point 'whitespace) => nil |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] |
この関数により、バッファ内のテキストの部分同士を 文字列にコピーせずに比較できます。
nil
を指定できる。
始めの文字列のほうが小さければ値は負であり、 始めのほうが大きければ値は正であり、等しければ0である。 結果の絶対値は、部分文字列の中で最初に異なる文字の添字足す1である。
この関数は、case-fold-search
がnil
以外であると、 文字の比較では大文字小文字を区別しない。 テキスト属性はつねに無視する。
カレントバッファにはテキスト`foobarbar haha!rara!'があるとする。 すると、この例の2つの部分文字列は`rbar 'と`rara!'である。 2番目の文字で最初の文字列のほうが大きいので、結果は2である。
(compare-buffer-substring nil 6 11 nil 16 21) => 2 |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] |
挿入(insertion)とは、バッファに新たなテキストを追加することです。 挿入されたテキストはポイント位置に、つまり、 ポイントのまえの文字とポイントのあとの文字のあいだに入ります。 挿入されたテキストのまえにポイントを留める関数もあれば、 そのうしろに留める関数もあります。 前者をポイントのうしろへ挿入と呼び、 後者をポイントのまえへ挿入と呼びます。
挿入により、挿入箇所よりうしろの位置を指すマーカは再配置されて 同じ周りの文字に留まります(see 節 30. マーカ)。 マーカが挿入箇所を指している場合には、 マーカの挿入型(see 節 30.5 マーカの挿入型)に依存して、 挿入するとマーカが再配置されたりされなかったりします。 insert-before-markers
などの特定の特殊な関数は、 マーカの挿入型に関わらず、 挿入されたテキストのうしろを指すように そのようなすべてのマーカを再配置します。
カレントバッファが読み出し専用であると、挿入関数はエラーを通知します。
これらの関数は、テキストの文字群をそれらの属性とともに 文字列からバッファへコピーします。 挿入された文字群は、コピーされるまえとまったく同じ属性を持ちます。 対照的に、文字列やバッファの一部ではない孤立した引数として 指定された文字群は、周りのテキストからテキスト属性を継承します。
挿入関数は、文字列由来やバッファ由来のテキストの場合には、 マルチバイトバッファへ挿入するために ユニバイトからマルチバイトへテキストを変換し、逆向きの変換も行います。 しかし、カレントバッファがたとえマルチバイトバッファであっても、 128から255のユニバイト文字コードはマルチバイト文字には変換しません。 See 節 32.2 テキスト表現の変換。
nil
である。nil
である。
挿入箇所を指していたマーカを挿入されたテキストのうしろを指すように再配置 する点で、この関数は他の挿入関数と異なる。 挿入箇所でオーバレイが始まるときには、 挿入されたテキストはオーバレイの範囲外に出る。 空でないオーバレイが挿入箇所で終るときには、 挿入されたテキストはオーバレイの範囲内に入る。
nil
は1を意味する)であり、 characterは文字であること。 値はnil
である。
この関数は、カレントバッファがたとえマルチバイトバッファであっても、 128から255のユニバイト文字コードはマルチバイト文字には変換しない。 see 節 32.2 テキスト表現の変換。
inheritがnil
以外であると、挿入された文字は、 挿入箇所の前後の2つの文字からスティッキテキスト属性を継承する。
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 節 31.19.6 テキスト属性のスティッキ性。 字下げ関数が挿入した白文字もテキスト属性を継承します。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] |
本節では、テキストを挿入する上位レベルのコマンドについて述べます。 これらはLispプログラムでも有用ですが主にユーザー向けのコマンドです。
nil
である。nil
を返す。 ほとんどの印字文字はこのコマンドにバインドされている。 普通の状況では、self-insert-command
は Emacsにおいてもっとも頻繁に呼び出される関数であるが、 プログラムではキーマップに登録する以外にはほとんど使わない。
対話的に呼ばれると、countは数値前置引数である。
このコマンドは、挿入した文字が空白や改行であると、 auto-fill-function
がnil
以外であると auto-fill-function
を呼び出す (see 節 31.14 自動詰め込み(auto-filling)モード)。
このコマンドは、略語(abbrev)モードがオンであり、かつ、 挿入した文字が単語構成構文でないと、略語展開を行う。 (35. 略語と略語の展開 (2003/10/30)とsee 節 34.2.1 構文クラス一覧。)
挿入した文字が閉じ括弧構文であるときに blink-paren-function
を呼び出す責任も持つ (see 節 37.11 括弧を点滅する)。
この関数は、現在のコラム番号がfill-column
の値よりも大きく number-of-newlinesがnil
であると auto-fill-function
を呼び出す。 auto-fill-function
の典型的な仕事は改行を挿入することである。 ここでの全体としての効果は、改行を2つの異なる位置、つまり、 ポイント位置と行のまえの箇所に挿入することである。 newline
は、number-of-newlinesがnil
以外であると 自動詰め込みを行わない。
このコマンドは、左端の余白が0以外であるとその分だけ字下げする。 see 節 31.12 詰め込みのための余白。
戻り値はnil
である。 対話的に呼ばれると、countは数値前置引数である。
indent-to
を用いて、降ろした行の先頭に必要に応じて白文字を挿入する。
プログラムではまったくこの関数を使わない。
overwrite-mode-textual
、overwrite-mode-binary
、 nil
のいずれかであること。 overwrite-mode-textual
は、テキストの上書きモード (改行とタブを特別に扱う)を指定し、 overwrite-mode-binary
は、バイナリの上書きモード (改行やタブも他の文字と同様に扱う)を指定する。[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] |
削除とは、バッファ内のテキストのある部分をキルリング (see 節 31.8 キルリング)に保存せずに取りさることです。 削除したテキストはヤンクはできませんが、 アンドゥ機構(see 節 31.9 アンドゥ)を使って再度挿入できます。 特別な場合にはキルリングにテキストを保存する削除関数もあります。
すべての削除関数はカレントバッファに作用し、nil
の値を返します。
buffer-read-only
を通知する。 さもなければ、いっさい確認を取らずにテキストを削除する。 nil
を返す。
バッファから多量のテキストを削除すると、通常、 『バッファが縮小した』としてそのバッファの自動保存を禁止する。 しかし、erase-buffer
はこうしない。 これまでのテキストと将来のテキストには関連がなく、 これまでのテキストのサイズと比較すべきでないと考えるからである。
nil
である。 削除された領域の内側にポイントがあると、 その値は削除後にはstartになる。 さもなければ、マーカと同様にポイントは 周りのテキストに留まるように再配置される。nil
以外であると、 削除した文字をキルリングに保存する。
対話的に呼ばれると、countは数値前置引数であり、 killpは未処理の前置引数である。 つまり、前置引数を指定すると、テキストをキルリングに保存する。 前置引数を指定しないと1文字だけを削除するが、 キルリングには保存しない。
戻り値はつねにnil
である。
nil
以外であると、 削除した文字をキルリングに保存する。
対話的に呼ばれると、countは数値前置引数であり、 killpは未処理の前置引数である。 つまり、前置引数を指定すると、テキストをキルリングに保存する。 前置引数を指定しないと1文字だけを削除するが、 キルリングには保存しない。
戻り値はつねにnil
である。
nil
以外であると、このコマンドは 削除した文字をキルリングに保存する。
countが正である場合に限って、タブを空白に変換する。 countが負であると、ポイントのうしろのちょうど -count個の文字を削除する。
対話的に呼ばれると、countは数値前置引数であり、 killpは未処理の前置引数である。 つまり、前置引数を指定すると、テキストをキルリングに保存する。 前置引数を指定しないと1文字だけを削除するが、 キルリングには保存しない。
戻り値はつねにnil
である。
backward-delete-char-untabify
での 白文字の扱い方を指定する。 可能な値は、タブを空白に変換してから空白を削除することを意味する デフォルトのuntabify
、 1回の呼び出しでポイントのまえにある白文字をすべて削除することを意味する hungry
、 白文字に対して特別なことをしないことを意味するnil
である。[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] |
本節では、テキストを削除する上位レベルのコマンドについて述べます。 これらはLispプログラムでも有用ですが主にユーザー向けのコマンドです。
nil
を返す。
つぎの例では、毎回ポイントを2番目と3番目の文字のあいだに置いて、 各行につき1回ずつdelete-horizontal-space
を計4回呼び出す。
---------- Buffer: foo ---------- I -!-thought I -!- thought We-!- thought Yo-!-u thought ---------- Buffer: foo ---------- (delete-horizontal-space) ; Four times. => nil ---------- Buffer: foo ---------- Ithought Ithought Wethought You thought ---------- Buffer: foo ---------- |
nil
以外であると、 delete-indentation
は、この行を後続の行に連結する。 関数はnil
を返す。
詰め込み接頭辞があり、かつ、連結対象の2番目の行が その接頭辞で始まっている場合には、 delete-indentation
は連結するまえに詰め込み接頭辞を削除する。 see 節 31.12 詰め込みのための余白。
以下の例では、ポイントは`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-whitespace
には、 連結箇所に空白を置くかどうかを決定する責任がある。
nil
を返す。
行の先頭や末尾では、空白の適切な量は0である。 閉じ括弧構文の文字のまえや、 開き括弧構文や式前置子構文の文字のうしろでも空白はないほうが適している。 それ以外では、空白1個が適している。 see 節 34.2.1 構文クラス一覧。
以下の例では、最初の行の単語`spaces'のまえにポイントがあるときに 最初にfixup-whitespace
が呼ばれる。 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
を返す。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] |
キル関数は削除関数のようにテキストを削除しますが、 ユーザーがヤンク(yank)で再度挿入できるように保存します。 これらの関数の多くは、その名前に`kill-'があります。 対照的に、`delete-'で始まる名前の関数は、 ヤンクできるようにテキストを保存しません(アンドゥはできる)。 それらは『削除』関数です。
キルコマンドの多くは主に対話的に使うものであり、 ここではそれらについては述べません。 ここで述べるのは、そのようなコマンドを書くために使う関数についてです。 これらの関数は読者がテキストをキルするコマンドを書くために使えます。 Lisp関数において内部目的のためにテキストを削除する必要があるときには、 キルリングの内容を乱さないように普通は削除関数を用いるべきです。 See 節 31.6 テキストの削除。
キルしたテキストはあとでヤンクできるように キルリング(kill ring)に保存されます。 これは、最後にキルしたテキストだけでなく、 最近キルしたものを多数保持するリストです。 これを『リング』と呼ぶのは、 要素が循環しているようにヤンクが扱うからです。 このリストは変数kill-ring
に保持されていて、 リスト向けの通常の関数で操作できますが、 本節で述べるように、それをリングとして扱う特別な関数もあります。
単語『キル』の使い方が不適当だと考える人々がいます。 『キル』したものを特に破壊しない操作を表すために使っているからです。 日常生活に照らしてみると、死は恒久的であり『キル』したものが 生き返ることはありません。 したがって、別の隠喩も提案されています。 たとえば、原稿を鋏で切り貼りすることに慣れていた前計算機世代の人々には 『カットリング』のほうが意味が通じるでしょう。 しかし、いまさら用語を変更するのは困難です。
31.8.1 キルリングの概念 What text looks like in the kill ring. 31.8.2 キル向けの関数 Functions that kill text. 31.8.3 ヤンク向けの関数 Commands that access the kill ring. 31.8.4 下位レベルのキルリング Functions and variables for kill ring access. 31.8.5 キルリングの内部 Variables that hold kill-ring data.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] |
キルリングは、もっとも最近にキルされたものを先頭にして、 キルされたテキストを文字列としてリストに記録します。 たとえば、短いキルリングはつぎのようになります。
("some text" "a different piece of text" "even older text") |
リストの長さがkill-ring-max
に達すると、 新たな項目を追加すると自動的に最後の項目を削除します。
キルコマンドが他のコマンドと混在する場合、 各キルコマンドはキルリングに新たな項目を追加します。 連続した複数のキルコマンドは、キルリングに1つの項目を作りあげ、 それを1個としてヤンクできます。 2番目以降の連続したキルコマンドは、最初のキルコマンドが作った 項目にテキストを追加していきます。
ヤンクでは、キルリングの1つの項目をリングの『先頭』として区別します。 リングの別の項目を『先頭』と指定することでリングを『回転』する コマンドもあります。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] |
kill-region
は、テキストをキルするための普通のサブルーティンです。 この関数を呼び出す任意のコマンドは『キルコマンド』です (その名前には`kill'があるはず)。 kill-region
は、新たにキルされたテキストを キルリングの先頭に新たな項目として追加したり、 もっとも最近の項目に加えます。 まえのコマンドがキルコマンドであるかどうかを (last-command
を使って)自動的に判定し、 もしそうならば、キルされたテキストをもっとも最近の項目に加えます。
nil
である。
対話的に呼ばれると、startとendはポイントとマークである。
バッファが読み出し専用であると、 kill-region
はキルリングを同様に変更するが、 バッファを変更せずにエラーを通知する。 読み出し専用バッファからキルリングへテキストをコピーするために、 ユーザーはすべてのキルコマンドを使えるのでこれは便利である。
nil
以外であると、 kill-region
は、バッファが読み出し専用であってもエラーとしない。 そのかわりに、キルリングを更新しバッファは変更せずに戻る。nil
を返す。 また、カーソルを一時的に移動してコピーしたテキストの範囲を示すか、 あるいは、エコー領域にメッセージを表示する。
このコマンドはthis-command
にkill-region
を設定しないので、 これ以降のキルコマンドはキルリングの同じ項目には加えない。
Emacs 18版でも使うつもりがない限り、 Lispプログラムからはcopy-region-as-kill
を呼ばないこと。 Emacsの新しい版では、そのかわりにkill-new
やkill-append
を 使うほうがよい。 see 節 31.8.4 下位レベルのキルリング。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] |
ヤンク(yank)とは、キルリングからまえにキルされたテキストの項目を 再度挿入することです。
argがリスト(対話的な呼び出しではユーザーが数字文字なしに C-uを打ったとき)であると、yank
は上に述べたように テキストを挿入するが、ヤンクしたテキストの先頭にポイントを 末尾にマークを置く。
argが数であると、yank
はarg番目のもっとも最近に キルされたテキスト、つまり、キルリングリストのarg番目の項目を 挿入する。
yank
はキルリングの内容を変更したり回転しない。 nil
を返す。
これはyank
や別のyank-pop
の直後でのみ許される。 そのような場合、リージョンにはヤンクしたばかりのテキストが含まれる。 yank-pop
はそのテキストを削除し、 その位置にキルされた別のテキストを挿入する。 削除したテキストはすでにキルリングのどこかにあるので、 キルリングには追加しない。
argがnil
であると、キルリングの古い項目で置き換える。 argが数であると、arg番古いキルで置き換える。 argが負であると、より最近のキルで置き換える。
キルリング内でのキルの順番は、 最古のもののつぎに最新のものがあり、 最新のもののまえに最古のものがあるように折り返されている。
戻り値はつねにnil
である。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] |
これらの関数と変数は、下位レベルでキルリングを参照するためのものですが、 Lispプログラムで使っても便利です。 これらはウィンドウシステムのセレクション(see 節 28.18 ウィンドウシステムのセレクション) との相互作用の面倒をみてくれるからです。
current-kill
は、キルリングの『先頭』として区別する ヤンクポインタを(新しいキルから古いキルへ向けて)n個分回転し、 リングのその位置のテキストを返す。
省略可能な第2引数do-not-moveがnil
以外であると、 current-kill
は、ヤンクポインタは変更せずに、 現在のヤンクポインタから数えてn番目のキルを返す。
nが0であると、もっとも最近のキルを要求することを表し、 current-kill
は、キルリングを調べるまえに (以下に述べる)interprogram-paste-function
の値を呼び出す。
interprogram-cut-function
(下記参照)の値も起動する。nil
以外であるとその項目の先頭に加わる。 この関数は、interprogram-cut-function
(下記参照)の値も起動する。nil
であるか、引数なしの関数であること。
値が関数であると、 『もっとも最近のキル』を得るためにcurrent-kill
が呼び出す。 関数がnil
以外の値を返すと、 その値は『もっとも最近のキル』として使われる。 nil
を返せば、kill-ring
の先頭項目が使われる。
このフックの普通の用途は、 セレクションが別のアプリケーションに属する場合であっても、 ウィンドウシステムの一次セレクションを もっとも最近のキルとして得ることである。 see 節 28.18 ウィンドウシステムのセレクション。
nil
であるか、引数なしの関数であること。
値が関数であると、kill-new
とkill-append
が キルリングの新たな先頭項目を引数として呼び出す。
このフックの普通の用途は、 新たにキルされたテキストを ウィンドウシステムの一次セレクションにすることである。 see 節 28.18 ウィンドウシステムのセレクション。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] |
変数kill-ring
は、文字列のリストの形でキルリングの内容を保持します。 もっとも最近のキルがつねにリストの先頭にあります。
変数kill-ring-yank-pointer
は、 CARがつぎにヤンクすべきテキストであるような キルリングリストの項目を指しています。 この変数がリングの『先頭』を識別するといいます。 kill-ring-yank-pointer
を別の項目へ動かすことを キルリングを回転すると呼びます。 ヤンクポインタを動かす関数は、 リストの末尾からリストの先頭へ折り返しその逆も行うので、 キルリングを『リング』と呼ぶのです。 リングの回転は仮想的なものであり、 kill-ring
の値は変更しません。
kill-ring
もkill-ring-yank-pointer
もLisp変数であり、 それらの値は普通のリストです。 kill-ring-yank-pointer
の名前の単語『ポインタ』は、 つぎのヤンクコマンドで使うリストの項目を識別することが 変数の目的であることを表します。
kill-ring-yank-pointer
の値は、キルリングリストの 1つの項目とつねにeq
です。 これが識別する項目は、その項目のCARです。 キルリングを変更するキルコマンドも、 kill-ring
の値をこの変数の値とします。 その効果は、新たにキルされたテキストが先頭にくるように リングを回転することです。
キルリング("some text" "a different piece of text" "yet older text")
の 第2項目を変数kill-ring-yank-pointer
が指しているようすをつぎに示します。
kill-ring ---- kill-ring-yank-pointer | | | v | --- --- --- --- --- --- --> | | |------> | | |--> | | |--> nil --- --- --- --- --- --- | | | | | | | | -->"yet older text" | | | --> "a different piece of text" | --> "some text" |
C-y(yank
)の直後にM-y(yank-pop
)を使うと この状態になります。
kill-ring
のリストの一部であり、 そのCARはC-yがヤンクするキルされた文字列である。kill-ring-max
のデフォルト値は30である。[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] |
ほとんどのバッファには、バッファのテキストに対する変更をアンドゥ(もとに戻す) できるようにすべての変更を記録する アンドゥリスト(undo list)があります。 (アンドゥリストのないバッファは、 Emacsがアンドゥは有用ではないと仮定する特殊目的のバッファである。) バッファのテキストを変更するすべての基本関数は、 変数buffer-undo-list
に収めたアンドゥリストの先頭に 自動的に要素を追加します。
t
はアンドゥ情報の記録を禁止する。アンドゥリストの要素として可能なものをつぎに示します。
position
(beg . end)
(text . position)
(abs position)
である。
(t high . low)
primitive-undo
はこれらの値を用いて、 バッファを再度未変更と印を付けるかどうか判定する。 ファイルの更新時刻がこれに一致するときにのみ再度未変更とする。
(nil property value beg . end)
(put-text-property beg end property value) |
(marker . adjustment)
nil
nil
を返す。
エディタコマンドループは、 各キー列を実行するまえにアンドゥの境界を自動的に作る。 したがって、各アンドゥは、1つのコマンドの効果を普通は取り消す。 自己挿入の入力文字は例外である。 コマンドループはそのような最初の文字に境界を作り、 つぎの19個の連続する自己挿入の入力文字では境界を作らず、 20番目で境界を作るということを自己挿入の入力文字が続く限り行う。
別のバッファでアンドゥ可能な変更を行うたびに バッファのすべての変更で境界を追加する。 これは、各コマンドが変更した箇所で各バッファに境界を作ることを 保証するためである。
1つのコマンドの効果を複数に分けるためにこの関数を直接呼ぶことは有用である。 たとえば、query-replace
は各置換のあとでundo-boundary
を呼び出し、 ユーザーが個々の置換を1つ1つアンドゥできるようにする。
primitive-undo
は、バッファを変更すると バッファのアンドゥリストに要素を追加する。 アンドゥコマンドは一連のアンドゥ操作を始めるときに アンドゥリストを保存して混乱を避ける。 アンドゥ操作では、保存しておいた値を使い更新する。 アンドゥによって追加される新たな要素はこの保存された値の一部ではないので、 それらはアンドゥを続行しても干渉しない。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] |
本節では、指定されたバッファでアンドゥ情報の記録をオン/オフする 方法について述べます。 また、アンドゥリストが大きくなりすぎないように 自動的に切り詰める方法についても説明します。
新たに作成されたバッファのアンドゥ情報の記録は普通は始めオンですが、 バッファ名が空白で始まる場合は最初からオフです。 つぎの2つの関数を使うか、読者自身がbuffer-undo-list
に設定すれば、 アンドゥ記録を明示的にオン/オフできます。
nil
を返す。
対話的に呼ばれると、buffer-or-nameはカレントバッファである。 他のバッファを指定できない。
この関数はnil
を返す。
名前buffer-flush-undo
は廃れているとはみなさないが、 好ましい名前はbuffer-disable-undo
である。
編集を続けるにしたがってアンドゥリストはどんどん長くなります。 これらがメモリを使い尽くさないように、 読者が設定した上限サイズにガベッジコレクションが切り詰めます。 (この目的においてアンドゥリストの『サイズ』は、 リストを構成するコンスセルの個数と削除された文字列の和である。) 2つの変数undo-limit
とundo-strong-limit
は、 許容できるサイズの範囲を制御します。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] |
詰め込み(fill)とは、指定されている最大幅 (を越えず)にほぼ収まるように(行分け位置を移動して) 行の長さを調整することです。 さらに、行を幅揃え(justify)することもできます。 つまり、左右の両端や片側の余白をきちんと揃えるため 空白を挿入することです。 幅は変数fill-column
で制御します。 読みやすいように、行は70コラム程度に収めるべきです。
テキストを挿入するにつれて自動的にテキストを詰め込むには、 自動詰め込み(auto-fill)モード(see 節 31.14 自動詰め込み(auto-filling)モード)を使いますが、 既存のテキストを変更しても正しくない詰め込み状態のまま放置されます。 したがって、そのようなテキストは明示的に詰め込む必要があります。
本節のほとんどの関数が返す値には意味はありません。 詰め込みを行うすべての関数は、現在の左端余白、現在の右端余白、 現在の幅揃えスタイルに注意をはらいます(see 節 31.12 詰め込みのための余白)。 現在の幅揃えスタイルがnone
であると、 詰め込み関数は実際にはなにもしません。
詰め込み関数には引数justifyを取るものもあります。 それがnil
以外であると、幅揃えの種類を指示します。 特定の幅揃えスタイルを指示するものは、 left
、right
、full
、center
です。 それがt
であると、 テキストの当該部分には現在の幅揃えスタイルを用いることを意味します (下記のcurrent-justification
を参照)。 これ以外の値はfull
として扱います。
対話的に詰め込み関数を呼ぶときに前置引数を使うと、 justifyとして値full
を暗に指示します。
nil
以外であると、各行の幅揃えも行う。 段落の境界を探すために普通の段落移動コマンドを用いる。 see GNU Emacs マニュアル。nil
以外であれば、幅揃えも行う。
nosqueezeがnil
以外であると、 行分け以外の白文字にはふれないことを意味する。 to-eopがnil
以外であると、 段落の末尾まで、あるいは、 use-hard-newlines
がオンならばつぎのハード改行(下記参照)までを 詰め込むことを意味する。
変数paragraph-separate
は、段落の区別方法を制御する。 see 節 33.8 編集に用いられる標準的な正規表現。
最初の2つの引数startとendは、 詰め込むべき範囲の先頭と末尾である。 3番目と4番目の引数、justifyとmail-flagは省略できる。 justifyがnil
以外であると、 段落の詰め込みに加えて幅揃えも行う。 mail-flagがnil
以外であると、 メイルメッセージなのでヘッダ行を詰め込まないことを意味する。
通常、fill-individual-paragraphs
は、 字下げが変わると新しい段落の開始とみなす。 fill-individual-varying-indent
がnil
以外であると、 区切り行のみが段落を区切るとみなす。 これは段落の先頭行と後続の行で字下げが異なる段落を処理できる。
fill-individual-paragraphs
の動作を変える。nil
以外であると幅揃えも行う。
対話的な呼び出しでは、前置引数で幅揃えを指示する。
nosqueezeがnil
以外であると、 行分け以外の白文字にはふれないことを意味する。 squeeze-afterがnil
以外であると、 それは領域内の位置を表し、 その位置よりまえにある空白を変更しないように指示する。
適応型詰め込み(adaptive-fill)モードでは、 デフォルトの詰め込み接頭辞を選ぶために このコマンドはfill-context-prefix
を呼び出す。 see 節 31.13 適応型詰め込み(adaptive-fill)モード。
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
以外であると、 直後に1つの空白を従えたピリオドを文末とみなさず、 詰め込み関数はそのような箇所で行分けしない。nil
以外であると、 fill-paragraph
は詰め込み処理のためにこの関数を呼び出す。 関数がnil
以外の値を返すと、 fill-paragraph
は処理が完了したとみなして戻り値をただちに返す。
この機能の普通の用途は、 プログラム言語向けのモードでコメントを詰め込むためである。 この関数で普通の方法で詰め込む必要がある場合には、つぎのようにする。
(let ((fill-paragraph-function nil)) (fill-paragraph arg)) |
nil
以外であると、 詰め込み関数は、テキスト属性hard
を持つ改行を削除しない。 これらの『ハード改行』は段落の区切りとして働く。[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] |
左端余白がある場合には、左端余白のあとに詰め込み接頭辞が続く。
特に他人のために書いているテキストでは、 fill-column
を70未満にするべきである。 さもないと、人によっては快適に読むには行が長すぎて、 テキストが不恰好に見える。
fill-column
の値を設定していない場合の 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
の値で指定した位置から 現在行が始まるように字下げを調整することである。 それには白文字の挿入や削除が伴う。nil
以外を返すと、当該箇所では行分けしない。[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] |
適応型詰め込みモード(adaptive-fill)では、 詰め込むべき各段落のテキストから自動的に詰め込み接頭辞を選びます。
nil
以外であると、 適応型詰め込みモード(adaptive-fill)がオンである。 デフォルトではt
である。comment-start-skip
に一致すると、その候補を使う。 さもなければ、同じ幅に相当する白文字をかわりに使う。
1行だけの段落から選んだ詰め込み接頭辞が後続の行の段落の始まりである場合には、 1行だけの段落からはけっして詰め込み接頭辞を選ばない。
adaptive-fill-regexp
の一致に失敗したときに、 行の左端余白のうしろにポイントを置いて呼び出され、 当該行に基づいて適切な詰め込み接頭辞を返すこと。 それがnil
を返すと、当該行には詰め込み接頭辞がないことを意味する。[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] |
自動詰め込み(auto-filling)モードは、テキストを挿入するにつれて 自動的に行を詰め込むマイナモードです。 本節では、自動詰め込み(auto-filling)モードが使うフックについて述べます。 既存のテキストを詰め込んだり幅揃えするために 明示的に呼び出す関数については、31.11 詰め込みを参照してください。
自動詰め込み(auto-filling)モードでは、 テキストの一部を再詰め込む際の 余白や幅揃えスタイルを変更するための関数も使えるようにします。 See 節 31.12 詰め込みのための余白。
nil
であると、そのような場合に特別なことを行わない。
自動詰め込み(auto-filling)モードがオンであると、 auto-fill-function
の値はdo-auto-fill
である。 この関数の目的は、行分けの通常の方針を実装することである。
Emacsの古い版では、この変数をauto-fill-hook
と命名していたが、 フックの標準的な慣習に従って呼ばれないため 19版でauto-fill-function
と改名した。
auto-fill-function
として用いる関数を指定する。 メジャーモードでは、この変数のバッファローカルな値に設定することで 自動詰め込み(auto-filling)モードのふるまいを変更できる。[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] |
本節で述べるソート関数すべては、バッファ内のテキストを並べ替えます。 これは、リスト内の要素の順番を並べ替える関数sort
(see 節 5.6.3 リストの順序を変更する関数)と対照的です。 これらの関数が返す値には意味はありません。
sort-subr
の動作方法を理解するためは、 バッファの参照可能部分全体が ソートレコード(sort record)と呼ばれる 重なり合いのない断片に分割されていると考える。 レコードは連続しているかもしれないし、そうでないかもしれないが、 けっして重なり合わない。 各ソートレコードの一部分(あるいは全体)をソートキーとして区別する。 ソートでは、ソートキーの順に並ぶようにレコードを並び替える。
通常、レコードをソートキーの昇順に並べ替える。 関数sort-subr
の第1引数reverseがnil
以外であると、 ソートキーの降順にレコードを並べ替える。
sort-subr
のつぎの4つの引数は、 ソートレコードをまたいでポイントを移動するために呼ばれる関数である。 それらは、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) "Sort lines in region alphabetically;\ argument means descending order. Called from a program, there are three arguments: REVERSE (non-nil means reverse order),\ BEG and END (region to sort). The variable `sort-fold-case' determines\ whether alphabetic case affects the sort order. (interactive "P\nr") (save-excursion (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 () (while (and (not (eobp)) (looking-at paragraph-separate)) (forward-line 1)))) 'forward-paragraph) |
sort-subr
から戻ったあとでは、 ソートレコードを指しているマーカは意味のある位置を指していない。
nil
以外であると、 sort-subr
や他のバッファソート関数は、 文字列の比較において大文字小文字を区別しない。アルファベット順のソートとは、 最初の文字同士、2番目の文字同士といった具合に 2つのソートキーを比較することである。 不一致がみつかると、ソートキーが等しくないことを意味し、 最初の不一致箇所の文字が小さいほうのソートキーが小さい。 個々の文字は、Emacsの文字集合における文字コードの数値に従って比較する。
引数record-regexpの値は、バッファをソートレコードに 分割する方法を指定する。 各レコードの末尾において、この正規表現を探索し それに一致したテキストをつぎのレコードとする。 たとえば、正規表現`^.+$'は、 少なくとも1つの文字のあとに改行があるような行に一致し、 そのような行をソートレコードとする。 正規表現の構文と意味については、see 節 33.2 正規表現。
引数key-regexpの値は、 レコードのどの部分がソートキーであるかを指定する。 key-regexpは、レコード全体かその一部分に一致する。 後者の場合、レコードの残りの部分は、レコードの並び替え順序には影響しないが、 レコードをその新たな位置に移動するときにいっしょに移動される。
引数key-regexpで record-regexpの部分式に一致したテキストを参照してもよいし、 独立した正規表現でもよい。
key-regexpにはつぎの可能性がある。
sort-regexp-fields
はレコード内でこの正規表現に一致するものを探す。 一致がみつかれば、それがソートキーになる。 レコード内でkey-regexpに対する一致がみつからなければ、 レコードを無視する。 つまり、バッファ内での当該レコードの位置を変更しない。 (別のレコードが周りに移動してくるかもしれない。)たとえば、領域内のすべての行を各行の`f'で始まる最初の単語で ソートするには、record-regexpに`^.*$'、 key-regexpに`\
(sort-regexp-fields nil "^.*$" "\\" (region-beginning) (region-end)) |
sort-regexp-fields
を対話的に呼び出すと、 ミニバッファでrecord-regexpとkey-regexpを問い合わせる。
nil
以外であると、逆順にソートする。nil
以外であると、逆順にソートする。nil
以外であると、逆順にソートする。reverseがnil
以外であると、逆順にソートする。
このコマンドの普通でない点は、 位置begを含む行全体と位置endを含む行全体も ソート対象の領域に含まれることである。
sort-columns
は、ユーティリティプログラムsort
を使うため、 タブ文字を含むテキストを正しく扱えない。 ソートするまえにM-x untabifyを使ってタブを空白に変換すること。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] |
コラム関数は、(バッファの先頭から文字を数えた)文字位置を (スクリーンの行頭から文字を数えた)コラム位置に変換します。
これらの関数は、各文字をそれがスクリーン上で占めるコラム数を基に数える。 つまり、ctl-arrow
の値に依存してコントロール文字は、 2コラムか4コラム占めると数え、 タブ文字は、タブの開始コラムとtab-width
の値に依存する コラム数を占めると数えることを意味します。 See 節 37.13 通常の画面表示慣習。
コラム番号の計算では、ウィンドウの幅や水平スクロール量を無視します。 その結果、コラム値は任意の大きさになりえます。 最初の(スクリーン左端の)コラムの番号は0です。
current-column
の使用例については、 29.2.4 テキスト行単位の移動のcount-lines
を参照。
コラムcolumnが行末を越える場合、ポイントを行末へ移動する。 columnが負であると、ポイントを行頭へ移動する。
コラムcolumnがタブなどの複数コラムを占める文字の中ほどにあるために そこへ移動できない場合には、 ポイントを当該文字の末尾へ移動する。 しかし、forceがnil
以外であり columnがタブの中ほどであると、 コラムcolumnに正確に移動できるようにタブを空白に変換する。 複数コラムを占めるその他の文字では、それらを分割する方法がないため、 forceを指定しても変則的になる。
コラムcolumnに到達できるほど行が長くない場合にも 引数forceには効果がある。 そのような場合、指定コラムに達するように行末に白文字を追加する。
columnが整数でないと、エラーを通知する。
戻り値は、実際の移動先のコラム番号である。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] |
字下げ関数は、行頭の空白を調べたり、そこへ移動したり、 変更するために使います。 行の他の白文字を変更するものもあります。 コラム関数と字下げ関数は左端を0と数えます。
31.17.1 字下げ基本関数 Functions used to count and insert indentation. 31.17.2 メジャーモードの制御による字下げ Customize indentation for different modes. 31.17.3 領域全体の字下げ Indent all the lines in a region. 31.17.4 先行行相対の字下げ Indent the current line based on previous lines. 31.17.5 調整可能な『タブストップ』 Adjustable, typewriter-like tab stops. 31.17.6 字下げに基づく移動コマンド Move to first non-blank character.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] |
本節では、字下げを数えたり挿入するために使われる基本関数について述べます。 後続の節の関数群は、これらの基本関数を使っています。 関連する関数については、See 節 37.9 表示幅。
nil
以外であると、 columnを越える場合であっても最低minimum個の空白を挿入する。 さもなければ、ポイントがcolumnを越えている場合には、 この関数はなにもしない。 戻り値は、挿入した字下げが終る箇所のコラムである。
挿入された白文字は周りの文字(普通は、まえの文字)からテキスト属性を継承する。 see 節 31.19.6 テキスト属性のスティッキ性。
nil
以外であると、 字下げ関数は空白に加えてタブも挿入する。 さもなければ、空白のみを挿入する。 この変数に設定すると、カレントバッファでバッファローカルになる。[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] |
各メジャーモードの重要な機能は、 キー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が行うことと同じであるが、 TABがタブを挿入するテキスト向けのモードの一部では、 newline-and-indent
はleft-margin
で指定されたコラムに字下げする。
このコマンドは、indent-line-function
の現在の値を呼び出すことで、 どちらの行も現在のメジャーモードに基づいて字下げする。 プログラム言語向けのモードでは、これはTABが行うことと同じであるが、 TABがタブを挿入するテキスト向けのモードの一部では、 reindent-then-newline-and-indent
は、 left-margin
で指定されるコラムに字下げする。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] |
本節では、領域内のすべての行を字下げするコマンドについて述べます。 これらは予測できない値を返します。
nil
であると、 indent-region
は、現在のモードの字下げ関数、 つまり、indent-line-function
の値を呼び出して、 空でない各行を字下げする。
to-columnがnil
以外であると、 それは字下げ先のコラム番号を指定する整数であること。 すると、この関数は、白文字を追加するか削除して、 各行を指定どおりに字下げする。
詰め込み接頭辞がある場合、 indent-region
は詰め込み接頭辞で行を始めることで各行を字下げする。
indent-region
の短縮版として利用可能な関数である。 領域の開始位置と終了位置の2つの引数をとる。 領域の行を1つ1つ字下げする場合と同じ結果を生じるが、 より速く動作することを意図してこの関数を設計するべきである。
値がnil
であると短縮版はなく、 indent-region
が実際に1行ずつ処理する。
短縮版関数はCモードやlispモードのようなモードで有用である。 そのようなモードでは、indent-line-function
で関数定義の始まりを 走査する必要があり、これを各行に適用すると自乗の時間がかかる。 短縮版では、字下げし終えた関数定義を通過するたびに 走査情報を更新でき、これには線形時間かかるだけである。 個々の行を高速に字下げできるモードでは、短縮版は必要ない。
引数to-columnにnil
以外を指定したindent-region
には 別の意味があり、この変数を使わない。
たとえば、countが3であると、 このコマンドは指定した領域内の各行の行頭に3コラムの字下げを追加する。
メイル(mail)モードでは、C-c C-y(mail-yank-original
)が 返信対象のメッセージからコピーしたテキストを字下げするために indent-rigidly
を使っている。
indent-rigidly
と同様であるが、 文字列やコメントで始まる行を変更しない点が異なる。
さらに、(nochange-regexpがnil
以外のとき) 行の先頭がnochange-regexpに一致する場合にも行を変更しない。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] |
本節では、先行する行の内容に基づいて現在行を字下げする2つの コマンドについて述べます。
空白でないまえの行に、つぎの字下げ位置(つまり、ポイント位置より 大きなコラム)がないと、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
を呼び出すことで、 まえの行と同様に字下げする。 戻り値は予測できない。
空行でないまえの行に現在のコラム位置を越える字下げ位置がなければ、 このコマンドはなにもしない。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] |
本節では、ユーザー指定の『タブストップ』の機構と、 それを使ったり設定するための機構について説明します。 『タブストップ』という名前を使うのは、 この機構がタイプライタのタブストップに似た機能だからです。 この機能は、適切な個数の空白とタブ文字を挿入して つぎのタブストップのコラムへ到達しますが、 バッファ内のタブ文字の表示に影響することはありません (see 節 37.13 通常の画面表示慣習)。 テキスト(text)モードなどの少数のメジャーモードでのみ、 入力としての文字TABがこのタブストップ機能を使います。
tab-stop-list
で定義されたつぎのタブストップコラムまで、 ポイントのまえに空白やタブを挿入する。 このリストで現在のコラム番号より大きな要素を探し、 その要素を字下げ位置のコラムとして使う。 そのような要素がなければ、このコマンドはないもしない。tab-to-tab-stops
が使うタブストップコラムのリストである。 それらの要素は、昇順の整数であること。 タブストップコラムの間隔は、等間隔である必要はない。
タブストップを対話的に編集するにはM-x edit-tab-stopsを使う。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] |
これらのコマンドは、主に対話的に使うもので、 テキストの字下げに基づいて動作します。
nil
を返す。nil
を返す。nil
を返す。[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] |
ここに述べる大文字小文字の変更コマンドは、 カレントバッファのテキストに作用します。 文字列や文字の大文字小文字を変換する関数については、 See 節 4.8 Lispの大文字小文字変換。 どの文字が大文字でどの文字が小文字であり、それらをどのように変換するかを カスタマイズする方法については、See 節 4.9 大文字小文字テーブル。
nil
を返す。
領域の端が単語の途中にあると、 その単語の領域内の部分を1つの単語とみなす。
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
である。
ポイントが単語の途中にあると、単語を前方へ移動するときには ポイントよりまえにある単語の部分を無視する。 単語の残りの部分を1つの単語として扱う。
capitalize-word
を対話的に呼び出すと、 countは数値前置引数である。
nil
である。
downcase-word
を対話的に呼び出すと、 countは数値前置引数である。
nil
である。
upcase-word
を対話的に呼び出すと、 countは数値前置引数である。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] |
シンボルの属性リスト(see 節 7.4 属性リスト)のように、 バッファや文字列の各文字にはテキスト属性リスト (text property list)を持てます。 この属性は、(本節の原文のタイトルの)文字`T'や `foo'の最初の`o'のような特定の箇所の特定の文字に属します。 同じ文字が異なる箇所に現れるとき、 一般にはそれぞれに異なる属性を持てます。
各属性には、名前と値があります。 どちらも任意のLispオブジェクトでかまいませんが、 名前は普通はシンボルです。 属性リストを参照する普通の方法では、 名前を指定してそれに対応する値を問い合わせます。
文字に属性category
があるとき、 それを文字のカテゴリ(category)といいます。 それはシンボルであるべきです。 そのシンボルの属性が、文字の属性のデフォルトとして働きます。
文字列とバッファのあいだでテキストをコピーすると、 文字とともにその属性も保たれます。 substring
、insert
、buffer-substring
などの さまざまな関数がそうします。
31.19.1 テキスト属性を調べる Looking at the properties of one character. 31.19.2 テキスト属性の変更 Setting the properties of a range of text. 31.19.3 テキスト属性を探す関数 Searching for where a property changes value. 31.19.4 特別な意味を持つ属性 Particular properties with special meanings. 31.19.5 整形済みテキストの属性 Properties for representing formatting of text. 31.19.6 テキスト属性のスティッキ性 How inserted text gets properties from neighboring text. 31.19.7 テキスト属性をファイルへ保存する Saving text properties in files, and reading them back. 31.19.8 テキスト属性の遅延計算 Computing text properties in a lazy fashion only when text is examined. 31.19.9 クリック可能なテキストを定義する Using text properties to make regions of text do something when you click on them. 31.19.10 テキスト属性が範囲でない理由 Why text properties do not use Lisp-visible text intervals.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] |
テキスト属性を調べるもっとも簡単な方法は、 特定の文字の特定の属性の値を問い合わせることです。 それには、get-text-property
を使います。 文字の属性リスト全体を取得するにはtext-properties-at
を使います。 複数の文字の属性を一度に調べるための関数については、 See 節 31.19.3 テキスト属性を探す関数。
これらの関数は、文字列とバッファの両方を扱えます。 文字列内の位置は0から始まり、 バッファ内の位置は1から始まることに注意してください。
その文字に属性propがなくてもシンボルであるカテゴリがあれば、 get-text-property
は当該シンボルの属性propを返す。
get-text-property
に似ているが、 まずオーバレイを調べてからテキスト属性を調べる。 see 節 37.8 オーバレイ。
引数objectは、文字列、バッファ、ウィンドウのいずれかである。 ウィンドウであると、そのウィンドウに表示しているバッファの テキスト属性とオーバレイを対象にするが、 対象となるオーバレイはそのウィンドウに対して活性なものだけである。 objectがバッファであると、テキスト属性に加えて そのバッファのすべてのオーバレイを対象にする。 objectが文字列であると、 文字列にはオーバレイはないので、テキスト属性のみを対象にする。
nil
であると、デフォルトはカレントバッファである。
(setq default-text-properties '(foo 69)) ;; 位置1の文字に属性がないことを保証する (set-text-properties 1 2 nil) ;; 問い合わせたときに見えるのはデフォルト値である (get-text-property 1 'foo) => 69 |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] |
属性を変更する基本関数は、バッファや文字列の指定した範囲に作用します。 関数set-text-properties
(本節の最後)は、 その範囲のテキストの属性リスト全体を設定します。 これは、名前で指定した特定の属性のみを追加/変更/削除するのに しばしば有用です。
テキスト属性はバッファ(や文字列)の一部分であるとみなされ、 スクリーン上でのバッファの見た目に影響するので、 バッファのテキスト属性を変更すると、 バッファには変更済みの印を付けます。 バッファのテキスト属性の変更もアンドゥ(see 節 31.9 アンドゥ)できます。
nil
であると、デフォルトはカレントバッファである。nil
であると、デフォルトはカレントバッファである。
引数propsで追加する属性を指定する。 これは属性リスト(see 節 7.4 属性リスト)の形であること。 つまり、属性名とその値を交互に並べたリストであること。
この関数が属性の値をどれか実際に変更したならば、戻り値はt
である。 さもなければ(propsがnil
だったり、 テキスト内の値と同じ値であると)nil
である。
たとえば、テキストのある範囲の属性comment
とface
を 設定するにはつぎのようにする。
(add-text-properties start end '(comment t face highlight)) |
nil
であると、デフォルトはカレントバッファである。
引数propsで削除する属性を指定する。 これは属性リスト(see 節 7.4 属性リスト)の形であること。 つまり、属性名とその値を交互に並べたリストであること。 ただし、意味があるのは名前のみであり、その値は無視する。 たとえば、属性face
を削除するにはつぎのようにする。
(remove-text-properties start end '(face nil)) |
この関数が属性の値をどれか実際に変更したならば、戻り値はt
である。 さもなければ(propsがnil
だったり、 指定したテキスト内の文字にそれらのいずれの属性もなければ) nil
である。
特定のテキストからすべてのテキスト属性を削除するには、 新たな属性リストとしてnil
を指定して set-text-properties
を使う。
nil
であると、 デフォルトはカレントバッファである。
引数propsは新たな属性リストである。 これは、属性名とその値を交互に並べたリストであること。
set-text-properties
から戻ると、 指定した範囲のすべての文字は同一の属性を持つことになる。
propsがnil
であると、 テキストの指定した範囲からすべての属性を削除する効果がある。 たとえば、つぎのようにする。
(set-text-properties start end nil) |
バッファからテキストをコピーするがその属性はコピーしない 関数buffer-substring-no-properties
(see 節 31.2 バッファの内容を調べる)も 参照してください。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] |
テキスト属性の典型的な用途では、 ほとんどの場合多くの連続した文字の1つの属性には同じ値があります。 1つずつ文字を調べるようにプログラムするよりは、 同じ属性値を持つテキストの塊を処理するほうがとても速いです。
このために使える関数をここで説明します。 これらは属性値の比較にeq
を使います。 objectのデフォルトは、すべての場合でカレントバッファです。
高い効率のためには、これらの関数に引数limitを使うことが重要であり、 1つの属性を探す関数には特にあてはまります。 さもないと、読者が望む属性が変更されないような場合、 それらの関数はバッファの末尾まで走査して長い時間を費すことになります。
これらの関数はポイントを移動しませんが、そのかわりに 位置(あるいはnil
)を返します。 位置はつねに2つの文字のあいだにあることに注意してください。 これらの関数が返す位置は、異なる属性を持つ2つの文字のあいだです。
limitがnil
以外であると、limitの位置で走査を終える。 その箇所まで異なる属性がないと、 next-property-change
はlimitを返す。
limitがnil
でありobjectの末尾まで属性に変化がないと、 値はnil
である。 値がnil
以外であると、それはposより大きいか等しい位置である。 値がposに等しいのは、limitが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を返す。
limitがnil
でありobjectの末尾まで属性に変化がないと、 値はnil
である。 値がnil
以外であると、それはposより大きいか等しい位置である。 値がposに等しいのは、limitがposに等しい場合のみである。
next-property-change
と同様であるが、 前方へではなくposから後方へ走査する。 値がnil
以外であると、それはposより小さいか等しい位置である。 値がposに等しいのは、limitがposに等しい場合のみである。next-single-property-change
と同様であるが、 前方へではなくposから後方へ走査する。 値がnil
以外であると、それはposより小さいか等しい位置である。 値がposに等しいのは、limitがposに等しい場合のみである。next-property-change
と同様であるが、 テキスト属性に加えてオーバレイも対象にする。 この関数はカレントバッファにのみ作用するため、 objectを表す引数はない。 どちらかの属性が異なるつぎの位置を返す。next-char-property-change
と同様であるが、 前方へではなくposから後方へ走査する。nil
以外を返す。 より正確には、そのような最初の文字の位置を返す。 さもなければnil
を返す。
省略可能な5番目の引数objectは、走査すべき文字列やバッファを指定する。 位置はobjectに相対である。 objectのデフォルトはカレントバッファである。
nil
以外を返す。 より正確には、そのような最初の文字の位置を返す。 さもなければnil
を返す。
省略可能な5番目の引数objectは、走査すべき文字列やバッファを指定する。 位置はobjectに相対である。 objectのデフォルトはカレントバッファである。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] |
特別な組み込みの意味を持つテキスト属性名の一覧を以下に示します。 以降の節では、詰め込みや属性の継承を制御する特別な属性名も示します。 それ以外の名前には標準的な意味はないので、 読者はそれらを好きなように使ってかまいません。
category
category
があるとき、 これを文字のカテゴリ(category)と呼ぶ。 これはシンボルであること。 そのシンボルの属性が、文字の属性のデフォルトとして働く。
face
face
を使う。 その値はフェイス名かフェイス名のリストである。 詳しくは、see 節 37.10 フェイス。
属性値がリストであると、その要素は、 (foreground-color . color-name)
や (background-color . color-name)
の形でもよい。 これらの要素は、前景色だけや背景色だけを指定する。 したがって、使用する各色を表すフェイスを作成する必要はない。
テキストの内容に基づいて属性face
を自動的に更新する方法に関しては、 see 節 22.5 フォントロック(font-lock)モード。
mouse-face
face
のかわりに 属性mouse-face
が使われる。 この目的において『近く』とは、 文字とマウスの位置のあいだの 属性mouse-face
の値が同じであるすべてのテキストである。
local-map
local-map
を用いることで、 バッファ内のテキストの一部分に対して別のキーマップを指定できる。 ポイントのうしろの文字のこの属性の値がnil
以外であると、 バッファのローカルマップのかわりにその値をキー探索に使う。 属性値がシンボルであると、シンボルの関数定義をキーマップとして使う。 see 節 21.6 活性なキーマップ。
syntax-table
syntax-table
は、構文テーブルがこの文字に指定するものに優先する。 see 節 34.4 構文属性。
read-only
read-only
があると、その文字を変更できない。 変更するどのようなコマンドもエラーになる。
挿入されるテキストがスティッキ性のために属性read-only
を 継承する場合には、読み出し専用文字のつぎにテキストを挿入するとエラーになる。 したがって、スティッキ性を制御することで、 読み出し専用テキストのつぎへのテキスト挿入を許すかどうかを制御できる。 see 節 31.19.6 テキスト属性のスティッキ性。
属性を変更するとバッファを変更したとみなすため、 特別なトリックを知らない限り、属性をread-only
を削除できない。 つまり、inhibit-read-only
にnil
以外の値を束縛して、 属性を削除する。 see 節 26.7 読み出し専用バッファ (2003/10/30)。
invisible
invisible
がnil
以外であると、 その文字はスクリーンに表示されない。 詳しくは、see 節 37.4 不可視なテキスト。
intangible
intangible
のnil
でない同じ値があると、 それらのあいだにポイントを置けなくなる。 前方に向けてこれらの文字の中にポイントを移動しようとすると、 ポイントは実際にはそれらの末尾へ移動する。 後方に向けてこれらの文字の中にポイントを移動しようとすると、 ポイントは実際にはそれらの先頭へ移動する。
変数inhibit-point-motion-hooks
がnil
以外であると、 属性intangible
は無視される。
modification-hooks
modification-hooks
がある場合、それは関数のリストであること。 その文字の変更にはそれらの関数すべてが呼び出される。 各関数は2つの引数、つまり、バッファの変更対象部分の先頭と末尾を受け取る。 1つの操作で変更される一連の文字に同じ変更フック関数が現れる場合、 関数が実際に何回呼ばれるか予測できないことに注意してほしい。
insert-in-front-hooks
insert-behind-hooks
insert-in-front-hooks
と まえの文字の属性insert-behind-hooks
に指定されている 関数群を呼び出す。 これらの関数は2つの引数、つまり、挿入されたテキストの先頭と末尾を受け取る。 これらの関数が呼ばれるのは、実際の挿入操作を終えてからである。
バッファ内のテキストを変更するときに呼び出される他のフックについては、 31.23 変更フックも参照。
point-entered
point-left
point-entered
とpoint-left
は、 ポイント移動を報告するフック関数を保持する。 ポイントが動くたびに、Emacsはこれらの2つの属性値、つまり、
point-left
とpoint-entered
を比較する。 これら2つの値が異なれば、 ポイントの古い値と新しい値の2つの引数で(nil
でなければ) それぞれを呼び出す。
同じことを移動前後のポイントのまえの文字についても行う。 その結果、(同じかもしれない)point-left
の関数を2回、かつ/あるいは、 (同じかもしれない)point-entered
の関数を2回実行する。 いずれにしても、point-left
の関数が最初に呼ばれ、 そのあとでpoint-entered
の関数が呼ばれる。
これらの関数では、char-after
を使って ポイントを移動せずにさまざまな箇所の文字を調べられる。 ポイントの値が実際に変わったときにのみ、これらのフック関数が実行される。
nil
以外であると、 point-left
とpoint-entered
のフック関数は実行されなくなり、 属性intangible
の効果もなくなる。 この変数はグローバルに設定せずに、let
で束縛すること。[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] |
これらのテキスト属性は、詰め込みコマンドのふるまいに影響します。 これらは整形済みのテキストを表現するために使われます。 31.11 詰め込みとSee 節 31.12 詰め込みのための余白。
hard
use-hard-newlines
が nil
以外の場合にのみ効果を持つ。
right-margin
left-margin
justification
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] |
自己挿入文字は、通常、先行する文字と同じ属性を持ちます。 これを属性の継承(inheritance)と呼びます。
Lispプログラムでは、挿入基本関数を選べば、 継承して挿入したり継承せずに挿入できます。 insert
などの普通のテキスト挿入関数は、 いかなる属性も継承しません。 これらは、挿入する文字列の属性をそのまま持ったテキストを挿入し、 それ以外の属性はありません。 キルリングなどのある文脈から別の文脈へテキストをコピーするプログラムには、 これは正しい動作です。 継承して挿入するには、本節で述べる特別な基本関数を使います。 自己挿入文字はこれらの基本関数を使っているので、属性を継承します。
継承して挿入するとき、どの属性を継承するかは、 2つの特別な属性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を挿入するが、 前後のテキストから任意のスティッキ性の属性を継承する。継承しない普通の挿入関数については、See 節 31.4 テキストの挿入。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] |
つぎの2つのフックを使って、 テキスト属性を(テキストそのものとともに)ファイルに保存しておき、 ファイルを訪問したり挿入するときに同じテキスト属性を復元できます。
write-region
が呼び出す関数の リストである。 see 節 24.4 ファイルへの書き出し。
リスト内の各関数は2つの引数、つまり、 書き込む領域の先頭と末尾で呼び出される。 これらの関数はバッファの内容を変更しないこと。 そのかわりに、バッファのテキストに加えてファイルに書き込むべき 注記を表すリストを返すべきである。
各関数は、(position . string)
の形の要素から成る リストを返すべきである。 ここで、positionは書き込まれるテキスト内の相対位置を指定する整数、 stringはそこへ追加する注記である。
これらの関数が返す各リストは、positionの昇順になっている必要がある。 複数の関数があると、write-region
は リストを破壊的に併合して1つのソートしたリストにする。
write-region
がバッファからファイルにテキストを実際に書くときに、 指定された注記を対応する位置に混在させる。 バッファを変更せずにこれらすべてを行う。
insert-file-contents
がファイルの内容を挿入してから 呼び出す関数のリストを保持する。 これらの関数は挿入されたテキストで注記を走査し、 それらが表すテキスト属性にそれらを変換する。
各関数は1つの引数、つまり、挿入されたテキストの長さで呼ばれ、 ポイントは挿入されたテキストの先頭を表す。 関数は当該テキストで注記を走査して注記を削除し、 注記が指定するテキスト属性を作成する。 関数は、変更を反映した挿入されたテキストの更新された長さを返すこと。 関数が返した値がつぎの関数の引数になる。
これらの関数は、挿入されたテキストの先頭にポイントをつねに戻すこと。
after-insert-file-functions
の意図された用途は、 テキスト表現の注記を実際のテキスト属性に変換することである。 しかし、別の使い方も可能である。
これらのフックを使ってファイルにテキスト属性を保存したり復元する Lispプログラムを書いて、さまざまなデータ書式を試して よいものをみつけるようにお願いします。 最終的には、Emacsに取り込める良質で汎用の拡張を ユーザーが作り出すことを願っています。
テキスト属性の名前や値として任意のLispオブジェクトを 処理しないように忠告しておきます。 そのような汎用のプログラムは書くのが難しく動作が遅くなりがちです。 そのかわりに、適当に柔軟性があり符号化が難しくないデータ型の集合を選びます。
関連する機能については、See 節 24.12 ファイル書式変換。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] |
バッファ内のすべてのテキストのテキスト属性を計算するかわりに、 必要になった時点でテキストの一部分のテキスト属性を計算するようにできます。
バッファからテキスト属性とともにテキストを取り出す基本関数は、 buffer-substring
です。 属性を調べるまえに、この関数はアブノーマルフック buffer-access-fontify-functions
を実行します。
buffer-substring
がバッファの一部分からテキストとテキスト属性を コピーするまえに、この関数はこのリスト内の関数すべてを呼び出す。 各関数は、バッファの参照される範囲を指定する2つの引数を受け取る。 (バッファはつねにカレントバッファである。)関数buffer-substring-no-properties
は テキスト属性を無視するので、これらの関数を呼び出しません。
バッファの同じ部分に対してフック関数が複数回呼び出されるのを防ぐには、 変数buffer-access-fontified-property
を使います。
nil
以外であると、 それはテキスト属性の名前として使われるシンボルである。 そのテキスト属性に対するnil
以外の値は、 『この文字の他のテキスト属性はすでに計算済みである』ことを意味する。
buffer-substring
に指定された範囲のすべての文字において、 この属性に対してnil
以外の値があると、 buffer-substring
は buffer-access-fontify-functions
の関数を呼び出さない。 それらの文字にはすでに正しいテキスト属性があるとみなし、 それらにすでにある属性をコピーする。
この機能を使う普通の方法は、 buffer-access-fontify-functions
の関数が 他の属性ととともにこの属性をそれらが操作した文字に追加する。 そうすれば、同じテキストに対して何回も呼び出されるのを防ぐことができる。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] |
バッファ内にクリック可能なテキスト(clickable text)を設定するには 2つの方法があります。 これは典型的には2つの部分から成ります。 つまり、マウスが重なるとテキストを強調表示し、 テキストのその部分をクリックすると マウスボタンがなんらかの処理を行うようにします。
強調表示はテキスト属性mouse-face
で行います。 diredでの方法を例として示します。
(condition-case nil (if (dired-move-to-filename) (put-text-property (point) (save-excursion (dired-move-to-end-of-filename) (point)) 'mouse-face 'highlight)) (error nil)) |
put-text-property
の最初の2つの引数は、 テキストの先頭と末尾を指定します。
このテキストをクリックしたときにマウスになにかをさせるようにする 普通の方法は、メジャーモードのキーマップでmouse-2
を定義することです。 クリック可能なテキストをクリックしたかどうかの検査は、 コマンド定義で行われます。 diredではつぎのようにしています。
(defun dired-mouse-find-file-other-window (event) "In dired, visit the file or directory name you click on." (interactive "e") (let (file) (save-excursion (set-buffer (window-buffer (posn-window (event-end event)))) (save-excursion (goto-char (posn-point (event-end event))) (setq file (dired-get-filename)))) (select-window (posn-window (event-end event))) (find-file-other-window (file-name-sans-versions file t)))) |
外側のsave-excursion
は、カレントバッファが変わることを防ぎます。 内側のは、クリックしたバッファのポイントを恒久的に変更することを防ぎます。 この例では、diredは関数dired-get-filename
を用いて、 イベントの位置に基づいて訪問すべきファイルを決定します。
メジャーモードのマウスコマンドを定義するかわりに、 テキスト属性local-map
を使って、 クリック可能なテキストそのものにキーバインディングを定義することもできます。
(let ((map (make-sparse-keymap))) (define-key-binding map [mouse-2] 'operate-this-button) (put-text-property (point) (save-excursion (dired-move-to-end-of-filename) (point)) 'local-map map)) |
この方法では、テキストのさまざまなクリック可能な部分に 異なるコマンドを定義できます。 さらに、バッファの残りの部分に対しては、 メジャーモードの定義(やグローバルな定義)がそのまま有効です。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] |
バッファ内のテキストに属性を付加できるエディタのなかには、 ユーザーにテキスト内の『範囲』を指定させ、 その範囲に属性を付加するものがあります。 このようなエディタでは、ユーザーやプログラマが 個々の範囲の先頭と末尾を決定できます。 テキスト変更に伴うある種の矛盾するようなふるまいを避けるために、 熟考の結果Emacs Lispでは別の種類のインターフェイスを提供することにしました。
複数の範囲に細分することが意味を持つならば、 ある属性の1つの範囲があるだけのバッファと、 その同じテキストをその同じ属性の2つの範囲にしてあるバッファとを 区別できるはずです。
1つの範囲だけを持つバッファにおいて、そのテキストの一部をキルしたとします。 バッファに残っているテキストは1つの範囲であり、 キルリング(とアンドゥリスト)内のコピーは1つの別の範囲になります。 そしてキルされたテキストをヤンクして戻すと、 同じ属性を持つ2つの範囲ができます。 つまり、編集すると、1つの範囲と2つの範囲の区別を保存できなくなります。
テキストを挿入すると2つの範囲を融合することで この問題を『修正』したとします。 バッファにもともと1つの範囲しかなければ、うまくいきます。 しかし、同じ属性の範囲が連続して2つある場合に、 一方の範囲をキルしてからヤンクして戻したとします。 別の場面では救いになる同じ属性の範囲を融合する機能が、 ここではトラブルを引き起こします。 つまり、ヤンクすると1つの範囲になってしまいます。 ここでも、編集すると、1つの範囲と2つの範囲の区別を保存できなくなります。
2つの範囲の境界にテキストを挿入する場合でも、 満足できる解決方法がない問題を提起します。
しかし、『この文字の属性はなにか』といった形の問いに対して 一貫したふるまいをするような編集にするのは簡単です。 そのために、これらが唯一の意味ある問いかけであると判断したのです。 範囲の先頭と末尾を問うようなものは実装してありません。
実用上は、明示的な範囲の境界のかわりに、 テキスト属性を探索する関数を普通は使えます。 それらの関数は、可能な場合にはつねに範囲は融合されると仮定して 範囲の境界を探すと考えることができます。 See 節 31.19.3 テキスト属性を探す関数。
Emacsには表示機能として明示的な範囲もあります。 37.8 オーバレイを参照してください。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] |
つぎの関数は、指定した領域内の文字をそれらの文字コードに基づいて置き換えます。
noundoがnil
以外であると、 subst-char-in-region
はアンドゥ用の変更を記録せず、 バッファに変更済みの印も付けない。 この機能は、選択表示(see 節 37.5 選択表示)の制御に使われている。
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 table ochar)
は、 ocharに対応する変換した文字を与える。 tableの長さが256未満であると、 tableの長さより大きなコードの文字は変換によっては変更されない。
translate-region
の戻り値は、 変換によって実際に変更した文字の個数を返す。 これには、変換表で自分自身に変換された文字は数えない。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] |
レジスタは、Emacsの編集においてさまざまな種類の値を保持できる変数の一種です。 各レジスタには1文字の名前が付いています。 すべてのASCII文字とそれらのメタ変種(ただしC-gを除く)を レジスタの名前に使えます。 したがって、255個のレジスタを使えます。 Emacs Lispでは、レジスタ名でレジスタを区別します。
(name . contents)
の形の要素の連想リストである。 通常、使用中のEmacsの各レジスタに対して1つの要素がある。
オブジェクトnameは、レジスタを識別する文字(整数)である。
レジスタの内容(contents)に可能な型はいくつかあります。
insert-register
がレジスタ内で数をみつけると10進数に変換する。
(window-configuration position)
(frame-configuration position)
本節の関数は、明記してない場合には予測できない値を返します。
nil
を返す。通常、このコマンドは挿入したテキストのまえにポイントを置き、 そのあとにマークを置く。 しかし、省略可能な2番目の引数beforepがnil
以外であると、 まえにマークを置きあとにポイントを置く。 この関数を対話的に呼び出すときに前置引数を指定すれば、 2番目の引数beforepにnil
以外を渡せる。
レジスタに矩形領域が含まれる場合、 ポイント位置に矩形領域の左上隅がくるように挿入される。 つまり、テキストは現在行とそのしたの連続する行に挿入される。
保存したテキスト(文字列)や矩形領域(リスト)以外がレジスタに入っていると、 現状では有用なことは起こらない。 将来これは変更されるであろう。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] |
つぎのサブルーティンは転置コマンドで使われます。
通常、transpose-regions
は転置したテキスト内のマーカを再配置する。 つまり、2つの転置部分の一方の内側を指していたマーカは その部分とともに移動して、新しい位置で同じ2つの文字のあいだに留まる。 しかし、leave-markersがnil
以外であると、 transpose-regions
はこれを行わず、 すべてのマーカは再配置されない。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] |
これらのフックにより、すべてのバッファ (それらをバッファローカルにしておけば特定のバッファ)における すべての変更を知るようにできます。 テキストの特定部分の変更を検出する方法については、 31.19.4 特別な意味を持つ属性も参照してください。
これらのフックに使う関数において正規表現を使う場合には、 マッチデータを保存し復元する必要があります。 さもないと、それらを呼び出す編集操作と奇妙な干渉を引き起こします。
古いテキストの長さは、変更前のそのテキストの先頭と末尾の バッファ内位置の差である。 変更済みのテキストの長さは、単純に始めの2つの引数の差である。
after-change-functions
の関数を一度だけ呼び出す。
プログラムからバッファの同じ部分でテキスト変更を複数回行う場合、 プログラムの当該部分の周りでマクロcombine-after-change-calls
を使うと、 フックafter-change-functions
を使用してるときには 動作がかなり速くなりうる。 最終的にフックafter-change-functions
が呼ばれると、 combine-after-change-calls
の本体で行った変更すべてを含むような バッファ部分が引数に指定される。
警告: フォーム
combine-after-change-calls
の本体の内側では after-change-functions
とafter-change-function
の値を 変更しないこと。
注意: 変更がバッファの広く分散した部分に行われるときにもこれは動作するが、 推奨できない。 非効率なふるまいをするようなフック関数があるからである。
nil
ならばそのような関数はなし)。 before-change-functions
の関数と同様に呼ばれる。nil
ならばそのような関数はなし)。 after-change-functions
の関数と同様に呼ばれる。上の4つの変数は、これらの関数が実行中には一時的にnil
に束縛されます。 つまり、これらの関数の1つがバッファを変更しても、 その変更ではこれらの関数を呼び出しません。 フック関数においてこれらの関数を実行するような変更を行いたい場合には、 フック関数でこれらの変数をそれらの通常の値に束縛し直します。
この保護的な機構の1つの不便な帰結は、 after-change-functions
やbefore-change-functions
には、 その変数の値を変更する関数を持てないことです。 しかし、これは本当の制限ではありません。 それらの関数で実行すべき関数のリストを変更したければ、 単純に1つの定まった関数をフックに追加し、 その関数では呼び出すべき別の関数を指定する別の変数を調べます。 つぎのようにします。
(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) |
[ << ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] |