Отступ в 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 будут отформатированы правильно.