Как получить предварительный просмотр команды подстановки?

9

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

Например, скажем, у меня есть некоторые вызовы функций, такие как okFunction(arg1, arg2 arg3). Конечно, аргументы будут отличаться при каждом вызове функции. Теперь скажите, что я обнаружил лучшую функцию, которая не нужна arg2. Я могу легко настроить весь файл с

:%s/\<okFunction(\(\w\+\), \(\w\+\), \(\w\+\))/betterFunction(\1, \3)/gc

Хотя концептуально просто, я не уверен, что правильно понял синтаксис в этом довольно длинном паттерне. Здесь cдействительно помогает флаг, но проблема в том, что при запросе подтверждения vim не будет показывать, на что будет заменен матч. Я имею в виду, он покажет выражение замены, но не оцененный результат. Если я подтвердлю замену с помощью y, vim немедленно перейдет к следующему матчу, и я не буду в состоянии видеть, сделал ли я какие-либо ошибки.

Я обнаружил плагин vim-over, который частично решает проблему, но только в том случае, если при вводе команды на экране отображаются все совпадения. Как только вы нажмете Enter, поведение будет точно таким же, как я описал выше, и я не получу предварительный просмотр.

Итак, есть ли способ получить vim для оценки выражения замены при запросе подтверждения для команд замены?

Витор Эйдзи
источник
2
это элемент списка желаний в трекере vim-bug (извините, не можете найти его в данный момент)
Кристиан Брабандт
2
Для чего я обычно использую замену в первой строке, чтобы заменить без %, проверьте, что результат - то, что я ожидал, и затем используйте замену с %(это всего лишь несколько нажатий клавиш:) :<up><c-b>%. Очевидно, что предварительный просмотр будет гораздо более эффективным, чем это. Хотя патч недоступен, может быть, можно обернуть подстановку в функции vimscript с помощью этой опции, но это звучит как большая работа ...
statox
2
@ChristianBrabandt Нашел это . Это пока что с несекретным приоритетом ...
Витор Эйджи
2
@VitorEiji это был не тот, о котором я думал. Но на самом деле это не имеет значения, поскольку в настоящее время это невозможно. Neovim предоставляет опцию «inccommand», которая может сработать (или нет, не знаю сейчас)
Кристиан Брабандт
Зло предвидит замену; Хотя я не знаю, как это происходит.
Джеремия

Ответы:

2

Один из обходных путей - макросы. Выделите все проблемные области и выполните замену по одной строке за раз. Затем решите, хотите вы этого или нет. После того, как вы сделали nдля следующей области.

Для вашего случая специально:

  1. Поиск областей: /\<okFunction(\(\w\+\), \(\w\+\), \(\w\+\))
  2. Начните запись макроса qq.
  3. Применять :s/\<okFunction(\(\w\+\), \(\w\+\), \(\w\+\))/betterFunction(\1, \3)/g
  4. Остановить запись макроса q
  5. Либо отменить ( u), либо перейти к следующему результату поиска ( n).
  6. Применить макрос @q.
  7. Повторите шаги 5 и 6 по мере необходимости.

Очевидно, не совсем то, что вы искали, но обычно это то, что я делаю.

Tumbler41
источник
это классно! Я никогда не понимал, что когда вы делаете поиск с /ним, также ведет себя как визуальный выбор - приятно.
the_velour_fog
@the_velour_fog " /... ведет себя как визуальный выбор." На самом деле это не так. Причина, по которой это работает, заключается в том, что :s//действует на текущую строку, а использование nпереносит вас к следующему вхождению.
Tumbler41
1
Если вы не укажете шаблон для :s/pattern/replacementнего, то будете использовать последнюю строку поиска, поэтому на шаге 3 вы можете подать заявку, :s//betterFunction(\1, \3)/gчтобы сохранить набор текста.
Хаегин
@ Tumbler41 ах, спасибо за разъяснения. Да, я также делаю эту базовую технику поиска , затем применяю макрос , обычно я сначала заполняю arglist и использую, а :vimgrep /pattern/ ##затем применяю макрос. Таким образом, если выясняется, что мой шаблон на самом деле совпадает последовательно, а макрос слишком утомителен, я могу быстро вернуться к :argdo %s/.../..../gcи начать полет через операцию
the_velour_fog