Выполнить команду vim как хук предварительной фиксации git

Я использую следующую команду в vim для пакетного автоматического форматирования файлов определенного типа:

:args ~/someDirectory/**/*.filetype | argdo execute "normal gg=G" | update

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

Как бы я это сделал?

Заранее спасибо.


person Ryan Price    schedule 20.11.2017    source источник


Ответы (1)


Одним из решений было бы, как в этом ответе, вызвать vim:

files=`find /path/to/repo -name "*.filetype" -type f`
for file in $files
do
    vim -e -s -n "+normal gg=GZZ" $file
done

Но вместо использования хука pre-commit вы можете определить скрипт clean, который будет выполнять скрипт (вызывая vim, как указано выше).

Сценарий вызывается через драйвер фильтра содержимого с использованием .gitattributes объявление (в вашем случае: *.filetype).

https://i.stack.imgur.com/tumAc.png
(изображение из "Настройка Git — атрибуты Git" из "Pro Git book"))

Как только вы объявите этот драйвер файловой системы контента в своей локальной конфигурации git, он автоматически, git commit, применит этот сценарий.

См. полный пример в разделе «Рекомендации — автоматизация Git + Build — разделение конфигураций».

person VonC    schedule 20.11.2017
comment
Спасибо, что наставили меня на правильный путь, но я не совсем там. Фильтры, кажется, ожидают stdin и пишут на stdout. Если я хочу отформатировать только те файлы, которые были зафиксированы, как мне это сделать? %f говорит, что будет передавать имя файла, но в документах сразу после этого указано, что фильтры ожидают stdin и stdout. Итак, учитывая все это, как применить мою команду vim к конкретным фиксируемым файлам? - person Ryan Price; 28.11.2017
comment
@RyanPrice Если я хочу отформатировать только фиксируемые файлы, как мне это сделать ?: это то, что делает чистый скрипт: он форматирует только файлы, которые должны быть зафиксированы. Оттуда посмотрите, не можете ли вы передать содержимое команде vim, как в vi.stackexchange.com/a/5994. - person VonC; 28.11.2017