Next: , Previous: , Up: Search   [Contents][Index]


15.9 検索中のLaxマッチング

あなたは通常、タイプした文字と、検索されるテキストの間にある、特定の瑣末な違いを、検索コマンドが無視することを望むでしょう。たとえば長さが異なる空白文字シーケンスは通常、等しいとみなされ、大文字小文字の違いは通常問題にならない、などです。これは等価文字(character equivalence)として知られています。

このセクションではEmacsのlax search(緩い検索)機能と、それを必要に応じて調整する方法について説明します。

デフォルトでは、検索コマンドはlax space matching(緩いスペースマッチング)を行います。これはスペースおよび一連のスペースは、テキスト中の1つまたはそれ以上の空白文字にマッチします(インクリメンタルregexp検索は別のデフォルトをもちます。Regexp Searchを参照してください)。したがって‘foo barは‘foo bar、‘foo  bar、‘foo   bar、...にマッチします(‘foobar’にはマッチしません)。正確にいうと、Emacsは検索文字列中の一連のスペースを、変数search-whitespace-regexpで指定された正規表現にマッチさせます。たとえばスペースを一連の改行とスペースにマッチさせるには、変数に‘"[[:space:]\n]+"’をセットします。この変数のデフォルト値は、そのバッファーのメジャーモードに依存します。ほとんどのメジャーモードは、スペース、タブ、フォームフィード文字を空白文字としてクラス化します。

空白文字を正確にマッチさせたい場合は、インクリメンタル検索中にM-s SPC (isearch-toggle-lax-whitespace)とタイプすることにより、lax space matchingをオフに切り替えることができます。もう1度M-s SPCとタイプすると、lax space matchingふぁオンに切り替わります。すべての検索でlax space matchingを無効にするには、search-whitespace-regexpnilに変更します。これにより検索文字列の中のスペースは、正確に1つのスペースにマッチするようになります。

Emacsでの検索では、検索文字列を小文字で指定した場合、デフォルトでは検索するテキストの大文字小文字は区別されません。したがって‘foo’を検索すると、‘Foo’や‘fOO’もマッチします。regexp、特に文字集合でも同様に振る舞います。つまり‘[ab]’は、‘a’、‘A’、‘b’、‘B’もマッチします。この機能はcase foldingとして知られており、これはインクリメンタル検索と非インクリメンタル検索の両方でサポートされています。

検索文字列のどこかに大文字があると、検索はcase-sensitive(大文字小文字を区別する)になります。したがって‘Foo’を検索すると、‘foo’や‘FOO’は検索されません。これは正規表現検索でもリテラル文字列検索と同様に適用されます。検索文字列から大文字を削除すると、効果はなくなります。変数search-upper-caseがこれを制御します。この変数が非nil(デフォルト)の場合、検索文字列の中の大文字は、検索をcase-sensitiveにします。これをnilにセットすることにより、大文字によるこの効果は無効になります。

変数case-fold-searchnilをセットすると、すべての文字は大文字小文字を含めて、完全にマッチしなければなりません。これはバッファーごとの変数で、変数の変更はデフォルト値を変えない限り、通常はカレントバッファーだけが影響を受けます。Localsを参照してください。これは置換コマンド(Replaceを参照してください)や、ミニバッファーのヒストリー検索(Minibuffer Historyを参照してください)を処理する、非インクリメンタル検索にも適用されます。

インクリメンタル検索でM-c、またはM-s c (isearch-toggle-case-fold)とタイプすると、検索が大文字小文字を区別するかが、切り替わります。この効果は、現在の検索を超えて引き継がれませんが、カレントの検索にたいして大文字を追加・削除したときの効果をオーバーライドします.

特定のコマンドや操作にたいする検索やマッチングにおいて、大文字小文字の区別を制御する変数がいくつかあります。たとえばtags-case-fold-searchは、find-tagでの大文字小文字の区別を制御します。これらの変数を探すには、M-x apropos-variable RET case-fold-search RETとタイプしてください。

case foldingでは、文字の大文字小文字の違いを無視するので、大文字は小文字にマッチし、その逆もマッチします。case foldingを一般化したものがcharacter foldingで、これは類似した文字間の違いの、より広いクラスを無視します。たとえばcharacter foldingでは、文字aäáのようなアクセント付きの類似文字にもマッチし、これらの変種を区別するための特殊記号も無視します。加えてaは、aに似ている他の文字や、U+249C PARENTHESIZED LATIN SMALL LETTER Aや、U+2100 ACCOUNT OF(これは小さいcの上に小さいaがあるような外観をもちます)のような、文字のグラフィカルな外観の一部にaをもつ文字にもマッチします。同様にASCIIのダブルクォート文字"は、ダブルクォートの変種としてUnicode標準で定義されている、他のすべての変種にマッチします。最後に、character foldingにより、1つ以上の文字シーケンスは違う長さの他の文字にもマッチするようになります。たとえば2つの文字ffは、U+FB00 LATIN SMALL LIGATURE FFにマッチします。文字シーケンスはまったく同じではありませんが、character foldingでのマッチはequivalent character sequences(等価文字シーケンス)として知られています。

一般的にEmacsの検索コマンドは、デフォルトでは等価な文字シーケンスのマッチのためにcharacter foldingを行ないません。変数search-default-modechar-fold-to-regexpにカスタマイズすることにより、この振る舞いを有効にできます。Search Customizationsを参照してください。インクリメンタル検索では、M-s ' (isearch-toggle-char-fold)とタイプすることによりcharacter foldingが切り替わりますが、これはその検索だけです(置換コマンドは別のオプションによる異なるデフォルトをもちます。Replacement and Lax Matchesを参照してください)。

case foldingと同様に、検索文字列の一部として明示的にäのような文字の変種をタイプすることにより、その検索でのcharacter foldingが無効になります。検索文字列からそのような文字を削除すると、この効果はなくなります。