Next: , Previous: , Up: Searching and Matching   [Contents][Index]


34.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を参照してください。

しかし文字列内のマッチの置換、特に置換を効果的に行いたい場合には、より複雑になります。そのためにEmacsはこれを行うための関数を提供します。

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

この関数はstringをコピーしてregexpにたいするマッチを検索、それらをrepに置き換える。これは変更されたコピーをリターンする。startが非nilならマッチにたいする検索はstring内のそのインデックスから開始されて、そのインデックスより前で始まるマッチは変更されない。

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

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

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つの点において普通のマップと異なる。

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

act

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

skip

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

exit

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

exit-prefix

exitと似ているが、unread-command-eventsにたいして押下されたキーを追加する(Event Input Miscを参照)。

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つの引数を引数とする関数を指定すること(String Searchを参照)。

Variable: replace-re-search-function

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