Отредактируйте много идентичных файлов в vim и сохраните их все одной командой
Предположим, у меня много идентичных файлов README.txt в нескольких десятках подкаталогов. В моем фэнтезийном мире я мог запустить это:
vim --magic-mindreading-flag */README.txt
и вместо того, чтобы редактировать файлы для меня последовательно, vim каким-то образом распознает их идентичность и сохранит мои изменения во всех файлах одновременно, и волшебным образом узнает, что я хочу.
Пожалуйста, избавьте меня от следующего:
- Как это сделать с помощью команд оболочки.
- Лекция по ссылке на одну авторитетную копию (например, с символическими ссылками)
- Рекомендация использовать известный вам редактор, который его поддерживает.
Это о VIM, и как здорово.
Бонус: получите vim, чтобы предупредить, если файлы не идентичны.
4 ответа
Я хотел бы использовать vimdiff
редактировать все файлы README одновременно (показывая любые различия; вы можете развернуть текущее окно, используя CTRL-W |).
Затем, чтобы сохранить все файлы, используйте команду вроде :SaveAll
(сохраняет только ваши аргументы, а не любые другие буферы, которые вы, возможно, открыли).
function SaveAll()
let i = 0
"can't save other files while their buffers are open
exe 'on'
while i < argc()
exe 'w! ' . argv(i)
let i = i + 1
endwhile
endfunction
command SaveAll call SaveAll()
Если они в настоящее время идентичны, вы хотите изменить их идентично, и они должны остаться идентичными, я бы сделал это:
Отредактируйте первый, а затем удалите все остальные. Тогда я бы связал все остальные с первым.
Вы можете использовать vim в командной строке. Например, заменить все "старые" на "новые" (но только для 1 файла).
vim -c '%s/old/new' -c "wq" file
посмотрите документацию vim, чтобы узнать, можете ли вы сделать это для нескольких файлов (:bn
так далее). Как предложил один из комментариев, vim - это редактор, такой же, как sed / ed / awk. Его цель - редактировать файлы, поэтому использовать *nix tools тоже самое. Возможно, вы захотите написать скрипт для этого.
Ну, вы могли бы записать свои изменения в первый файл. Я не знаю, будет ли запись сохраняться при смене буфера, я подозреваю, и давайте предположим, что нет. Если бы это было всего несколько десятков файлов, я бы просто вручную воспроизвел записанную последовательность на всех них. Если вы хотите более долгосрочное, менее специализированное решение, я ожидаю, что можно создать функцию vim, которая циклически переключается между буферами и выполняет normal @a
на каждом из них (предположим, что вы записали свои изменения в первый буфер в регистре a), затем :wq
и повторяется в следующем буфере.
В VIM сделать :help 10.1
а также :help complex-repeat
,
Я понимаю, что это не удовлетворяет ваш запрос: "вместо того, чтобы редактировать файлы для меня последовательно, vim каким-то образом распознает их идентичность и сохранит мои изменения во всех файлах одновременно".