Как эффективно искать и заменять в Vim сначала "тестирование" или "предварительный просмотр" поисковой части?
Иногда я хочу искать и заменять в Vim, используя формат s/search_for/replace_with/options
, но часть search_for
становится сложным регулярным выражением, которое я не могу получить в первый раз.
У меня set incsearch hlsearch
в моем .vimrc
, поэтому Vim начнет выделять, когда я набираю, когда я ищу, используя формат /search_for
. Это полезно для первого "теста" / "предварительного просмотра" моего регулярного выражения. Затем, как только я получаю регулярное выражение, которое я хочу, я применяю к s/
для поиска и замены.
Но для этого подхода существует два больших ограничения:
- Неплохо копировать и вставлять регулярное выражение, которое я создал в режиме
/
, в s/
.
- Я не могу просмотреть с помощью согласованных групп в регулярном выражении (т.е.
(
и )
) или использовать волшебный режим \v
, а в /
.
Итак, как вы, ребята, пытаетесь сделать сложный поиск и замену регулярных выражений в Vim?
Ответы
Ответ 1
Проверьте ваше регулярное выражение в режиме поиска с помощью /
, затем используйте s//new_value/
. Когда вы ничего не передаете в область поиска s
, он берет самый последний поиск.
Как сообщает @Sam Brink, вы можете использовать <C-r>/
для вставки содержимого регистра поиска, поэтому s/<C-r>//new_value/
тоже работает. Это может быть более удобно, если у вас сложное выражение поиска.
Ответ 2
Как уже отмечалось, вы можете практиковать часть поиска с помощью /your-regex-here/
. Когда это работает правильно, вы можете использовать s//replacement/
для использования последнего поиска.
Как только вы это сделали, вы можете использовать &
для повторения последней команды s///
, даже если с тех пор вы выполняли разные поиски. Вы также можете использовать :&g
для замены в глобальном масштабе текущей строки. И вы можете использовать :.,$&g
для поиска по всем совпадениям здесь (.
) и концу файла ($
) среди легиона других возможностей.
Вы также, конечно, отмените, если операция не работает так, как вы ожидали.
Ответ 3
Как отмечали другие, я обычно использую s//replacement/
для выполнения своих замен, но вы также можете использовать <C-r>/
для вставки того, что находится в регистре поиска. Таким образом, вы можете использовать s/<C-r>//replacement/
, где <C-r>/
будет вставлять ваш поиск, и вы можете делать любые необходимые изменения в последнюю минуту.
<C-r>
вставляет содержимое регистра, в котором находится курсор
Регистр /
содержит самый последний поисковый запрос
:registers
отобразит содержимое каждого регистра, чтобы вы могли видеть, что доступно.
Ответ 4
Так как Neovim 0.1.7 есть функция Incremental ( "live" ): substitute. (так это работает только в Неовиме!)
Чтобы включить его, установите опцию incommand:
:set inccommand=split
Было объявлено здесь: https://neovim.io/news/2016/11/