Іноді я використовую :s
складний регулярний вираз, який може бути, а може і не бути правильним, або не впевнений, чи хочу я замінити всі збіги.
Чи я можу сказати Vim підтвердити кожне знайдене відповідність, перш ніж він фактично замінить текст?
Іноді я використовую :s
складний регулярний вираз, який може бути, а може і не бути правильним, або не впевнений, чи хочу я замінити всі збіги.
Чи я можу сказати Vim підтвердити кожне знайдене відповідність, перш ніж він фактично замінить текст?
Відповіді:
Так! Використовуйте c
прапор для :substitute
. Від :help substitute
:
[c] Confirm each substitution. Vim highlights the matching string (with
hl-IncSearch). You can type: :s_c
'y' to substitute this match
'l' to substitute this match and then quit ("last")
'n' to skip this match
<Esc> to quit substituting
'a' to substitute this and all remaining matches {not in Vi}
'q' to quit substituting {not in Vi}
CTRL-E to scroll the screen up {not in Vi, not available when
compiled without the +insert_expand feature}
CTRL-Y to scroll the screen down {not in Vi, not available when
compiled without the +insert_expand feature}
Приклад використання простий як пиріг:
%s/old/new/c
Це дуже корисно, але я не знав про це до 2 тижнів тому :-) І це навіть доступно в ol 'vi :-)
Порада про бонуси: ви також можете використовувати :set nowrapscan
; це запобігає загортанню Vim вгору, коли він потрапляє на дно. Я вважаю, що це особливо корисно при використанні c
прапора.
На додаток до сказаного Carpetsmoker:
Налаштування &incsearch
( set incsearch
) у Vim дійсно корисне. Ви можете використовувати його разом з корисною і маловідомою хитрістю.
Хитрість полягає в тому, щоб спробувати складний регулярний вираз, просто скориставшись командою /
або ?
. Vim використовуватиме &incsearch
налаштування для інтерактивного показу матчів. Після того, як ви будете задоволені регулярним виразом, ви можете використовувати :%s//replacement
vim, що використовує попередній пошук.
Зверніть увагу, як частина в //
порожній (саме там ви поставили текст для пошуку). Якщо ви залишите його порожнім, ви скажете Vim використати попередній регекс пошуку. За допомогою цього ви можете набрати складний регулярний вираз з /
усіма перевагами set incsearch
, а потім скористатися %s//replacement
командою для фактичного виконання пошуку та заміни.
Якщо ви хочете щось схоже на пошук пошуку :s
команд, перевірте vim-over , але я просто вважаю за краще використовувати рідний спосіб Vim.
Моя улюблена інтерактивна підміна - це пошук за допомогою /та проходження матчів із використанням n.
Потім виберіть матч , використовуючи gnі потім , sщоб замінити текст з тим, що мені подобається.
І повторіть , переходячи до наступного матчу та натискаючи.
:s/old/new/gc
).
У Neovim також є 'inccommand'
параметр, який дозволяє переглядати результат :s
команди під час її введення.
На благо всіх incsearch
було оновлено в vim8, щоб також відображався попередній перегляд під час введення шаблону
:%s/pattern/replace/
а потім натиснітьu
для скасування, ви побачите частини, які Vim змінив, якщо виhlsearch
ввімкнули. І ви можете знову замінити цей текст на^R
.