GNU Emacs 32.0.50 (9008bf64c3) のマニュアルを PLaMo 翻訳で機械翻訳したものです。誤訳を含むことがあります。原文: https://www.gnu.org/software/emacs/manual/html_node/elisp/Search-and-Replace.html ・ emacs-doc.conao3.com

35.7 検索と置換

バッファの一部で正規表現に一致する箇所をすべて検索して置換したい場合、最も柔軟な方法は、次のように re-search-forward と replace-match を用いて明示的なループを記述することです。

(while (re-search-forward "foo[ \t]+bar" nil t)
  (replace-match "foobar"))

replace-match の説明については、一致したテキストの置換を参照してください。

置換を特定の領域に限定した方が便利かもしれません。replace-regexp-in-region 関数がそれを行います。

関数: replace-regexp-in-region regexp replacement &optional start end

この関数は、バッファテキスト内の start から end までの範囲において、regexp のすべての出現箇所を replacement に置換します。start はデフォルトでポイントの位置となり、end はデフォルトでバッファの最後にアクセス可能な位置となります。regexp の検索は大文字小文字を区別し、replacement は大文字小文字を変更せずに挿入されます。replacement 文字列には、replace-match と同様に ‘\’ で始まる同じ特殊要素を使用できます。この関数は、置換された箇所の数を返すか、regexp が見つからない場合は nil を返します。また、この関数はポイントの位置を保持します。

(replace-regexp-in-region "foo[ \t]+bar" "foobar")
関数: replace-string-in-region string replacement &optional start end

この関数は replace-regexp-in-region と同様に動作しますが、正規表現の代わりにリテラルの string を検索して置換します。

Emacsには、文字列内のマッチ箇所を置換するための専用機能もあります。

関数: replace-regexp-in-string regexp rep string &optional fixedcase literal subexp start

この関数は 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 の部分文字列にマッチさせた結果となります。

関数: string-replace from-string to-string in-string

この関数は、in-string 内の from-string をすべて to-string に置換し、その結果を返します。引数のいずれかをそのまま、あるいは定数文字列や新しい文字列として返す場合があります。大文字と小文字は区別され、テキストプロパティは無視されます。

query-replaceのようなコマンドを書きたい場合は、perform-replaceを使って処理できます。

関数: perform-replace from-string replacements query-flag regexp-flag delimited-flag &optional repeat-count map start end backward region-noncontiguous-p

この関数は 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 の場合は後者が呼び出されます。

変数: query-replace-map

この変数には、perform-replace およびそれを使用するコマンド、ならびに y-or-n-p と map-y-or-n-p に対する有効なユーザー応答を定義する特殊なキーマップが格納されています。このマップには、2つの点で特異な特徴があります:

  • キーバインドはコマンドではなく、このマップを使用する関数にとって意味を持つ単なるシンボルです。
  • プレフィックスキーはサポートされていません。各キーバインドは、単一イベントのキーシーケンスである必要があります。これは、関数が read-key-sequence を使用して入力を取得するのではなく、単一のイベントを読み取り、それを「手動で」参照するためです。

以下は query-replace-map の意味のあるバインディングです。そのうちいくつかは、query-replace およびその類にのみ意味を持ちます。

act

検討中の措置をぜひ講じてください――言い換えれば、「はい」ということです。

skip

この問題については行動を起こさないでください――言い換えれば、「いいえ」です。

exit

この質問に「いいえ」と答え、回答がすべて「いいえ」になると想定して、一連の質問を切り上げてください。

exit-prefix

exit と同様ですが、押されたキーを unread-command-events に追加します(イベント入力のその他の機能 を参照)。

act-and-exit

この質問に「はい」と答え、それ以降の回答は「いいえ」になると想定して、一連の質問をすべて諦めてください。

act-and-show

この質問には「はい」と答え、結果を示してください。まだ次の質問に進んではいけません。

automatic

この質問および以降のシリーズのすべての質問に、ユーザーによる追加操作なしに「はい」で回答してください。

backup

質問が出された直前の箇所に戻る。

undo

直前の置換を取り消し、その置換が行われた箇所に戻る。

undo-all

すべての置換を元に戻し、最初の置換を行った箇所に戻る。

edit

通常取られる他の操作ではなく、この質問に対処するための再帰的な編集を入力してください。

edit-replacement

ミニバッファでこの質問の置換内容を編集してください。

delete-and-edit

対象のテキストを削除し、それに置き換える再帰的な編集を入力してください。

recenter
scroll-up
scroll-down
scroll-other-window
scroll-other-window-down

指定されたウィンドウスクロール操作を実行し、その後、同じ質問を再度行います。この回答を使用するのは y-or-n-p および関連関数のみです。

quit

直ちに終了してください。この回答を使用するのは y-or-n-p および関連関数のみです。

help

ヘルプを表示してから、再度質問してください。

変数: multi-query-replace-map

この変数には、マルチバッファ置換で有用な追加のキーバインドを提供することで query-replace-map を拡張するキーマップが格納されています。追加のバインドは以下の通りです:

automatic-all

残りのすべてのバッファについて、この質問および以降の一連の質問に、ユーザーによる追加操作なしに「はい」で回答してください。

exit-current

この質問に「いいえ」と答え、現在のバッファにおける一連の質問をすべて断念してください。続いて、シーケンス内の次のバッファに進んでください。

変数: replace-search-function

この変数は、perform-replace が次に置換する文字列を検索するために呼び出す関数を指定します。デフォルト値は search-forward です。それ以外の値を指定する場合は、3つの引数を取る関数を指定する必要があります。その引数は search-forward の最初の3つの引数となります(文字列の検索 を参照)。

変数: replace-re-search-function

この変数は、perform-replace が置換対象の次の正規表現を検索するために呼び出す関数を指定します。デフォルト値は re-search-forward です。それ以外の値を指定する場合は、3つの引数を取る関数を指定する必要があります。その引数は re-search-forward の最初の3つの引数となります(正規表現検索 を参照)。