Как выборочно изменить выделенную строку?

11

Поиском я выделил строку, которую хочу изменить. Теперь я хочу заменить только выделенный текст. Я использую, nчтобы перейти к следующему экземпляру строки поиска. Я думал, что смогу сделать что-то подобное, ciwно это изменит целое слово, а не только выделенный текст.

Я знаком с, :%s/old/new/gно я не хочу менять все экземпляры. Вместо этого я хочу подвести курсор к каждому экземпляру, а затем решить, нужно ли его изменить.

zundarz
источник

Ответы:

16

Используйте gnдвижение, чтобы редактировать текущее соответствие поиска. Следующий пример изменит текущее совпадение на «FooBar»:

cgnFooBar

Большая часть этой техники заключается в том, что вы можете повторить изменение с помощью .. Предполагая, что следующий матч будет изменен так же, как вы можете просто использовать, .чтобы повторить. Или пропустите несколько матчей через, nа затем используйте ..

У Vimcasts есть хороший эпизод по этому вопросу: работа с поиском совпадений с использованием gn

Для получения дополнительной помощи см .:

:h gn
Питер Ринкер
источник
Это, безусловно, путь, когда у вас есть разные строки замены, которые вам нужно использовать в разных местах. Я не уверен в нюансах визуального режима, который, кажется, вызывается gn, поэтому вот похожий метод, который я только что обнаружил:c//e<CR>FooBar<Esc>//<CR>
Джефф
Есть ли способ изменить все выборы / совпадения одновременно? В основном, на рефакторинг?
Геремия
@Geremia, да, :%s/oldtext/newstuff/gизменит все совпадения oldtextна newstuff.
zundarz
@zundarz Я не хочу делать регулярные выражения, но заменять только имена переменных. Вместо .нескольких ударов я могу использовать :%norm .( источник ).
Джеремия
7

Если вы уже искали слово с помощью /wordили ?word.

Вы можете использовать :%s//newword/gcдля замены слова, которое вы искали ранее newword, оставив поисковый термин ( s//..) пустым.

cФлаг говорит , что каждое изменение должно быть подтверждено, нажав yна да или nдля нет.

Взгляните на :help :s_flagsдополнительную информацию о флаге подтверждения.

Рафаэль Аренс
источник
1
Я знаю , что вы сказали , чтобы посмотреть на помощь, но вы можете также четко упомянуть , где вы также можете нажать l, aи q(или <Esc>) различные способы , чтобы обернуть цикл подтверждения.
Джефф
2

Способ № 1

Вы можете использовать gnи gNсопоставления для достижения того, что вы хотите. gnвыполнит поиск последнего использованного поискового запроса и визуально выберет совпадение. gNделает то же самое, но ищет в обратном направлении. В сочетании с таким оператором, как c, оператор будет применяться к совпадению. Например, если ваша последняя строка поиска - «foo», и вы вводите cgn, она будет искать следующий экземпляр «foo», удаляет его и переведите вас в режим вставки, чтобы ввести текст замены.

Подробнее об этом смотрите :help gnи :help gN.

Способ № 2

Вы можете использовать :substituteкоманду с cфлагом. Это попросит вас подтвердить каждую замену. Например, допустим, что вы хотите заменить foo на bar во всем файле, но хотите подтвердить каждую замену:

:%s/foo/bar/gc

Более подробно об этом приведена в следующих разделах справки: :help :s_flags, :help cmdline-ranges, и :help :substitute.

Вечнозеленое дерево
источник