本サブセクションでは、laxマッチ(検索時のlaxマッチを参照)に対する置換コマンドの動作と、そのカスタマイズ方法について説明します。一般的に、置換コマンドは検索コマンドよりも厳格なマッチングをデフォルトとする傾向があります。
インクリメンタル検索とは異なり、置換コマンドではデフォルトでlax space matching(lax space matchingを参照)は使用されません。置換時にlax space
matchingを有効にするには、変数 replace-lax-whitespace を nil
以外に変更してください。(これはEmacsが置換対象のテキストを検出する方法にのみ影響し、置換後のテキストには影響しません。)
コンパニオン変数 replace-regexp-lax-whitespace は、query-replace-regexp
がパターン検索時に緩い空白文字マッチングを使用するかどうかを制御します。
置換コマンドの第1引数がすべて小文字の場合、case-fold-search が nil ではなく、かつ 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
は置換対象のテキスト内の各単語を解析して、置換後のテキストを大文字にするか小文字にするかを決定し、置換されるテキストの文字ケースが保持されるのは、そのすべての単語が同じ文字ケースである場合に限られます。したがって、このコマンドは
M-x replace-string RET foo bar RET baz quux RET
‘Foo Bar’ 内の2つの単語がともに大文字であるため、‘Foo Bar’ は ‘Baz Quux’ に置換されます。対照的に、同じコマンドでも ‘Foo bar’ は ‘baz quux’ に置換されます。つまり、‘Foo bar’ 内の2つの単語で大文字・小文字の使い分けが異なるため、置換後のテキストの大文字・小文字は変更されません。何をもって「単語」とするかは、現在のバッファで有効な構文テーブルによって決まります(The Emacs Lisp Reference Manual の Syntax Tables を参照)。したがって、‘Foo_Bar’ はテキストモードでは2つの単語ですが、プログラミング言語をサポートする一部のメジャーモードでは単一の単語となる場合があります。
置換文字列に大文字が含まれている場合、そのテキストが挿入されるたびに大文字のままとなります。第1引数に大文字が含まれている場合、第2引数は常に大文字・小文字の変換なしに、指定された通りに置換されます。同様に、case-replace または case-fold-search のいずれかが nil
に設定されている場合、置換は大文字・小文字の変換なしに行われます。
置換コマンドは、デフォルトでは置換対象のテキストを検索する際に文字フォールディング(文字フォールディングを参照)を使用しません。query-replace および replace-string でのマッチングに文字フォールディングを有効にするには、変数 replace-char-fold に nil
以外の値を設定してください。(この設定は置換テキストには影響せず、Emacs が置換対象のテキストを検索する方法にのみ影響します。また、replace-regexp にも影響しません。)