あなたは通常、タイプした文字と、検索されるテキストの間にある、特定の瑣末な違いを、検索コマンドが無視することを望むでしょう。たとえば長さが異なる空白文字シーケンスは通常、等しいとみなされ、大文字小文字の違いは通常問題にならない、などです。これは等価文字(character equivalence)として知られています。
このセクションではEmacsのlax search(緩い検索)機能と、それを必要に応じて調整する方法について説明します。
デフォルトでは、検索コマンドはlax space
matching(緩いスペースマッチング)を行います。この検索ではスペースおよび一連のスペースは、テキスト中の1つ以上の空白文字にマッチします。正確に言うと、Emacsは検索文字列内の空白文字のシーケンスそれぞれにたいして、ユーザーオプションsearch-whitespace-regexp
で指定されている正規表現をマッチします。このオプションのデフォルトには、スペースとタブのシーケンスすべてを空白とみなす値がセットされています。したがって‘foo bar’は‘foo bar’、‘foo bar’、‘foo bar’、...にマッチします(‘foobar’にはマッチしない)。スペースやタブと同じように一連の改行をスペースとしてマッチさせるには、このオプションの値を正規表現‘[[:space:]\\n]+’をカスタマイズしてください(インクリメンタルなregexp検索のデフォルトの振る舞いは異なる。正規表現検索を参照)。
空白文字を正確にマッチさせたい場合は、インクリメンタル検索中にM-s SPC
(isearch-toggle-lax-whitespace
)とタイプすることにより、lax space
matchingをオフに切り替えることができます。もう1度M-s SPCとタイプすると、lax space
matchingふぁオンに切り替わります。すべての検索でlax space
matchingを無効にするには、search-whitespace-regexp
をnil
に変更します。これにより検索文字列の中のスペースは、正確に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するテキスト(インクリメンタル検索でのyankを参照)を小文字にする(そうすればデフォルトで検索がcase-insensitiveになる)not-yanks
です。
変数case-fold-search
にnil
をセットすると、すべての文字は大文字小文字を含めて、完全にマッチしなければなりません。これはバッファーごとの変数で、変数の変更はデフォルト値を変えない限り、通常はカレントバッファーだけが影響を受けます。ローカル変数を参照してください。これは置換コマンド(置換コマンドを参照してください)や、ミニバッファーのヒストリー検索(ミニバッファーヒストリーを参照してください)を処理する、非インクリメンタル検索にも適用されます。
インクリメンタル検索で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+00AA
FEMININE ORDINAL INDICATOR (訳注:
スペイン語などで女性形の序数を表すために数字の後に加えられる上付きの小さなa
)やU+24D0 CIRCLED LATIN
SMALL LETTER A
(丸で囲まれた小さいa
のような外観)のように文字のグラフィカルな外観の一部にa
をもつ文字にもマッチします。同様にASCIIのダブルクォート文字"
は、ダブルクォートの変種としてUnicode標準で定義されている、他のすべての変種にマッチします。最後に、character
foldingにより、1つ以上の文字シーケンスは違う長さの他の文字にもマッチするようになります。たとえば2つの文字ff
はU+FB00
LATIN SMALL LIGATURE FF、(a)
というシーケンスはU+249C PARENTHESIZED LATIN
SMALL LETTER Aにマッチします。文字シーケンスはまったく同じではありませんが、character
foldingでのマッチはequivalent character sequences(等価文字シーケンス)として知られています。
一般的にEmacsの検索コマンドは、デフォルトでは等価な文字シーケンスのマッチのためにcharacter
foldingを行ないません。変数search-default-mode
をchar-fold-to-regexp
にカスタマイズすることにより、この振る舞いを有効にできます。必要に応じて検索を調整するを参照してください。インクリメンタル検索では、M-s '
(isearch-toggle-char-fold
)とタイプすることによりcharacter
foldingが切り替わりますが、これはその検索だけです(置換コマンドは別のオプションによる異なるデフォルトをもちます。置換コマンドとLaxマッチを参照してください)。
デフォルトではä
のような文字の明示的な変種を検索文字列の一部としてタイプしても、それはa
のようなベース文字とはマッチしません。しかし変数char-fold-symmetric
をt
にカスタマイズすれば、検索コマンドは等価な文字を同一に扱い、検索文字列内での等価な文字集合の使用により、検索するテキスト内の等価な文字を検索するので、アクセントつきの文字ä
は文字a
と同じようにá
のようなすべての変種にもマッチします。
カスタマイズ可能な変数char-fold-include
を使用して新たなfoldingを追加したり、カスタマイズ可能な変数char-fold-exclude
を使用して既存のfoldingを削除できます。