Могу ли я сделать интерактив: заменить (поиск и замена)?

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 действительно полезен. Вы можете использовать его вместе с полезным и малоизвестным приемом.

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

Обратите внимание, что часть //пуста (вот где вы помещаете текст для поиска). Если вы оставите это поле пустым, вы скажете Vim использовать предыдущее регулярное выражение поиска. При этом вы можете набрать сложное регулярное выражение с /и иметь все преимущества set incsearch, а затем использовать %s//replacementкоманду для фактического выполнения поиска и замены.

Если вы хотите что-то похожее на incsearch для :sкоманд, посмотрите vim-over , но я просто предпочитаю использовать нативный способ Vim.

Акшай
источник
Раньше я использовал вариант этого: просто используйте, :%s/pattern/replace/а затем нажмите uдля отмены, вы можете увидеть части, которые Vim изменил, если вы hlsearchвключили. И вы можете заменить этот текст снова ^R.
Мартин Турной
7

Моя любимая интерактивная замена - поиск с использованием /и просмотр с использованием соответствий n.

Затем выберите матч , используя gnи затем , sчтобы заменить текст с тем, что мне нравится.

И повторите , перейдя к следующему матчу и нажав.

Неау Овидиу Габриэль
источник
Это очень хороший трюк, потому что он: (1) интерактивный, (2) вы можете перейти к предыдущему матчу, если случайно пропустили его (то, что вы не можете сделать, используя :s/old/new/gc).
Айрат
3

В Neovim также есть 'inccommand'опция, которая позволяет вам предварительно просмотреть результат команды во :sвремя ее ввода.

Лукас
источник
1

Для удобства всех, incsearchбыл обновлен в vim8, чтобы также показывать предварительный просмотр при вводе шаблона

Дхрува Сагар
источник