Next: , Previous: , Up: 検索とマッチング   [Contents][Index]


35.7 検索と置換

バッファーのある部分でregexpにたいするすべてのマッチを見つけてそれらを置換したい場合には、以下のようにre-search-forwardreplace-matchを使用して明示的なループを記述するのがもっともフレキシブルな方法です:

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

replace-matchの説明はReplacing the Text that Matchedを参照してください。

特定のリージョンに置換を限定すれば、より便利かもしれません。関数replace-regexp-in-regionはこれを行います。

Function: replace-regexp-in-region regexp replacement &optional start end

この関数はバッファーのstartからendのテキストリージョンにあるすべてのregexpreplacementに置換する。startのデフォルトはポイント位置、endのデフォルトはバッファーのアクセス可能範囲の終端。regexpにたいする検索はcase(大文字小文字)を区別し、replacementは文字のcaseを変更せずに挿入される。replacement文字列にはreplace-matchで使用するような、同じ‘\’で始まる特殊要素を使用できる。この関数は置換した個数、regexpが見つからなければnilをリターンする。この関数はポイント位置を維持する。

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

この関数はreplace-regexp-in-regionと同様に機能するが、正規表現のかわりにリテラルのstringの検索と置換を行う。

Emacsには文字列内でマッチを置換する特別な関数もあります。

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

この関数はstringをコピーしてregexpにたいするマッチを検索、それらをrepに置き換える。これは変更されたコピーをリターンする。startが非nilならマッチにたいする検索はstring内のそのインデックスから開始されて、リターン値にはstringの最初のstart文字は含まれない。置き換え後の文字列全体を取得するには、stringの最初のstart文字とリターン値を結合すること。

この関数は置換を行うためにオプション引数fixedcaseliteralsubexpを渡してreplace-matchを使用する。

repは文字列のかわりに関数でもよい。この場合にはreplace-regexp-in-stringはそれぞれのマッチにたいして、そのテキストを単一の引数としてrepを呼び出す。これはrepがリターンする値を収集して、それを置換文字列としてreplace-matchに渡す。この時点でのマッチデータはstringの部分文字列にたいするregexpのマッチ結果。

Function: string-replace from-string to-string in-string

この関数はin-string内に出現するすべてのfrom-stringto-stringに置換して、その結果をリターンする。引数のいずれかを変更せずに、文字列定数が新たな文字列をリターンするかもしれない。case(大文字小文字)には意味があるが、テキストプロパティは無視する。

query-replaceの行に関するコマンドを記述したい場合には、perform-replaceを使用してこれを行うことができます。

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

これはquery-replaceおよび関連するコマンドの根幹となる関数である。これは位置startendの間にあるテキスト内に出現するfrom-stringの一部またはすべてを置換する。startnil (または省略)ならかわりにポイントを、endにはそのバッファーのアクセス可能範囲の終端が使用される(オピション引数backwardが非nilなら検索はendから後方に開始される)。

query-flagnilならすべてのマッチを置換する。それ以外なら、それぞれにたいしてユーザーにたいして何をすべきか問い合わせる。

regexp-flagが非nilならfrom-stringは正規表現、それ以外はリテラルとしてマッチしなければならない。delimited-flagが非nilなら単語境界に囲まれた置換だけが考慮される。

引数replacementsはマッチを何で置き換えるかを指定する。文字列ならその文字列を使用する。サイクル順に使用される文字列リストでもよい。

replacementsがコンスセル(function . data)なら、置換テキストを取得するためにそれぞれのマッチ後にfunctionを呼び出すことを意味する。この関数はdataとすでに置換された個数という、2つの引数で呼び出される。

repeat-countが非nilなら、それは整数であること。その場合にはサイクルを次に進める前に、replacementsリスト内の各文字列を何度使用するかを指定する。

from-stringが大文字アルファベットを含む場合には、perform-replacecase-fold-searchnilにバインドして大文字小文字を変換せずにreplacementsを使用する。

キーマップquery-replace-mapは通常は問い合わせにたいして可能なユーザー応答を定義する。引数mapが非nilなら、それはquery-replace-mapのかわりに使用するキーマップを指定する。

region-noncontiguous-pが非nilなら、startendの間のリージョンは非連続部分から構成されることを意味する。これのもっとも一般的な例は部分が開業文字で区切られた矩形リージョンである。

この関数はfrom-stringの次のマッチを検索するために2つの関数のうちいずれか1つを使用する。これらの関数は2つの変数replace-re-search-functionreplace-search-functionにより指定される。引数regexp-flagが非nilなら前者、nilなら後者が呼び出される。

Variable: query-replace-map

この変数はperform-replaceにたいする有効なユーザー応答を定義するスペシャルキーマップを保持して、コマンドはy-or-n-pmap-y-or-n-pと同様にそれを使用する。このマップは2つの点において普通のマップと異なる。

  • キーバインディングはコマンドではなく、このマップを使用する関数にとって意味のある単なるシンボルであること。
  • プレフィクスキーはサポートされない。各キーバインディングは単一イベントキーシーケンスでなければならない。この関数は入力を取得するために単一イベントを読み取って、それを“手動”で照合するのでread-key-sequenceを使用しないからである。

query-replace-mapにたいして意味をもつバインディングがあります。それらのうちいくつかはquery-replaceとその同族にたいしてのみ意味をもちます。

act

判断している対象にたいしてアクションを起こす(言い換えると“yes”)。

skip

この問いにたいしてアクションを起こさない(言い換えると“no”)。

exit

この問いにたいして“no”を答えて、さらに一連の問いすべてにたいして“no”が応答されたとみなして問い合わせをあきらめる。

exit-prefix

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

act-and-exit

この問いにたいして“yes”を答えて、さらに一連の問いすべてにたいして後続の問いに“no”が応答されるとみなして問い合わせをあきらめる。

act-and-show

この問いに“yes”を答えるが、結果を表示してまだ次の問いへ進まない。

automatic

これ以上のユーザーとの対話を行わず、この問いと後続の問いにたいして“yes”を答える。

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

即座にquitを行う。この問いにはy-or-n-pと関連する関数だけが使用される。

help

ヘルプを表示して再度尋ねる。

Variable: multi-query-replace-map

この変数はマルチバッファー置換で有用な追加キーバインディングを提供することによりquery-replace-mapを拡張するキーマップを保持する。追加されるバインディングは以下のとおり:

automatic-all

残りすべてのバッファーにたいして、それ以上の対話をせずその問いと後続のすべての問いに“yes”を答える。

exit-current

この問いに“no”を答えてカレントバッファーにたいする一連の問いすべてをあきらめる。そしてシーケンス内の次のバッファーへ問いを継続する。

Variable: replace-search-function

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

Variable: replace-re-search-function

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


Next: 編集で使用される標準的な正規表現, Previous: マッチデータ, Up: 検索とマッチング   [Contents][Index]