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-sensitiveにして、検索文字列にyankするテキスト(Isearch Yankを参照)を小文字にする(そうすればデフォルトで検索がcase-insensitiveになる)not-yanksです。

変数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を参照してください)。

デフォルトではäのような文字の明示的な変種を検索文字列の一部としてタイプしても、それはaのようなベース文字とはマッチしません。しかし変数char-fold-symmetrictにカスタマイズすれば、検索コマンドは等価な文字を同一に扱い、検索文字列内での等価な文字集合の使用により、検索するテキスト内の等価な文字を検索するので、アクセントつきの文字äは文字aと同じようにáのようなすべての変種にもマッチします。

カスタマイズ可能な変数char-fold-includeを使用して新たなfoldingを追加したり、カスタマイズ可能な変数char-fold-excludeを使用して既存のfoldingを削除できます。