Довольно часто мне нужно выполнить подстановку, в которой совпадения будут разбросаны по всему большому файлу с нетривиальными выражениями поиска и замены.
Например, скажем, у меня есть некоторые вызовы функций, такие как okFunction(arg1, arg2 arg3)
. Конечно, аргументы будут отличаться при каждом вызове функции. Теперь скажите, что я обнаружил лучшую функцию, которая не нужна arg2
. Я могу легко настроить весь файл с
:%s/\<okFunction(\(\w\+\), \(\w\+\), \(\w\+\))/betterFunction(\1, \3)/gc
Хотя концептуально просто, я не уверен, что правильно понял синтаксис в этом довольно длинном паттерне. Здесь c
действительно помогает флаг, но проблема в том, что при запросе подтверждения vim не будет показывать, на что будет заменен матч. Я имею в виду, он покажет выражение замены, но не оцененный результат. Если я подтвердлю замену с помощью y
, vim немедленно перейдет к следующему матчу, и я не буду в состоянии видеть, сделал ли я какие-либо ошибки.
Я обнаружил плагин vim-over, который частично решает проблему, но только в том случае, если при вводе команды на экране отображаются все совпадения. Как только вы нажмете Enter, поведение будет точно таким же, как я описал выше, и я не получу предварительный просмотр.
Итак, есть ли способ получить vim для оценки выражения замены при запросе подтверждения для команд замены?
источник
%
, проверьте, что результат - то, что я ожидал, и затем используйте замену с%
(это всего лишь несколько нажатий клавиш:):<up><c-b>%
. Очевидно, что предварительный просмотр будет гораздо более эффективным, чем это. Хотя патч недоступен, может быть, можно обернуть подстановку в функции vimscript с помощью этой опции, но это звучит как большая работа ...Ответы:
Один из обходных путей - макросы. Выделите все проблемные области и выполните замену по одной строке за раз. Затем решите, хотите вы этого или нет. После того, как вы сделали
n
для следующей области.Для вашего случая специально:
/\<okFunction(\(\w\+\), \(\w\+\), \(\w\+\))
qq
.:s/\<okFunction(\(\w\+\), \(\w\+\), \(\w\+\))/betterFunction(\1, \3)/g
q
u
), либо перейти к следующему результату поиска (n
).@q
.Очевидно, не совсем то, что вы искали, но обычно это то, что я делаю.
источник
/
ним, также ведет себя как визуальный выбор - приятно./
... ведет себя как визуальный выбор." На самом деле это не так. Причина, по которой это работает, заключается в том, что:s//
действует на текущую строку, а использованиеn
переносит вас к следующему вхождению.:s/pattern/replacement
него, то будете использовать последнюю строку поиска, поэтому на шаге 3 вы можете подать заявку,:s//betterFunction(\1, \3)/g
чтобы сохранить набор текста.:vimgrep /pattern/ ##
затем применяю макрос. Таким образом, если выясняется, что мой шаблон на самом деле совпадает последовательно, а макрос слишком утомителен, я могу быстро вернуться к:argdo %s/.../..../gc
и начать полет через операцию