Интерактивный поиск / замена регулярных выражений в Vim?

266

Я знаю регулярное выражение для глобальной замены,

     %s/old/new/g

Как вы делаете интерактивный поиск-замену в Vim ?

кал
источник

Ответы:

464

Добавьте флаг c (в командной строке vim):

:%s/old/new/gc

будет выдавать подсказку «да / нет» при каждом появлении слова «старый».

«старый» выделяется в тексте;  в нижней части окна написано «заменить новым (y ​​/ n / a / q / l / ^ E / ^ y)?)»

Встроенная справка Vim предлагает полезную информацию о параметрах, доступных после выбора замены с подтверждением. Использование:

:h :s

Затем перейдите к разделу подтверждения параметров. Снимок экрана ниже:

Текст с надписью «[C] Подтвердите каждую замену. [...] CTRL-Y, чтобы прокрутить экран вниз»

Например, чтобы заменить это и все остальные совпадения, используйте a.

Марк Бик
источник
30
+1, сегодня я узнал что-то новое! У vim так много скрытых секретов .. :)
Марк Новаковски
10
Изучение команд vim немного похоже на игру в Nethack. Никогда не знаешь, что за чудеса будет у одного персонажа.
Марк Бик
22
Я полагаю, что «с» для «подтвердить»
Matpie
8
Я, честно говоря, не пытаюсь показаться странным, но все это можно было бы найти, выполнив команду ": help: s", которая привела бы вас прямо к ": help: s_flags".
Джереми Кантрелл
13
@jeremy: для этого нужно знать, что команда help существует, и знать, что нужно ввести переключатель «двоеточие», чтобы получить доступ к соответствующему файлу справки. Как или где это можно узнать?
Деннис
79

Марк Биек указал, используя:

%s/old/new/gc

для глобального поиска замените подтверждением для каждой замены. Но мне также нравится интерактивно проверять, что старый текст будет соответствовать правильно. Сначала я выполняю поиск с помощью регулярного выражения, а затем снова использую этот шаблон:

/old.pattern.to.match
%s//replacement/gc

s//Будет использовать последний шаблон поиска.

Винсент Шейб
источник
9
Одна из главных особенностей использования / изучения vim - насколько глубоко заходит кроличья нора!
Кен
2
Хорошо, я всегда делал поиск, затем использовал <Cr> /, чтобы вставить последний поиск в команду замены.
Атилла Филиз
Именно то, что я скучаю по Sublime Text!
Xenofex
Этот ответ особенно полезен, так как я представляю, как часто вы решаете заменить вхождения слова, это слово, которое вы только что искали.
M_M
20

Я думаю, что вы ищете c, например s/abc/123/gc, это заставит VIM подтвердить замены. Смотрите: помощь: заменить для получения дополнительной информации.

Логан Капальдо
источник
9

Я обычно использую команду find / substitute / next / repeat :-)

/old<CR>3snew<ESC>n.n.n.n.n.n.n.

Это find "old", substitute 3 characters for "new", find next, repeat substitute, и так далее.

Это боль для массовых замен, но она позволяет вам выборочно игнорировать некоторые случаи старых (просто нажав nснова, чтобы найти следующий, вместо того, .чтобы повторять замену).

paxdiablo
источник
Я также использую это, даже для похожих текстов. (3cW <texthere> <ESC> <переехать в новое место>. <Переместить>. <Переместить>.)
strager
1
Это не антипаттерн! Это мило. И вы можете искать в обратном направлении, используя N. Действительно хорошо, если вы видите слово и хотите изменить его. * cwNewText <ESC> Nnn (Это отскочит от слова под курсором, но затем отскочит назад, как только вы изменили следующее вхождение.
PEZ
что такое <CR>?
Sother
9

Если вы просто хотите посчитать количество вхождений 'abc', вы можете это сделать %s/abc//gn. Это ничего не заменяет, а просто сообщает количество появлений 'abc'.

Amjith
источник
3

Если ваш заменяющий текст должен меняться для каждого совпадающего вхождения (т.е. не просто выбирая Да / Нет, чтобы применить единственную замену), вы можете использовать плагин Vim, который я сделал, называемый интерактивный-замена .

hwrod
источник
2

Neovim теперь имеет функцию предварительного просмотра замены:

введите описание изображения здесь

Изображение взято с: https://medium.com/@eric.burel/stop-using-open-source-5cb19baca44d Документация по функции: https://neovim.io/doc/user/options.html# 'inccommand'

sumek
источник
Это так круто, как nvimвстроенная функция, приятно знать! Спасибо, что поделился!
Леон - Хан Ли