バッファの一部で正規表現に一致する箇所をすべて検索して置換したい場合、最も柔軟な方法は、次のように re-search-forward と replace-match を用いて明示的なループを記述することです。
(while (re-search-forward "foo[ \t]+bar" nil t) (replace-match "foobar"))
replace-match の説明については、一致したテキストの置換を参照してください。
置換を特定の領域に限定した方が便利かもしれません。replace-regexp-in-region
関数がそれを行います。
この関数は、バッファテキスト内の start から end
までの範囲において、regexp のすべての出現箇所を replacement に置換します。start
はデフォルトでポイントの位置となり、end
はデフォルトでバッファの最後にアクセス可能な位置となります。regexp
の検索は大文字小文字を区別し、replacement は大文字小文字を変更せずに挿入されます。replacement 文字列には、replace-match
と同様に ‘\’
で始まる同じ特殊要素を使用できます。この関数は、置換された箇所の数を返すか、regexp
が見つからない場合は nil を返します。また、この関数はポイントの位置を保持します。
(replace-regexp-in-region "foo[ \t]+bar" "foobar")
この関数は replace-regexp-in-region
と同様に動作しますが、正規表現の代わりにリテラルの string を検索して置換します。
Emacsには、文字列内のマッチ箇所を置換するための専用機能もあります。
この関数は string をコピーし、その中で regexp
に一致する箇所を検索して rep に置換します。そして、修正後のコピーを返します。start が nil でない場合、一致箇所の検索は string のそのインデックスから開始され、返される値には string の先頭 start
文字は含まれません。変換後の文字列全体を取得するには、string の先頭 start 文字を返値に連結してください。
この関数は replace-match を使用して置換を行い、オプション引数の fixedcase、literal、subexp を replace-match に渡します。
文字列の代わりに、rep は関数にすることもできます。その場合、replace-regexp-in-string はマッチごとに rep を呼び出し、マッチしたテキストを唯一の引数として渡します。rep が返す値を収集し、それを置換文字列として replace-match に渡します。この時点でのマッチデータは、regexp を string
の部分文字列にマッチさせた結果となります。
この関数は、in-string 内の from-string をすべて to-string に置換し、その結果を返します。引数のいずれかをそのまま、あるいは定数文字列や新しい文字列として返す場合があります。大文字と小文字は区別され、テキストプロパティは無視されます。
query-replaceのようなコマンドを書きたい場合は、perform-replaceを使って処理できます。
この関数は query-replace および関連コマンドの中核となる機能です。位置 start から end までのテキスト内で from-string の出現箇所を検索し、その一部またはすべてを置換します。start が nil
である(または省略されている)場合は、代わりに point が使用され、バッファのアクセス可能な範囲の末尾が end として使用されます。(オプション引数 backward が
nil 以外の場合、検索は end
から始まり、後方に向かって行われます。)
query-flag が nil
であればすべての出現箇所を置換し、そうでなければそれぞれの箇所をどう処理するかをユーザーに尋ねます。
regexp-flag が nil
以外の場合、from-string
は正規表現として扱われます。そうでない場合は、リテラルとして一致する必要があります。 delimited-flag が nil
以外の場合、単語境界に囲まれた置換のみが対象となります。
引数 replacements は、置換後の文字列を指定します。文字列の場合はその文字列が使用されます。また、文字列のリストを指定することもでき、その場合は循環的に使用されます。
replacements がコンスセルである場合、(function . data)
は、各マッチ後に function
を呼び出して置換後のテキストを取得することを意味します。この関数は、data
と既に行われた置換回数という2つの引数で呼び出されます。
repeat-count が nil
以外の場合、整数である必要があります。これにより、次のリストへ循環的に進む前に、replacements
リスト内の各文字列をそれぞれ何回使用するかが指定されます。
from-string に大文字が含まれている場合、perform-replace は case-fold-search を nil
にバインドし、replacements は大文字・小文字を変更せずに使用します。
通常、キーマップ query-replace-map
はクエリに対する可能なユーザー応答を定義します。引数 map が nil 以外の場合、query-replace-map
の代わりに使用するキーマップを指定します。
Non-nil region-noncontiguous-p は、start と
end
の間の領域が非連続な断片で構成されていることを意味します。最も一般的な例は矩形領域で、断片同士が改行文字によって区切られています。
この関数は、2つの関数のいずれかを用いて from-string
の次の出現箇所を検索します。これらの関数は、2つの変数 replace-re-search-function と replace-search-function の値によって指定されます。引数 regexp-flag が nil
以外の場合は前者が、nil の場合は後者が呼び出されます。
この変数には、perform-replace およびそれを使用するコマンド、ならびに y-or-n-p と map-y-or-n-p
に対する有効なユーザー応答を定義する特殊なキーマップが格納されています。このマップには、2つの点で特異な特徴があります:
read-key-sequence
を使用して入力を取得するのではなく、単一のイベントを読み取り、それを「手動で」参照するためです。
以下は query-replace-map
の意味のあるバインディングです。そのうちいくつかは、query-replace
およびその類にのみ意味を持ちます。
act検討中の措置をぜひ講じてください――言い換えれば、「はい」ということです。
skipこの問題については行動を起こさないでください――言い換えれば、「いいえ」です。
exitこの質問に「いいえ」と答え、回答がすべて「いいえ」になると想定して、一連の質問を切り上げてください。
exit-prefixexit と同様ですが、押されたキーを unread-command-events に追加します(イベント入力のその他の機能 を参照)。
act-and-exitこの質問に「はい」と答え、それ以降の回答は「いいえ」になると想定して、一連の質問をすべて諦めてください。
act-and-showこの質問には「はい」と答え、結果を示してください。まだ次の質問に進んではいけません。
automaticこの質問および以降のシリーズのすべての質問に、ユーザーによる追加操作なしに「はい」で回答してください。
backup質問が出された直前の箇所に戻る。
undo直前の置換を取り消し、その置換が行われた箇所に戻る。
undo-allすべての置換を元に戻し、最初の置換を行った箇所に戻る。
edit通常取られる他の操作ではなく、この質問に対処するための再帰的な編集を入力してください。
edit-replacementミニバッファでこの質問の置換内容を編集してください。
delete-and-edit対象のテキストを削除し、それに置き換える再帰的な編集を入力してください。
recenterscroll-upscroll-downscroll-other-windowscroll-other-window-down指定されたウィンドウスクロール操作を実行し、その後、同じ質問を再度行います。この回答を使用するのは y-or-n-p および関連関数のみです。
quit直ちに終了してください。この回答を使用するのは y-or-n-p および関連関数のみです。
helpヘルプを表示してから、再度質問してください。
この変数には、マルチバッファ置換で有用な追加のキーバインドを提供することで query-replace-map を拡張するキーマップが格納されています。追加のバインドは以下の通りです:
automatic-all残りのすべてのバッファについて、この質問および以降の一連の質問に、ユーザーによる追加操作なしに「はい」で回答してください。
exit-currentこの質問に「いいえ」と答え、現在のバッファにおける一連の質問をすべて断念してください。続いて、シーケンス内の次のバッファに進んでください。