Usr_27
Nvim の:help
ページ。 生成されたもので、ソース を tree-sitter-vimdoc パーサーを使用して生成されています。
VIM ユーザーマニュアル - Bram Moolenaar 著
検索コマンドとパターン
第3章では、いくつかの簡単な検索パターンについて説明しました
03.9。Vim は、はるかに複雑な検索を実行できます。この章では、最も頻繁に使用される検索パターンについて説明します。詳細な仕様については、こちらを参照してください。
パターン
大文字小文字の無視
デフォルトでは、Vim の検索は大文字と小文字を区別します。そのため、「include」、「INCLUDE」、「Include」は3つの異なる単語であり、検索はそれらのうちの1つにのみ一致するでしょう。
'ignorecase' オプションをオンにします。
:set ignorecase
もう一度「include」を検索すると、今度は「Include」、「INCLUDE」、「InClUDe」に一致します。(
'hlsearch' オプションを設定して、パターンが一致する場所をすばやく確認できます。) 次のコマンドでオフにすることができます。
:set noignorecase
しかし、オンのままにして「INCLUDE」を検索してみましょう。「include」と同じテキストに一致します。次に、
'smartcase' オプションを設定します。
:set ignorecase smartcase
大文字の文字が1つ以上含まれるパターンがある場合、検索は大文字と小文字を区別するようになります。大文字を入力する必要がなかったのに、入力したということは、大文字と小文字の一致を意図していたと考えられます。賢いですね! これらの2つのオプションを設定すると、次のようになります。
パターンの一致
word word, Word, WORD, WoRd など Word Word WORD WORD WoRd WoRd
1つのパターン内の大文字と小文字
特定のパターンについてのみ大文字小文字を無視する場合は、文字列「\c」を前に付けることで実行できます。「\C」を使用すると、パターンは大文字と小文字を区別するようになります。これは、
'ignorecase' オプションと
'smartcase' オプションを無効にします。「\c」または「\C」を使用する場合は、それらの値は関係ありません。
パターンの一致
\Cword word \CWord Word \cword word, Word, WORD, WoRd など \cWord word, Word, WORD, WoRd など
注記: 検索パターンでの「\」の使用は、
'magic' オプションに依存します。この章では、標準で推奨される設定である
'magic' がオンであることを前提としています。
'magic' を変更すると、多くの検索パターンが突然無効になる可能性があります。
注記: 検索に予想以上に時間がかかる場合は、Unix ではCTRL-C
、MS-Windows ではCTRL-Break
で中断できます。
デフォルトでは、前方検索は、現在のカーソル位置から指定された文字列の検索を開始します。その後、ファイルの末尾まで進みます。その時点で文字列が見つからなかった場合は、先頭から開始し、ファイルの先頭からカーソル位置まで検索します。「n」コマンドを繰り返して次のマッチを検索すると、最終的に最初のマッチに戻ります。これに気づかないと、永遠に検索を続けることになります!ヒントとして、Vim は次のメッセージを表示します。
検索がBOTTOMに到達しました。TOPから続行します。
「?」コマンドを使用して反対方向に検索すると、次のメッセージが表示されます。
検索がTOPに到達しました。BOTTOMから続行します。
それでも、最初のマッチに戻ったかどうかはわかりません。これを見る1つの方法は、
'ruler' オプションをオンにすることです。
:set ruler
Vim は、ウィンドウの右下隅(ステータスラインがある場合はステータスラインに)カーソル位置を表示します。次のようになります。
最初の数字はカーソルの行番号です。開始した行番号を覚えておけば、その位置を再び通過したかどうかを確認できます。
折り返しの無効化
検索の折り返しをオフにするには、次のコマンドを使用します。
:set nowrapscan
検索がファイルの末尾に到達すると、エラーメッセージが表示されます。
E385: 検索がBOTTOMに到達しましたが、「forever」に一致するものがありませんでした。
そのため、「gg」でファイルの先頭に移動し、このメッセージが表示されるまで検索を続けることで、すべての一致を見つけることができます。反対方向に検索する場合は、「?」を使用すると、次のようになります。
E384: 検索がTOPに到達しましたが、「forever」に一致するものがありませんでした。
デフォルトでは、検索コマンドはカーソルをパターンの先頭に配置します。オフセットを指定することで、Vim に他の場所に配置するように指示できます。前方検索コマンド「/」の場合、オフセットはスラッシュ(/)とオフセットを付加することで指定します。
/default/2
このコマンドは「default」パターンを検索し、パターンの後ろの2行目の先頭に移動します。上記のパラグラフでこのコマンドを使用すると、Vim は最初の行で「default」という単語を見つけます。その後、カーソルは2行下に移動し、「an offset」に移動します。
オフセットが単純な数値の場合、カーソルは、一致からその行数だけ離れた行の先頭に配置されます。オフセット数は正または負にすることができます。正の場合は、カーソルはその行数だけ下に移動します。負の場合は、上に移動します。
文字オフセット
「e」オフセットは、一致の末尾からのオフセットを示します。一致の最後の文字にカーソルを移動します。コマンド
/const/e
は、「const」の「t」にカーソルを置きます。その位置から数値を追加すると、その文字数だけ前方に移動します。このコマンドは、一致のすぐ後ろの文字に移動します。
/const/e+1
正の数はカーソルを右に移動し、負の数は左に移動します。たとえば
/const/e-1
は、「const」の「s」にカーソルを移動します。
オフセットが「b」で始まる場合、カーソルはパターンの先頭に移動します。「b」を省略しても同じ動作をするため、あまり役に立ちません。数値の加算または減算を行うと役に立ちます。カーソルはその文字数だけ前または後ろに移動します。たとえば
/const/b+2
は、一致の先頭に移動し、さらに2文字右に移動します。そのため、「n」に移動します。
繰り返し
異なるオフセットで、以前に使用した検索パターンを繰り返すには、パターンを省略します。
/that
//e
は次のものと等価です。
/that/e
同じオフセットで繰り返すには
/
「n」と同じ動作をします。以前に使用したオフセットを削除しながら繰り返すには
//
後方検索
「?」コマンドは同じようにオフセットを使用しますが、「/」ではなく「?」を使用して、オフセットとパターンを区切る必要があります。
?const?e-2
「b」と「e」は元の意味を保持し、「?」の使用によって方向は変わりません。
開始位置
検索を開始すると、通常はカーソル位置から開始されます。行オフセットを指定すると、問題が発生する可能性があります。たとえば
/const/-2
これは次の単語「const」を見つけ、2行上に移動します。「n」を使用して再度検索すると、Vim は現在の位置から開始して同じ「const」の一致を見つける可能性があります。次に、オフセットを再度使用すると、元の位置に戻ってしまいます。行き詰まってしまいます!さらに悪いことに、次の行に「const」の一致がもう1つあるとします。前方検索を繰り返すと、この一致が見つかり、2行上に移動します。そのため、実際にはカーソルが後方に移動します!
文字オフセットを指定すると、Vim はこれを補償します。そのため、検索は数文字前または後ろから開始され、同じ一致が再度見つかることはありません。
「*」項目は、その前の項目が任意の回数一致できることを指定します。そのため
/a*
は「a」、「aa」、「aaa」などに一致します。また、「」(空文字列)にも一致します。ゼロ回も含まれるためです。「*」は、その直前の項目のみに適用されます。そのため、「ab*」は「a」、「ab」、「abb」、「abbb」などに一致します。文字列全体を複数回一致させるには、1つの項目にグループ化する必要があります。これは、その前に「\(」を、その後に「\) 」を置くことで行います。そのため、このコマンド
/\(ab\)*
は「ab」、「abab」、「ababab」などに一致します。また、「」にも一致します。
空文字列の一致を避けるには、「\+」を使用します。これにより、前の項目は1回以上一致します。
/ab\+
「ab」、「abb」、「abbb」などに一致します。「b」が続かない場合、「a」には一致します。
オプションの項目に一致させるには、「\=」を使用します。例
/folders\=
は「folder」と「folders」に一致します。
特定の回数
特定の数の項目に一致させるには、「\{n,m}」という形式を使用します。「n」と「m」は数字です。その前の項目は「n」から「m」回
含む 一致します。例
/ab\{3,5}
は「abbb」、「abbbb」、「abbbbb」に一致します。「n」を省略すると、デフォルトで0になります。「m」を省略すると、デフォルトで無限大になります。「,m」を省略すると、正確に「n」回一致します。例
パターンの一致回数
\{,4} 0、1、2、3、または4 \{3,} 3、4、5など \{0,1} 0または1、\=と同じ \{0,} 0以上、*と同じ \{1,} 1以上、\+と同じ \{3} 3
できるだけ少ない文字列への一致
これまでの項目は、できるだけ多くの文字に一致します。できるだけ少ない文字に一致させるには、「\{-n,m}」を使用します。「\{n,m}」と同じように機能しますが、可能な限り最小の数が使用されます。たとえば、次を使用します。
/ab\{-1,3}
は「abbb」内の「ab」に一致します。実際には、他に何もないため、「b」を1回以上一致させることはありません。下限よりも多く一致させるには、他に何かが必要になります。同じルールが「n」と「m」の削除にも適用されます。両方の数字を削除して「\{- }」にすることも可能です。これは、その前の項目を0回以上、できるだけ少ない回数一致させます。項目自体は常に0回一致します。他のものと組み合わせると便利です。例
/a.\{-}b
これは「axbxb」内の「axb」に一致します。このパターンが使用された場合
/a.*b
は、「.*」でできるだけ多くの文字に一致しようと試みるため、「axbxb」全体に一致します。
パターンにおける「または」演算子は「\|」です。例
/foo\|bar
これは「foo」または「bar」にマッチします。複数の代替案を連結できます。
/one\|two\|three
「one」、「two」、「three」にマッチします。複数回マッチさせるには、全体を「\(」と「\) 」で囲む必要があります。
/\(foo\|bar\)\+
これは「foo」、「foobar」、「foofoo」、「barfoobar」などにマッチします。別の例
/end\(if\|while\|for\)
これは「endif」、「endwhile」、「endfor」にマッチします。
関連する項目は「\&」です。これは、両方の代替案が同じ場所でマッチすることを要求します。結果のマッチは最後の代替案を使用します。例
/forever\&...
これは「forever」内の「for」にマッチします。「fortuin」などにはマッチしません。
「a」、「b」、または「c」にマッチさせるには、「/a\|b\|c」を使用できます。「a」から「z」までのすべての文字にマッチさせようとすると、非常に長くなります。より短い方法があります。
/[a-z]
[] 構文は1つの文字にマッチします。内部で、マッチさせる文字を指定します。次のように、文字のリストを含めることができます。
/[0123456789abcdef]
これは、含まれる文字のいずれかにマッチします。連続する文字については、範囲を指定できます。「0-3」は「0123」を表します。「w-z」は「wxyz」を表します。したがって、上記の同じコマンドは次のように短縮できます。
/[0-9a-f]
「-」文字自体にマッチさせるには、それを範囲の先頭または末尾にします。これらの特殊文字は、[] 範囲内で使用しやすくするために受け入れられます(実際には、検索パターンのどこにでも使用できます)。
\e <Esc>
\t <Tab>
\r <CR>
\b <BS>
[] 範囲には、さらにいくつかの特殊なケースがあります。
/[]で全容を確認してください。
補集合範囲
特定の文字にマッチしないようにするには、範囲の先頭に「^」を使用します。[] 項目は、含まれる文字以外のすべての文字にマッチします。例
/"[^"]*"
「二重引用符 [^"] 二重引用符でない任意の文字 * 最大限にマッチ 「二重引用符再び」
これは、二重引用符を含め、「foo」と「3!x」にマッチします。
定義済み範囲
多くの範囲は非常に頻繁に使用されます。Vim はこれらのショートカットを提供します。例
/\a
英字を探します。これは「/[a-zA-Z]」を使用するのと同じです。他にもいくつかあります。
項目 マッチする対象
\d 数字 [0-9] \D 数字以外 [^0-9] \x 16進数 [0-9a-fA-F] \X 16進数以外 [^0-9a-fA-F] \s 空白文字 [ ] (
<Tab>
と
<Space>
) \S 空白文字以外 [^ ] (
<Tab>
と
<Space>
以外) \l 小文字 [a-z] \L 小文字以外 [^a-z] \u 大文字 [A-Z] \U 大文字以外 [^A-Z]
注意: これらの定義済み範囲を使用すると、対応する文字範囲を使用するよりもはるかに高速に動作します。これらの項目は [] 内では使用できません。したがって、「[\d\l]」は数字または小文字にマッチしません。「\(\d\|\l\)」を使用してください。
/\sでこれらの範囲の完全なリストを参照してください。
文字範囲は、固定された文字セットにマッチします。文字クラスは似ていますが、重要な違いがあります。文字セットは、検索パターンを変更せずに再定義できます。たとえば、このパターンを検索します。
/\f\+
「\f」項目はファイル名文字を表します。したがって、これはファイル名になりうる文字列にマッチします。ファイル名の一部になりうる文字は、使用しているシステムによって異なります。MS-Windowsではバックスラッシュが含まれ、Unixでは含まれません。これは
'isfname'オプションで指定されます。Unixのデフォルト値は
:set isfname
isfname=@,48-57,/,.,-,_,+,,,#,$,%,~,=
他のシステムでは、デフォルト値が異なります。したがって、「\f」を使用してファイル名にマッチする検索パターンを作成でき、使用しているシステムに自動的に調整されます。
注意: 実際、Unixでは、空白文字を含むほとんどすべての文字をファイル名で使用できます。
'isfname'にこれらの文字を含めることは理論的には正しいでしょう。しかし、テキスト内のファイル名の終わりを見つけることが不可能になります。したがって、
'isfname'のデフォルト値は妥協案です。
文字クラスは次のとおりです。
Vim は改行文字を含むパターンを見つけることができます。これまで説明したすべての項目は改行文字にマッチしないため、改行文字が発生する場所を指定する必要があります。特定の場所の改行文字を確認するには、「\n」項目を使用します。
/one\ntwo
これは、「one」で終わる行と「two」で始まる次の行にマッチします。「one two」にもマッチさせるには、スペースまたは改行文字にマッチする必要があります。それを使用する項目は「\_s」です。
/one\_stwo
任意の量の空白を許可するには
/one\_s\+two
これは、「one 」が行の終わりに、「 two」が次の行の先頭に存在する場合にもマッチします。
「\s」は空白文字にマッチし、「\_s」は空白文字または改行文字にマッチします。同様に、「\a」は英字にマッチし、「\_a」は英字または改行文字にマッチします。他の文字クラスと範囲も、"_" を挿入することで同じように変更できます。
多くの他の項目は、「\_」を先頭に付けることで改行文字にマッチするようにできます。たとえば、「\_.」は任意の文字または改行文字にマッチします。
注意: 「\_.*」はファイルの最後まですべての文字にマッチします。これには注意してください。検索コマンドを非常に遅くする可能性があります。
別の例として「\_[]」があります。これは改行文字を含む文字範囲です。
/"\_[^"]*"
これは、複数の行に分割されている可能性のある二重引用符内のテキストを見つけます。
役立つ可能性のある検索パターンをいくつか紹介します。これにより、上記で説明した項目を組み合わせる方法を示します。
カリフォルニアのナンバープレートの検索
ナンバープレートのサンプルは「1MGU103」です。1桁の数字、3文字の大文字、3桁の数字があります。これを検索パターンに直接入れると
/\d\u\u\u\d\d\d
別の方法は、カウントを使用して3桁の数字と文字を指定することです。
/\d\u\{3}\d\{3}
[] 範囲を使用する
/[0-9][A-Z]\{3}[0-9]\{3}
これらのうちどれを使用するべきですか?覚えられるものを使用してください。覚えられる簡単な方法は、覚えられない高度な方法よりもはるかに高速です。すべてを覚えている場合は、最後のものは入力量が多く、実行速度も遅いため、避けてください。
識別子の検索
C プログラム(および多くの他のコンピューター言語)では、識別子は文字で始まり、文字と数字で構成されます。アンダースコアも使用できます。これは次のようにして見つけることができます。
/\<\h\w*\>
「\<」と「\>」は、単語全体のみを見つけるために使用されます。「\h」は「[A-Za-z_]」を表し、「\w」は「[0-9A-Za-z_]」を表します。
注意: 「\<」と「\>」は
'iskeyword'オプションに依存します。たとえば、「-」が含まれている場合、「ident-」はマッチしません。この状況では、次を使用します。
/\w\@<!\h\w*\w\@!
これは、「\w」が識別子の前後にマッチしないかどうかを確認します。
/\@<!と
/\@!を参照してください。