Чи можу я зробити інтерактивний: заміна (пошук і заміна)?


17

Іноді я використовую :sскладний регулярний вираз, який може бути, а може і не бути правильним, або не впевнений, чи хочу я замінити всі збіги.

Чи я можу сказати Vim підтвердити кожне знайдене відповідність, перш ніж він фактично замінить текст?

Відповіді:


20

Так! Використовуйте 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прапора.


19

На додаток до сказаного Carpetsmoker:

Налаштування &incsearch( set incsearch) у Vim дійсно корисне. Ви можете використовувати його разом з корисною і маловідомою хитрістю.

Хитрість полягає в тому, щоб спробувати складний регулярний вираз, просто скориставшись командою /або ?. Vim використовуватиме &incsearchналаштування для інтерактивного показу матчів. Після того, як ви будете задоволені регулярним виразом, ви можете використовувати :%s//replacementvim, що використовує попередній пошук.

Зверніть увагу, як частина в //порожній (саме там ви поставили текст для пошуку). Якщо ви залишите його порожнім, ви скажете Vim використати попередній регекс пошуку. За допомогою цього ви можете набрати складний регулярний вираз з /усіма перевагами set incsearch, а потім скористатися %s//replacementкомандою для фактичного виконання пошуку та заміни.

Якщо ви хочете щось схоже на пошук пошуку :sкоманд, перевірте vim-over , але я просто вважаю за краще використовувати рідний спосіб Vim.


Раніше я використовував такий варіант: Просто скористайтеся, :%s/pattern/replace/а потім натисніть uдля скасування, ви побачите частини, які Vim змінив, якщо ви hlsearchввімкнули. І ви можете знову замінити цей текст на ^R.
Martin Tournoij

7

Моя улюблена інтерактивна підміна - це пошук за допомогою /та проходження матчів із використанням n.

Потім виберіть матч , використовуючи gnі потім , sщоб замінити текст з тим, що мені подобається.

І повторіть , переходячи до наступного матчу та натискаючи.


Це дуже приємна хитрість, адже це: (1) інтерактивна, (2) ви можете перейти до попереднього матчу, якщо випадково пропустили його (те, що ви не можете зробити :s/old/new/gc).
Айрат

3

У Neovim також є 'inccommand'параметр, який дозволяє переглядати результат :sкоманди під час її введення.


1

На благо всіх incsearchбуло оновлено в vim8, щоб також відображався попередній перегляд під час введення шаблону

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.