На самом деле я начал делать это, используя argdo в vim. Прежде всего, установите аргументы:
:args **/*.java
«**» пересекает все вложенные каталоги, а «args» устанавливает их в качестве списка arg (как если бы вы запустили vim со всеми этими файлами в качестве аргументов vim, например: vim package1 / One.java package1 /Two.java package2 / One.java)
Затем возьмите любые команды, которые мне нужны, чтобы сделать нужное преобразование, например:
:/^package.*$/s/$/\rimport package.name.*;/
"/^package.*$/" действует как адрес для обычной замены "s ///", которая следует за ней; «/ $ /» соответствует концу строки пакета; «\ r» - это перевод строки.
Теперь я могу автоматизировать это для всех файлов с помощью argdo. Я нажимаю «:», затем вверх, чтобы получить указанную выше строку, затем вставляю «argdo», чтобы оно стало:
:argdo /^package.*$/s/$/\rimport package.name.*;/
Это «argdo» применяет это преобразование к каждому файлу в списке аргументов.
Что действительно хорошо в этом решении, так это то, что оно не опасно: оно еще не изменило файлы, но я могу посмотреть на них, чтобы подтвердить, что оно сделало то, что я хотел. Я могу отменить определенные файлы или выйти, если мне не нравится то, что они делают (кстати: я сопоставил ^ n и ^ p с: n и: N, чтобы я мог быстро просматривать файлы). Теперь я фиксирую их с помощью файлов ": wa" - "write all".
:wa
На данный момент я все еще могу отменить определенные файлы или отточить их при необходимости.
Этот же подход можно использовать для других рефакторингов (например, изменить сигнатуру метода и обращения к нему во многих файлах).
Кстати: это неуклюже: "s/$/\rtext/
" ... Должен быть лучший способ добавить текст из командной строки vim ...