通常、検索コマンドには、入力する検索文字列と検索対象のテキストとの間にある特定の些細な差異を無視させたいものです。例えば、長さの異なる空白文字の連続は通常同等とみなされますし、大文字・小文字の違いも通常は問題になりません。これは文字の等価性として知られています。
本節では、Emacsのlax検索機能と、それらをニーズに合わせてカスタマイズする方法について解説します。
デフォルトでは、検索コマンドは緩いスペースマッチングを行います。つまり、個々のスペースまたはスペースの連続は、テキスト内の1つ以上の空白文字からなる任意の文字列にマッチします。より正確には、Emacsは検索文字列内のスペース文字の各連続を、ユーザーオプション
search-whitespace-regexp
で指定された正規表現に照合します。このオプションのデフォルト値では、スペース文字とタブ文字の任意の連続が空白文字として扱われます。したがって、‘foo bar’は‘foo bar’、‘foo bar’、‘foo bar’などにマッチします(ただし‘foobar’にはマッチしません)。スペースを、スペースやタブだけでなく改行の連続にもマッチさせたい場合は、このオプションをカスタマイズして、値を正規表現
‘[ \t\n]+’
に設定してください。(インクリメンタル正規表現検索のデフォルトの動作は異なります。正規表現検索を参照してください。)
空白文字を完全に一致させたい場合は、インクリメンタル検索内で M-s SPC (isearch-toggle-lax-whitespace)
と入力することで、緩いスペースマッチングを無効にできます。再度 M-s SPC
と入力すると、緩いスペースマッチングが再有効化されます。すべての検索で緩い空白文字マッチングを無効にするには、search-whitespace-regexp を nil
に変更してください。これにより、検索文字列内の各スペースが正確に1つのスペースに一致するようになります。
Emacsの検索では、検索文字列を小文字で指定すると、デフォルトで検索対象テキストの大文字・小文字が区別されません。したがって、‘foo’で検索を指定すると、‘Foo’や‘fOO’もマッチします。正規表現、特に文字集合も同様の挙動を示し、‘[ab]’は‘a’、‘A’、‘b’、または‘B’にマッチします。この機能はケースフォールディングとして知られており、インクリメンタル検索モードと非インクリメンタル検索モードの両方でサポートされています。
検索文字列のどこかに大文字が含まれていると、検索は大文字小文字を区別するようになります。したがって、‘Foo’ で検索しても、‘foo’ や ‘FOO’
は見つかりません。これはリテラル文字列の検索だけでなく、正規表現による検索にも適用されます。検索文字列から大文字を削除すると、この効果はなくなります。変数
search-upper-case でこれを制御できます。この変数が nil 以外の場合、検索文字列に大文字が含まれていると検索は大文字小文字を区別するようになります。これを
nil に設定すると、大文字によるこの効果は無効になります。この変数のデフォルト値は not-yanks
で、検索文字列に大文字が含まれている場合は検索を大文字小文字を区別するようになり、また、検索文字列にヤンクされたテキスト(Isearch Yanking
を参照)は小文字に変換されるため、こうした検索はデフォルトで大文字小文字を区別しません。
変数 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を実行してください。
ケースフォールディングは、文字間の大文字・小文字の区別を無視し、大文字を対応する小文字に、またその逆にも一致させます。ケースフォールディングを一般化したものが文字フォールディングであり、これは類似した文字間のより広範な区別を無視します。例えば、文字フォールディングでは、文字
a は ä や á
といったアクセント付きの類縁文字すべてに一致します。つまり、このマッチングでは、これらの変種を区別するダイアクリティカルマークは無視されます。さらに、a は、それに似た他の文字や、U+00AA FEMININE ORDINAL
INDICATOR や U+24D0 CIRCLED LATIN SMALL LETTER
A(円の中に小さな a
があるように見える)のように、その文字を図形表現の一部として含む他の文字にも一致します。同様に、ASCII のダブルクォート文字 "
は、Unicode標準で定義されているダブルクォートの他のすべての変種に一致します。最後に、文字フォールディングによって、1つ以上の文字からなるシーケンスが、長さの異なる別のシーケンスに一致することがあります。例えば、2文字のシーケンス
ff は U+FB00 LATIN SMALL LIGATURE
FF に、シーケンス (a) は U+249C PARENTHESIZED LATIN SMALL LETTER A
に一致します。同一ではないが、文字フォールディングによって一致する文字シーケンスは、等価文字シーケンスと呼ばれます。
通常、Emacsの検索コマンドでは、同等の文字シーケンスに一致させるための文字折りたたみがデフォルトでは行われません。変数 search-default-mode を char-fold-to-regexp にカスタマイズすることで、この動作を有効にできます。検索をニーズに合わせて調整する
を参照してください。インクリメンタル検索中、M-s ' (isearch-toggle-char-fold)
と入力すると文字折りたたみが切り替わりますが、これはその検索中のみ有効です。(置換コマンドはデフォルトが異なり、別のオプションで制御されます。置換コマンドと緩いマッチ
を参照してください。)
デフォルトでは、検索文字列の一部として ä
のような文字の明示的なバリアントを入力しても、a のような基本文字とは一致しません。しかし、変数
char-fold-symmetric を t
にカスタマイズすると、検索コマンドは等価な文字を同一に扱い、検索文字列内で等価な文字セットのいずれかを使用すれば、検索対象のテキスト内にあるそれらのいずれかが見つかります。したがって、アクセント付き文字
ä を入力すると、文字 a
だけでなく、á のような他のすべてのバリアントとも一致します。
カスタマイズ可能な変数 char-fold-include
を使用して新しい折りたたみを追加したり、カスタマイズ可能な変数 char-fold-exclude
を使用して既存のものを削除したりできます。また、char-fold-override から
t をカスタマイズすることで、char-fold-include で自身で追加したもの以外のすべての文字等価関係を無効にすることもできます。