検索エンジンから来た人に注意このマニュアルは、Emacs ver. 19.x 向けのマニュアルを Mule 2.x の開発にあたり邦訳したものを、 電脳外道学会がミラーリングしているものであり、旧版製品パラノイアであるところの椅子人の趣味によるものです。しかしながら、現在の Emacs の主流は ver. 20 以降であり、ver 19.x と ver 20.x とでは、仕様の違いが少なからずあります。 したがって、一般的な Emacs ユーザーにとっては、
このマニュアルと実機の動作とが符合しない場合があります。
|
GNU Emacsには、バッファ内のあるテキストを検索する方法が二つあります。 それは文字列そのものによる検索と正規表現による検索です。 正規表現の検索の後では、 一致データ(match data)を調べて、 どのテキストが正規表現の全体やその一部分に一致したのか判別することができます。
`skip-chars...'関数群も 一種の検索を行ないます。See section 文字を飛ばす。
以下の関数はバッファのテキストを検索するプリミティブ関数です。
プログラムから使うことを想定していますが、
対話的に呼び出すこともできます。
その場合、
プロンプトを出して検索する文字列の入力を促します。
limitとnoerrorはnil
に設定され、
repeatは1に設定されます。
以下の例で、ポイントははじめ、行頭にあります。
そして(search-forward "fox")
によって、
`fox'の最後の文字の後に動かされます。
---------- Buffer: foo ---------- -!-The quick brown fox jumped over the lazy dog. ---------- Buffer: foo ---------- (search-forward "fox") => 20 ---------- Buffer: foo ---------- The quick brown fox-!- jumped over the lazy dog. ---------- Buffer: foo ----------
引数limitは検索にたいする上限を指定します
(カレント・バッファ内の位置でなくてはいけません)。
この位置を越えるものとは照合しません。
もしlimitが省略されたかnil
の場合、
アクセス可能なバッファの末尾になります。
検索が失敗したときの動作は、noerrorの値によります。
もしnoerrorがnil
ならば、
search-failed
エラーが通知されます。
もしnoerrorがt
の場合、
search-forward
はnil
を返し何もしません。
もしnoerrorがnil
でもt
でもない場合、
search-forward
はポイントを上限まで動かし、nil
を返します
(この場合、新しいポイントの値を返した方が一貫性があるのですが、
nil
という値に依存したプログラムがあるようです)。
もしrepeatが与えられた場合(正数でなければなりません)、 その回数だけ(毎回前の照合の末尾から)検索を繰り返します。 もしこの連続検索が成功したら、この関数は、成功です。 ポイントを動かして新しい値を返します。さもないと検索は失敗です。
search-forward
と対応していますが、
逆方向に検索し、一致した文字列の先頭にポイントを置きます。
語の照合では、stringを語の列であるとみなし、 語を分離する句読点文字を無視します。 バッファから同じ語の列を検索します。 語はそれぞれバッファ中で分離していなければなりません (語`ball'の検索は語`balls'には一致しません) が、句読点文字と余白の細部は無視します (`ball boy'の検索は`ball. Boy!'に一致します)。
この例において、ポイントは最初バッファの先頭にあり、 検索の後`y'と`!'の間に移動します。
---------- Buffer: foo ---------- -!-He said "Please! Find the ball boy!" ---------- Buffer: foo ---------- (word-search-forward "Please find the ball, boy.") => 35 ---------- Buffer: foo ---------- He said "Please! Find the ball boy-!-!" ---------- Buffer: foo ----------
limitが非nil
(カレント・バッファ内の位置でなくてはいけません)の場合、
これは検索にたいする上限になります。
この位置を越えるものとは照合しません。
noerrorがnil
の場合、
検索が失敗するとword-search-forward
はエラーを通知します。
noerrorがt
の場合、
検索が失敗するとエラーを通知する代わりにnil
を返します。
noerrorがnil
でもt
でもない場合、
これはポイントをlimit(またはバッファの末尾)まで動かし、
nil
を返します。
もしrepeatが非nil
の場合、
その回数だけ検索を繰り返します。
最後に一致したものの終りにポイントを位置づけます。
word-search-forward
と対応していますが、
逆方向に検索し、
通常は一致した文字列の先頭にポイントを置きます。
正規表現(regular expression)(略してregexp)は、 文字列の(ときには無限)集合を示すパターンです。 regexpにたいする一致の検索は、非常に強力な操作です。 この節では、regexpの書き方を説明し、 次の節ではその検索のしかたを述べます。
正規表現は、その中のいくつかの文字が特殊な構文要素であり、 それ以外のものは通常の(ordinary)文字であるという構文をもっています。 通常の文字は、その文字自身にのみ一致するという単純な正規表現です。 特殊文字は`.'、`*'、`+'、`?'、`['、 `]'、`^'、`$'、`\'です。 特殊文字が新たに定義されることはありません。 正規表現中のこのほかのすべての文字は、 `\'がその前に置かれないかぎり、 通常の文字となります。
たとえば、`f'は特殊文字ではありませんから通常の文字で、 したがって`f'は、文字列`f'に一致し、そのほかのものには一致 しない正規表現です (これは文字列`ff'には一致しません)。 同様に、`o'は`o'のみに一致する正規表現です。
任意の二つの正規表現aとbをつなぐことができます。 aとbを連結した結果は、 aがある文字列の頭の部分に一致し、 bがその文字列の残りの部分に一致する場合、その文字列に一致する 正規表現になります。
簡単な例として、 正規表現`f'と`o'を連結して 正規表現`fo'を得ることができます。 これは文字列`fo'だけに一致します。 ここまではまだあたりまえの話です。 何か強力なことを行なうためには、 特殊文字を用いる必要があります。 以下にそれらのリストを示します。
"\\\\"
です。注意:過去との互換性のため、 特殊文字はその特別な意味が意味をもたない文 脈では普通の文字として扱われます。 たとえば、`*foo'では`*'の作用すべき先行正規表現がないため、 `*'を通常の文字として扱います。 この動きに依存するのはよいことではありません。 それがどこに現われるにせよ、 特殊文字はquoteしておいたほうがよいでしょう。ほとんどの場合、任意の文字が後続する`\'は、その文字にのみ一致します。 しかしながら、いくつか例外が存在します。 それは`\'が先行するときに特別な構文要素になる文字の場合です。 このような文字は、それだけの場合、常に通常の文字になります。 以下にこの`\'構成要素の表を示します。
以下の正規表現の構文要素は、空文字列に一致します。 つまり、文字には当たりません。 しかし、一致は文脈には依存します。
すべての文字列が、正しい正規表現というわけではありません。
たとえば、不釣り合いな角括弧は不正ですし
(`[]]'といった例外はありますが)、
単一の`\'で終る文字列も不正です。
不正な正規表現を検索関数のいずれかに渡した場合は、
invalid-regexp
エラーが通知されます。
(regexp-quote "^The cat$") => "\\^The cat\\$"
完全な文字列の一致と正規表現で記述した文脈との組み合せに、
regexp-quote
を使うということもできます。
次の例では、
空白で囲んだstring
という値の文字列を検索しています。
(re-search-forward (concat "\\s-" (regexp-quote string) "\\s-"))
以下に、
文末とそれに続く空白を認識するのにEmacsが用いている
複雑なregexpを示します。
これは変数 sentence-end
の値です。
まずこのregexpを、 スペースとタブ文字が区別できるようになるLisp構文の文字列として 示すことにします。 Lisp構文において、文字列定数は二重引用符で始まり二重引用符で終ります。 `\"'は文字列の一部としての二重引用符を示し、 `\\'は文字列の一部としてのバックスラッシュを、 `\t'はタブを、 `\n'は改行を示します。
"[.?!][]\"')}]*\\($\\| $\\|\t\\| \\)[ \t\n]*"
一方、変数sentence-end
を評価すると、
以下のものが得られます。
sentence-end => "[.?!][]\"')}]*\\($\\| $\\| \\| \\)[ ]*"
ここでは、タブと改行はそのまま出力されます。
この正規表現は、連続した四つの部分から構成されており、 以下のように解読することができます。
[.?!]
[]\"')}]*
\"
はLisp構文で文字列中の二重引用符です。
末尾の`*'は直前の正規表現(この場合は文字集合)が、
0回以上繰り返すことを示します。
\\($\\| $\\|\t\\| \\)
[ \t\n]*
GNU Emacsでは、次にあるregexpへの一致を求め、
段階的もしくは普通の検索を行なうことができます。
段階的検索のコマンドについてはsection `Regular Expression Search' in The GNU Emacs Manualを参照してください。
ここで述べるのは、プログラムに便利な検索関数だけです。
一番重要なのがre-search-forward
です。
もしlimitが非nil
(これはカレント・バッファ内の位置でなくてはいけません)の場合、
これは検索の上限になります。
この位置を越えるものとは照合しません。
検索が失敗したときの動作は、noerrorの値によります。
もしnoerrorがnil
ならば、
search-failed
エラーが通知されます。
もしnoerrorがt
の場合、
re-search-forward
は何もせずnil
を返します。
もしnoerrorがnil
でもt
でもない場合、
re-search-forward
は
ポイントをlimit(またはバッファの終り)まで動かし、
nil
を返します。
もしrepeatが与えられた場合 (正数でなければなりません)、 その回数だけ (毎回前の一致の末尾から) 検索を繰り返します。 もしこの連続検索が成功したら、 ポイントを動かし新しい値を返します。 さもないと検索は失敗します。
次の例において、ポイントは最初`T'の前に置かれています。
検索の呼出しを評価した後、ポイントを行末
(`hat'のt
と改行との間)に動かします。
---------- Buffer: foo ---------- I read "-!-The cat in the hat comes back" twice. ---------- Buffer: foo ---------- (re-search-forward "[a-z]+" nil t 5) => 27 ---------- Buffer: foo ---------- I read "The cat in the hat-!- comes back" twice. ---------- Buffer: foo ----------
この関数は、re-search-forward
と似ていますが、
単純な鏡像ではありません。
re-search-forward
は照合の開始が出発点になるべく近い箇所を見つけます。
もしre-search-backward
が完全な鏡像であれば、
照合の終了がなるべく近い箇所を見つけるでしょう。
しかしながら、これは照合の開始がなるべく近い箇所を見つけます。
この理由は、与えられた点からの正規表現の照合が常に先頭から末尾へ、
そして指定した先頭位置から開始するためです。
re-search-forward
の真の鏡像には、
末尾から先頭にregexpを照合させる特殊な機能が必要です。
これは面倒で実装するほどの価値はありません。
nil
を返します。
startが非nil
の場合、
検索はstring中のその添字から行ないます。
たとえば、
(string-match "quick" "The quick brown fox jumped quickly.") => 4 (string-match "quick" "The quick brown fox jumped quickly." 8) => 27
文字列の最初の文字の添字は0で、 次の文字の添字は1、などなどとなります。
この関数が戻った後で、
一致部分を過ぎた最初の文字の添字は(match-end 0)
で得られます。See section 一致データ。
(string-match "quick" "The quick brown fox jumped quickly." 8) => 27 (match-end 0) => 32
t
で、
そうならない場合nil
になります。
ポイントは動かしませんが、
match-beginning
とmatch-end
でアクセスできる一致データを
更新します。See section 一致データ。
次の例において、ポイントは`T'の直前にあります。
別の場所に置かれていたとすると、結果はnil
になったはずです。
---------- Buffer: foo ---------- I read "-!-The cat in the hat comes back" twice. ---------- Buffer: foo ---------- (looking-at "The cat in the hat$") => t
通常の正規表現の関数群は、 `\|'と繰り返しの構文要素を処理するために、 必要に応じバックトラックを行ないますが、 続行は少しでも一致が見つかる間だけでしかありません。 このとき関数は成功し最初の一致を返します。
この節では、正規表現照合のPOSIX標準で規定された 完全なバックトラックを行なう代替の検索関数について述べます。 これはすべての可能性を試し、 すべての一致を見つけるまでバックトラックを継続するので、 POSIXで要求されているように、最長の一致を報告することができます。 これはとても遅いので、 本当に最長の一致が必要なときだけこの関数を使うようにしてください。
Emacsバージョン19.29以前には、これらの関数はありません。 前述の関数が完全なPOSIXバックトラックを実装していました。
re-search-forward
に似ていますが、
POSIX標準の正規表現照合で規定されている完全なバックトラックを行ないます。
re-search-backward
に似ていますが、
POSIX標準の正規表現照合で規定されている完全なバックトラックを行ないます。
looking-at
に似ていますが、
POSIX標準の正規表現照合で規定されている完全なバックトラックを行ないます。
string-match
に似ていますが、
POSIX標準の正規表現照合で規定されている完全なバックトラックを行ないます。
query-replace
や関連するコマンドの本体です。
これはfrom-stringの出現箇所を検索し、
一部あるいは全部を置換します。
もしquery-flagがnil
ならば、すべての出現箇所を置換します。
そうでないとき、各出現箇所についてユーザにどうしたらいいか尋ねます。
もしregexp-flagが非nil
ならば、
from-stringは正規表現とみなします。
さもないと文字どおりの照合になります。
もしdelimited-flagが非nil
ならば、
語境界で囲まれた置換だけが対象になります。
引数replacementsは出現したものに置き換えるものを指定します。 もしこれが文字列なら、この文字列を使います。 文字列のリストの場合、これを周期的に使います。
もしrepeat-countが非nil
ならば、
整数でなければなりません。
このときreplacements中の次の文字列に進む前に、
各文字列を何回使うのかを指定します。
通常は、
キーマップquery-replace-map
が、
問い合わせにたいするユーザのとりうる反応を定義します。
引数mapが非nil
ならば、
query-replace-map
の代わりに使うキーマップとなります。
y-or-n-p
やmap-y-or-n-p
同様、
query-replace
や関連する関数における
ユーザの有効な反応を定義する特殊なキーマップです。
通常のそれと2点異なるところがあります。
次はquery-replace-map
で意味のある「バインド」です。
いくつかはquery-replace
一族でのみ意味をもちます。
act
skip
exit
act-and-exit
act-and-show
automatic
backup
edit
delete-and-edit
recenter
quit
y-or-n-p
と関連した関数だけがこの答えを使います。
help
Emacsは、 正規表現の検索で見つけたテキストの開始と終了の位置をおぼえています。 これは、たとえば、Rmailメッセージの日付のような複雑なパターンの検索ができ、 そして、パターンの制御下にある一致の部分的取り出しができる、 という意味です。
一致データは通常、一番最後の検索だけを記憶するので、 後で参照する検索と一致データの利用の間で、 別な検索をしないように注意深く、 気を配らなければなりません。 中間の検索が避けられない場合、 上書きをされないように、 一致データの保存と復帰を前後で行なわなければなりません。
この節では、直前の検索照合操作で何が一致したか見つけるための、 一致データの使い方を説明します。
一致テキストの全体と、 括弧でくくった特定の正規表現の部分式 (subexpression) とを求めることができます。 以下の関数のcount引数がどちらなのかを指定します。 もしcountが0ならば、一致全体を求めます。 もしcountが正ならば、どの部分式が必要かを指定します。
正規表現の部分式は、 エスケープした括弧`\(...\)'でくくることを思い出してください。 count番目の部分式は、 正規表現全体の先頭から`\('の出現順に数えます。 最初は1、次は2、などなどとなります。 正規表現だけに部分式があります。 単純な文字列検索で有効な情報は、一致全体です。
nil
です。
もしそのような最後の操作が文字列にたいするstring-match
の場合、
同じ文字列を引数in-stringとして渡さなければなりません。
そうでない場合、つまりバッファにたいする検索照合では、
in-stringを省略するかnil
を与えなければなりません。
その際、match-string
を呼ぶときのカレント・バッファは、
検索照合を行なったバッファと同じくなるようにしてください。
countが0の場合、 値はregexp全体に一致したテキストの開始位置です。 そうでない場合、 countは正規表現のどの部分式の開始位置を返すかを指定し、 関数の値は部分式への一致の開始位置です。
一致の起きなかった`\|'選択肢の内部の部分式にたいしての値は、
nil
になります。
match-beginning
と似ていますが、
最後の正規表現検索で一致したテキストの開始位置ではなく、
終了位置を返します。
一致データの使用例です。コメントはテキスト中の位置を示します。
(string-match "\\(qu\\)\\(ick\\)" "The quick fox jumped quickly.") ;0123456789 => 4 (match-string 0 "The quick fox jumped quickly.") => "quick" (match-string 1 "The quick fox jumped quickly.") => "qu" (match-string 2 "The quick fox jumped quickly.") => "ick" (match-beginning 1) ; `qu'の一致は => 4 ; 添字4から始まる。 (match-beginning 2) ; `ick'の一致は => 6 ; 添字6から始まる。 (match-end 1) ; `qu'との一致は => 6 ; 添字6で終る。 (match-end 2) ; `ick'との一致は => 9 ; 添字9で終る。
次の例において、ポイントは行頭に置かれています。 検索後のポイントは、スペースと語`in'との間になります。 一致全体の開始位置は、 バッファの9番目の文字(`T')であり、 最初の部分式の一致の開始位置は、 13番目の文字(`c')です。
(list (re-search-forward "The \\(cat \\)") (match-beginning 0) (match-beginning 1)) => (9 9 13) ---------- Buffer: foo ---------- I read "The cat -!-in the hat comes back" twice. ^ ^ 9 13 ---------- Buffer: foo ----------
(この場合では、返される添字はバッファ内位置です。 バッファの最初の文字は1になります。)
この関数は、 最後の検索で一致したテキストをreplacementで置き換えます。
最後の検索をバッファで行なった場合、
stringにはnil
を指定します。
このときreplace-match
はバッファを編集し置換を行ないます。
この関数は、ポイントを置換テキストの終りに置いて、
t
を返します。
検索したのがバッファでなく文字列だった場合、
同じ文字列をstringに渡します。
するとreplace-match
は新しい文字列を構成してそれを返します。
fixedcaseが非nil
の場合、
それで置き換えるテキストの大文字小文字の違いは変更しません。
そうでない場合、置き換えられるテキストのcapitalizationにしたがい、
置き換えるテキストを大文字小文字の間で変換します。
元のテキストがすべて大文字の場合、
置き換えるテキストを大文字に変換します。
もし元のテキストの最初の語が大文字で始まっている
(capitalized)なら、
置き換えるテキストの最初の語を大文字で始め
(capitalize)ます。
もし元のテキストが1語しかなく、その語が1文字の大文字であるなら、
replace-match
はこれをすべて大文字とは見ずに、
まず最初の語が大文字で始まっている
(capitalized)とみなします。
もしcase-replace
がnil
ならば、
fixed-caseの値にかかわらず、
大文字小文字変換は行ないません。See section 検索と大文字小文字の区別。
literalが非nil
の場合、
大文字小文字の変更を生じうる点は除いてreplacementをそのまま挿入します。
もしこれが(デフォルト値の)nil
で
ある場合、文字`\'を特別扱いします。
もしreplacementに`\'が現われる場合、
以下の列のいずれかの一部分でなくてはいけません。
関数match-data
とset-match-data
は、
一度に一致データを読み書きできます。
(match-beginning n)
に対応し、
は(match-end n)
に対応します。
バッファにたいする一致の場合、全要素はマーカか nil
で、
string-match
で文字列の一致をした場合、
全要素は整数かnil
です
(Emacsバージョン18やそれ以前のバージョンでは、整数0の場合をのぞき、
文字列にたいしてもマーカを使っていました)。
いつものように、
検索の呼出しとその検索の一致データをアクセスしようと
しているmatch-data
の呼出しとの間に、
別の検索がはいり込むようなことがあってはいけません。
(match-data) => (#<marker at 9 in foo> #<marker at 17 in foo> #<marker at 13 in foo> #<marker at 17 in foo>)
match-list
の要素に設定します。
match-list
は、
以前にmatch-data
の呼出しが返した値のリストでなくてはいけません。
もしmatch-listが存在しないバッファを参照していても、 エラーにはなりません。 一致データが、無害ではありますが、意味のないものになるだけです。
検索を行なうかもしれない関数を呼び出すとき、 もし前の検索の一致データを後で使うために保存したいなら、 その呼出しの前後で一致データの保存と復帰をする必要があるかもしれません。 次の例は、一致データの保存をしないために起きる問題を示しています。
(re-search-forward "The \\(cat \\)")
=> 48
(foo) ; 多分foo
は、
; 検索を行なう。
(match-end 0)
=> 61 ; 予期せぬ結果。48にあらず!
一致データの保存と復帰はsave-match-data
で行なうことができます。
set-match-data
とmatch-data
で
特殊形式save-match-data
をまねることができます。
これはEmacs 18でも動作するコードを書くとき便利です。
それには以下のようにします。
(let ((data (match-data))) (unwind-protect ... ; もとの一致データを変えてしまうかもしれない。 (set-match-data data)))
プロセス・フィルター関数(see section プロセス・フィルタ関数)と プロセスの見張り(see section 監視関数: プロセスのステータス変化の検出)を実行するとき、 Emacsは自動的に一致データの保存と復帰を行ないます。
デフォルトでは、 Emacsにおける検索は検索対象のテキストにおける大文字小文字の区別は無視します。 `FOO'の検索を指示した場合、 `Foo'も`foo'も照合の対象とみなします。 これはregexpそして特に文字集合 (での検索) にも適用します。 したがって`[aB]'は、 `a'にも`A'にも`b'にも`B'にも一致します。
この機能がいらないとき、
変数case-fold-search
をnil
にします。
そうすると、大文字小文字の違いを含め、
すべての文字が厳密に一致しなくてはいけなくなります。
これはバッファローカルな変数です。
この変数の変更は、カレント・バッファにたいしてのみ影響を及ぼします
(See section バッファローカルな変数(紹介))。
そのかわりに、
まだcase-fold-search
を優先させていないバッファでのデフォルト値の、
default-case-fold-search
の値を変えることもできます。
ユーザ・レベルでの段階的検索機能では、 別な方法で大文字小文字の区別をしています。 小文字がきたときは両方を探しますが、 大文字がきたときは大文字だけしか探しません。 しかし、これはLisp関数の使う検索関数とは関係のないことです。
nil
ならば、置き換えテキストをそのまま使います。
非nil
の値は、
置き換えるテキストの大文字小文字を、
置き換えられるテキストにあわせて変換することを意味します。
関数replace-match
で
実際にこの変数が使われます。See section 一致したテキストの置換。
nil
の場合、大文字小文字の違いを無視しません。
そうでない場合は違いを無視します。
case-fold-search
のデフォルト値です。
これは(default-value 'case-fold-search)
と同じです。
この節では、 編集上のある目的で使用される正規表現を保持する変数について述べます。
"^\014"
(つまり"^^L"
あるいは"^\C-l"
)です。
改ページ文字で始まる行と一致します。
次の二つの正規表現は、一致が常に行頭から始まると仮定すべき ではありません。 照合位置を固定するのに`^'を使うべきではありません。 段落コマンドは大体、行頭でだけ一致を検査するため`^'は余計です。 非0の左マージンがあるときは、 左マージン後から始まる場合の一致も受けつけるべきです。 この場合`^'は誤りでしょう。 しかし、左マージンがないモードでは、 `^'は無害です。
paragraph-start
も変更する必要があります)。
デフォルト値は左マージンの後にスペース、
タブ、改ページだけしかない行に一致する、
"[ \t\f]*$"
です。
"[ \t\n\f]"
です。
"[.?!][]\"')}]*\\($\\| $\\|\t\\| \\)[ \t\n]*"
これは終止符、疑問符、感嘆符の後に省略可能な閉じ括弧、 そしてその後にタブ、スペース、改行がくるものです。
この正規表現の詳細については、section 複雑な正規表現の例を参照してください。
Go to the first, previous, next, last section, table of contents.