このサブセクションでは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-search
とsearch-upper-case
がいずれも非nil
の場合です。search-upper-case
(search-upper-caseを参照)がnil
なら、検索が大文字小文字を無視するかどうかは、コマンドの1つ目の引数が小文字かどうかと無関係にcase-fold-search
単独で決定されます。case-fold-search
をnil
にセットすると、すべての検索において常に大文字小文字の違いが有効になります。
さらに置換コマンドの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-replace
とcase-fold-search
の両方がnil
にセットされている場合、大文字小文字の変換なしで置換されます。
デフォルトでは置換コマンドは、置換するテキストを探すとき、character folding(character
foldingを参照してください)を使用しません。query-replace
とreplace-string
でのマッチングでcharacter
foldingを有効にするには、変数replace-char-fold
に非nil
値をセットします(このセッティングは、Emacsが置換するテキストを探す方法だけに影響し、置換するテキストには影響を与えません。また、replace-regexp
にも影響を与えません)。