Подтвердить что ты не робот

Точное совпадение строк в vim? (Например, режим 'regex-off' меньше).

В vim, я часто хочу искать строку с финишными символами, которые нужно экранировать. Есть ли способ отключить значение всех специальных символов, вроде как режим регулярного выражения в меньшем или fgrep?

Я имею дело с особенно волосатыми струнами; вот пример:

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

Не нужно избегать каких-либо символов, чтобы выполнять поиск в vim, было бы большим временем ожидания.

\ V в Vim помогает с некоторыми метасимволами, но критически не/или \.

<ч/" > Спасибо всем! В конце я добавил это в свой .vimrc:

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

Ответ 1

Посмотрев на ваш конкретный пример, возможно, самый простой способ сделать это (так как \V здесь не поможет) заключается в использовании ? вместо /: тогда вам не придется скрывать / s:

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

Это будет искать назад, а не вперед, но вы всегда можете сделать "N" вместо "n" для поиска вперед после первого прохода. Или вы можете нажать /, а затем клавишу курсора вверх, чтобы автоматически вывести косые черты вперед.

Тем не менее, вы ничего не можете скрыть от сбрасывания обратных косых черт. Думаю, вы могли бы сделать:

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

а затем используйте n для поиска, но это, вероятно, не намного проще. Лучшее, что я могу придумать, это:

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

Тогда do:

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

Ответ 2

В зависимости от точной строки, которую вы ищете, префикс \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, вам все равно придется скрывать обратную косую черту.

Если это еще не режет для вас, этот пост Nabble имеет предложение, которое берет литеральную строку со встроенными обратными косыми чертами и другими специальными символами Vim и утверждает искать его без проблем; но для этого требуется создание функции Vim, которая может или не может быть в вашей среде.

Ответ 3

Возможно, что-то вроде этого:

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

Он даст вам приглашение / и будет вести себя иначе, как встроенный поиск, но не будет выполнять поиск по типу или другим подобным лакомствам.