Как эффективно искать и заменять в 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/