Next: , Previous: , Up: 置換コマンド   [Contents][Index]


16.10.3 置換コマンドとLaxマッチ

このサブセクションではlaxマッチに関する置換コマンドの振る舞いと、それをカスタマイズする方法を説明します。一般的には、ほとんどの置換は、それと同等な検索コマンドに比べて、デフォルトではより厳密なマッチを行ないます。

インクリメンタル検索とは異なり、置換コマンドはデフォルトではlax space matching(緩いスペースマッチング)を行いません(lax space matchingを参照してください)。置換でlax space matchingを有効にするには、変数replace-lax-whitespaceを非nilに変更してください(これはEmacsが置換文字列ではなく、置換するテキストを検索する方法だけに影響を与えます)。

query-replace-regexpがパターンを検索するときlax whitespace matchingを使うかどうかを制御するのは、それに対応する変数replace-regexp-lax-whitespaceです。

置換コマンドの最初の引数がすべて小文字の場合、置換のための検索において大文字小文字の違いを無視します。これはcase-fold-searchsearch-upper-caseがいずれも非nilの場合です。search-upper-case (search-upper-caseを参照)がnilなら、検索が大文字小文字を無視するかどうかは、コマンドの1つ目の引数が小文字かどうかと無関係にcase-fold-search単独で決定されます。case-fold-searchnilにセットすると、すべての検索において常に大文字小文字の違いが有効になります。

さらに置換コマンドの2つ目の引数のすべて、または一部が小文字の場合には、置換コマンドは大文字小文字が出現するパターンを維持しようと試みます。したがって以下のコマンド、

M-x replace-string RET foo RET bar RET

は小文字の‘foo’を小文字の‘bar’で置換し、すべて大文字の‘FOO’を‘BAR’、そして最初が大文字の‘Foo’を‘Bar’に置換します。(これら3つの候補、すなわち小文字、すべて大文字、先頭が大文字は、replace-stringが認識できる唯一のパターンです)。Emacsは置換されるテキストの単語それぞれを解析することによって、大文字あるいは先頭を大文字のどちらでテキストを置換するか判断すること、そしてcase(大文字小文字)が保たれるのは置換されるテキストのすべての単語が同じcaseの場合だけであることに注意してください。

M-x replace-string RET foo bar RET baz quux RET

Foo Bar’はどちらも先頭が大文字なので、‘Foo Bar’が‘Baz Quux’に置換されます。これとは対照的に同じコマンドなのに‘Foo bar’は‘baz quux’に置換されます(置換するテキストのあせは未変更のまま)。これは‘Foo bar’という2つの単語で異なるcapitalize(先頭だけ大文字化)が用いられているからです。正確には何をもって“単語(word)”とみなさすのかは、カレントバッファーで効力をもつ構文テーブル次第です(Syntax Tables in The Emacs Lisp Reference Manualを参照)。すなわちTextモードでは‘Foo_Bar’は2つの単語ですが、プログラミング言語をサポートするメジャーモードでは1つの単語かもしれません。

置換文字列に大文字が使われている場合、テキストが挿入されるときは、常に大文字のままとなります。大文字が最初の引数で使用されている場合、大文字小文字の変換なしで、2番目の引数に与えられたとおりに置換されます。同様にcase-replacecase-fold-searchの両方がnilにセットされている場合、大文字小文字の変換なしで置換されます。

デフォルトでは置換コマンドは、置換するテキストを探すとき、character folding(character foldingを参照してください)を使用しません。query-replacereplace-stringでのマッチングでcharacter foldingを有効にするには、変数replace-char-foldに非nil値をセットします(このセッティングは、Emacsが置換するテキストを探す方法だけに影響し、置換するテキストには影響を与えません。また、replace-regexpにも影響を与えません)。