web-dev-qa-db-ja.com

vimで文字列が完全に一致しますか? (以下の「正規表現オフ」モードのように。)

vimでは、エスケープが必要な気難しい文字を含む文字列を検索したいことがよくあります。 regex-off mode in lessやfgrepのように、すべての特殊文字の意味をオフにする方法はありますか?

私は特に毛むくじゃらのひもを扱っています。ここに例があります:

((N/N)/(N/N))/N

Vimで検索を行うために文字をエスケープする必要がないことは、大幅な時間の節約になります。

\ V in Vimは一部のメタ文字には役立ちますが、/または\には役立ちません。


command! -nargs=1 S let @/ = escape('<args>', '\')
nmap <Leader>S :execute(":S " . input('Regex-off: /'))<CR>
37
jogloran

あなたの特定の例を見ると、おそらくこれを行う最も簡単な方法は(\ Vはここでは役に立たないので)?の代わりに/を使用することです:そうすれば/sをエスケープする必要はありません:

?((N/N)/(N/N))/N

これは前方ではなく後方に検索しますが、最初の実行後に前方に検索するには、「n」の代わりに「N」をいつでも実行できます。または、/に続けて上カーソルキーを押すと、スラッシュが自動的にエスケープされます。

ただし、円記号をエスケープすることについて簡単にできることは何もありません。私はあなたができると思います:

:let @/ = escape(pattern, '\')

次に、nを使用して検索しますが、おそらくそれほど簡単ではありません。私が思いつくことができる最高のものは:

:command! -nargs=1 S let @/ = escape('<args>', '\')

次に、次のことを行います。

:S (N)/(N+1)\(N)
n
21
DrAl

検索している正確な文字列によっては、\Vプレフィックスでうまくいく可能性があります。
参照 :help \V

after:    \v       \m       \M       \V         matches ~
                'magic' 'nomagic'    
          $        $        $        \$         matches end-of-line
          .        .        \.       \.         matches any character
          *        *        \*       \*         any number of the previous atom
          ()       \(\)     \(\)     \(\)       grouping into an atom
          |        \|       \|       \|         separating alternatives
          \a       \a       \a       \a         alphabetic character
          \\       \\       \\       \\         literal backslash
          \.       \.       .        .          literal dot
          \{       {        {        {          literal '{'
          a        a        a        a          literal 'a'

したがって、文字列hello.*$worldがある場合は、コマンド/\V.*$を使用して、.*$だけを見つけることができます-文字列エスケープが必要なのは別のバックスラッシュですが、特別な記号をエスケープすることで、グループ化などを行うことができます。


:g #\V((N/N)/(N/N))/N#   

:g コマンドはグローバル検索であり、次の点に注意してください。

:[range]g[lobal]/{pattern}/[cmd]
                        Execute the Ex command [cmd] (default ":p") on the
                        lines within [range] where {pattern} matches.

Instead of the '/' which surrounds the {pattern}, you can use any other
single byte character, but not an alphanumeric character, '\', '"' or '|'.
This is useful if you want to include a '/' in the search pattern or
replacement string.

したがって、#を使用した場合は、?@、または上記の条件を満たすその他の文字を使用できます。その:gコマンドの欠点は、最後にコマンドが必要なことです。したがって、最後の文字の後に末尾のスペースがない場合、期待どおりに検索が実行されません。また、\Vを使用している場合でも、円記号をエスケープする必要があります。

そのstillでうまくいかない場合は、 このNabbleの投稿 には、バックスラッシュが埋め込まれたリテラル文字列を使用するという提案がありますおよびその他の特別なVim文字、および問題なくそれを検索すると主張します。ただし、Vim関数を作成する必要があります。これは、ご使用の環境で問題がない場合とそうでない場合があります。

32
Mark Rushakoff

多分このようなもの:

nmap <Leader>s :execute '/\V' . escape(input('/'), '\\/')<CR>

/プロンプトが表示され、組み込みの検索と同じように動作しますが、入力どおりの検索やその他の機能は実行されません。

5
Brian Carper