отредактируйте много идентичных файлов в vim и сохраните их все одной командой - PullRequest
0 голосов
/ 19 февраля 2010

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

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

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

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

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

Это о vim и о том, как здорово.

Бонус: получите vim, чтобы предупредить, если файлы не идентичны.

Ответы [ 4 ]

3 голосов
/ 19 февраля 2010

Если они в настоящее время идентичны, вы хотите изменить их идентично, и они должны остаться идентичными, я бы сделал это:

Отредактируйте первый, а затем удалите все остальные. Тогда я бы связал все остальные с первым.

1 голос
/ 19 февраля 2010

вы можете использовать vim в командной строке. например, заменить все «старые» на «новые» (но только для 1 файла).

vim -c '%s/old/new' -c "wq" file

Просмотрите документацию vim, чтобы узнать, можете ли вы сделать это для нескольких файлов (:bn и т. Д.). Как было предложено в одном из комментариев, vim - это редактор, такой же, как sed / ed / awk. Его цель - редактировать файлы, поэтому использовать * nix tools тоже самое. Возможно, вы захотите написать скрипт для этого.

1 голос
/ 19 февраля 2010

Я бы использовал 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()
0 голосов
/ 19 февраля 2010

Ну, вы можете записать свои изменения в первый файл.Я не знаю, будет ли запись сохраняться при смене буфера, я подозреваю, и давайте предположим, что нет.Если бы это было всего несколько десятков файлов, я бы просто вручную воспроизвел записанную последовательность на всех них.Если вы хотите более долгосрочное, менее специализированное решение, я ожидаю, что можно создать функцию vim, которая циклически переключается между буферами и выполняет normal @a для каждого из них (предположим, что вы записали свои изменения в первый буфер в регистреа), затем делает :wq и повторяет следующий буфер.

В vim, выполните :help 10.1 и :help complex-repeat.

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

...