Точное совпадение строк в 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>
Ответы
Ответ 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>
Он даст вам приглашение /
и будет вести себя иначе, как встроенный поиск, но не будет выполнять поиск по типу или другим подобным лакомствам.