Отредактируйте много идентичных файлов в vim и сохраните их все одной командой

Предположим, у меня много идентичных файлов README.txt в нескольких десятках подкаталогов. В моем фэнтезийном мире я мог запустить это:

vim --magic-mindreading-flag */README.txt

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

Пожалуйста, избавьте меня от следующего:

  1. Как это сделать с помощью команд оболочки.
  2. Лекция по ссылке на одну авторитетную копию (например, с символическими ссылками)
  3. Рекомендация использовать известный вам редактор, который его поддерживает.

Это о 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 каким-то образом распознает их идентичность и сохранит мои изменения во всех файлах одновременно".

Другие вопросы по тегам