Отступ в VIM со всеми файлами в папке

У меня есть папка, содержащая сотни файлов TTL (TeraTermLanguage). Теперь я хотел сделать отступ для всех этих файлов.

Я создал teraterm.vim для отступов, и я открываю файл с помощью VIM и делаю "gg=G", и весь файл получает отступы правильно.

Но есть ли способ, где я могу сделать отступ для всех файлов в папке.

Я хотел сделать с помощью Shell. Но в VIM я не мог передать команду отступа файла в качестве аргумента VIM.

Пожалуйста, предложите, какой лучший способ сделать отступ для всех файлов в VIM.

4 ответа

Решение

Гораздо проще, чем писать сценарии в vim из командной строки bash, - использовать vimscript изнутри vim (или, возможно, гораздо более простой однострочник для сценариев vim из командной строки). Я лично предпочитаю использовать список arg для всех манипуляций с несколькими файлами. Например:

:args ~/src/myproject/**/*.ttl | argdo execute "normal gg=G" | update
  • args устанавливает arglist, используя подстановочные знаки (** будет соответствовать текущему каталогу, а также подкаталогам)
  • | позволяет нам запускать несколько команд в одной строке
  • argdo запускает следующие команды для каждого аргумента (он поглотит вторую |)
  • execute предотвращает normal от глотания следующей трубы.
  • normal запускает следующие команды нормального режима (с чем вы работали в первую очередь)
  • update как :w, но сохраняет только при изменении буфера.

это :args ... | argdo ... | update шаблон очень полезен для любого вида манипуляций с файлами в рамках всего проекта (например, поиск и замена через %s/foo/bar/ge или настройка униформы fileformat или же fileencoding).

(другие люди предпочитают аналогичную модель, используя список буферов и :bufdo, но со списком аргументов мне не нужно беспокоиться о закрытии текущих буферов или открытии нового сеанса vim.)

Откройте терминал. Тип:

$ vim -w indentme.scr foo.c

Затем введите это точно (в командном режиме):

gg=G:wq

Это закроет vim, сохранив процесс отступа всех строк в файле к скрипту Vim с именем indentme.scr,

Замечания: indentme.scr будет содержать записи всех введенных ключевых команд, поэтому, когда вы закончите делать отступ для файла, не тратьте много времени, используя клавиши со стрелками для просмотра файла, потому что это приведет к гораздо большему сценарию и будет сильно тормозить пакетные операции.

Теперь, чтобы сделать отступ для всех строк в файле, просто введите следующую команду:

$ vim -s indentme.scr unindented-file.c

Vim будет мигать в открытом режиме (если вы работаете на быстром компьютере и не редактируете огромный файл), выравнивая все строки и сохраняя файл на месте.

К сожалению, это будет работать только для одного файла за раз, но вы можете легко масштабировать функциональность, используя sh"s for цикл:

for filename in *.ttl ; do
    vim -s indentme.scr "$filename"
done

Примечание: это сохранит любой файл. Если не set bk в вашем ~/.vimrc, не ожидайте, что резервная копия будет сохранена.

Я отказался от раствора амфетамина. Однако мне нужно было рекурсивно искать по нескольким каталогам. Вот решение, которое я использовал:

$ find . -type f -name '*.ttl' -exec vim -s indentme.scr "{}" \;

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

Шаг 1 Установите astyle (инструмент, используемый для форматирования) с помощью следующей команды Откройте терминал. Тип:

sudo apt-get install astyle

Шаг 2 Убедитесь, что в вашей системе установлен vim. Запустите приведенные ниже команды из каталога, в котором находятся ваши файлы кода. Команда ниже создаст скрипт, который мы намерены запускать рекурсивно, чтобы украсить каждый файл в нашем каталог.(как указано в ответе выше)

vim -w indentme.scr foo.c

Шаг 3 Затем введите это точно (в командном режиме) и нажмите Enter

:%!astyle 

Шаг 4 Затем введите это точно (в командном режиме) и нажмите Enter

:wq

Шаг 5 Последний раз запустите это рекурсивно с помощью следующей команды:

find . -type f -name '*.cpp' -exec vim -s indentme.scr "{}" \;

Все ваши файлы cpp будут отформатированы правильно.

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