Я новичок в мире Vim и хочу сделать так, чтобы каждый раз, когда я сохранял файл, он передавался на контроль версий. Это возможно?
7 ответов
Я использую автокоманду vim, которую я помещаю в свой .vimrc. Команда сначала выполняет грубую проверку того, что мы работаем в каталоге git (проверяя наличие каталога .git, либо в текущем каталоге, либо используя git rev-parse
), затем использует git -a -m %
чтобы только ранее добавленные файлы размещаются и фиксируются.
autocmd BufWritePost * execute '! if [ -d .git ] || git rev-parse --git-dir > /dev/null 2>&1 ; then git add % ; git commit -m %; fi'
Вы можете использовать автокоманды Vim:
:autocmd BufWritePost * execute '!git add % && git commit -m %'
Это не проверено, но он должен добавить файл и зафиксировать его с именем файла как сообщение о коммите.
Вы хотите BufWritePost, так как это срабатывает после записи файла.
Я думаю, что есть много утомительных или небезопасных крайних случаев.
Возможно, вы захотите взглянуть на беглый плагин, это очень мощный плагин для git для vim. Вы также можете настроить autocmd
как подсказывает donothingsuccessfully
, но у него есть всплывающее окно :Gcommit
или :Gstatus
(из которого вы можете выбирать изменения для добавления в индекс git).
Вы наверняка могли бы с этим макрос или с переназначением команды.
(Проверьте https://stackoverflow.com/questions/117150/can-i-re-map-commands-in-vim)
Я не уверен, что это хороший вариант. Я не очень хорошо разбираюсь в git и знаю, что иногда он отличается от svn. Но я бы не делал эту авто-фиксацию с SVN. Фиксация должна быть значимой, а не сохранять в обычное время.
Обычно вы делаете коммит, потому что вы добавили функцию, исправили ошибку, а не только потому, что вы работали с файлом. У вас не будет некомпилируемого проекта или незавершенной функции.
Я знаю, что этот вопрос старый и это явное самореклама, но я написал плагин Vim, который будет запускать определенные сценарии оболочки после определенных событий Vim autocmd
. Например, сценарий с именем .bufwritepost.vimhook.sh
будет запускаться (синхронно) каждый раз при запуске команды BufWritePost
. Затем вы можете легко включить любую логику для выполнения git commit внутри этого скрипта. Плагин предполагает определенные соглашения об именах этих сценариев, а также поддерживает сценарии "ловушки", которые запускаются только для файлов, соответствующих определенным именам или имеющих определенные расширения.
Полная информация: https://github.com/ahw/vim-hooks
Опираясь на ответы, предоставленные другими:
autocmd BufWritePost * execute ':silent ! if git rev-parse --git-dir > /dev/null 2>&1 ; then git add % ; git commit -m "Auto-commit: saved %"; fi > /dev/null 2>&1'
Это абсолютно прозрачно. Вы не получите сообщение "Нажмите Enter для продолжения" (но если фиксация не сработала, вы не узнаете, что она не удалась).
Я хочу сообщить о своем взгляде на эту проблему.
У меня есть vimrc.vim
в репозитории git ($VIMCONF
, с начальной загрузкой .vimrc), и я сопоставил <Leader>ve
("vim edit"), чтобы открыть vimrc в новой вкладке. Это не влияет на текущий рабочий каталог.
Поэтому, если я отредактирую vimrc.vim
из vim, запущенного в другом каталоге за пределами моего хранилища vim git, подход, который обсуждал Ник Эдвардс, потерпит неудачу. Мой взлом заключается в следующем (для Windows и Linux)
if has('win32')
" The git command has to be passed to git. So we need to call bash.exe.
autocmd BufEnter *vimrc.vim silent! lcd %:p:h
autocmd BufWritePost *vimrc.vim if expand('<amatch>') =~ substitute(expand('$VIMCONF\vimrc.vim'), '\', '/', "g") | execute '! git add % & git commit -m %' | endif
else " Linux
autocmd BufWritePost *vimrc.vim
\ if expand('<amatch>') =~ expand($VIMCONF)."/vimrc.vim" |
\ let tempdir = getcwd() | execute 'cd' fnameescape(expand('<amatch>:h')) |
\ execute '! if git rev-parse --git-dir > /dev/null 2>&1 ; then git add % ; git commit -m % ; fi' |
\ execute 'cd' fnameescape(tempdir) |
\ endif
endif
Объяснение:
- Для windows я меняю каталог на местоположение файла vimrc. Это не самое лучшее, и я могу изменить позже, чтобы быть похожим на Linux. Не принимайте это слишком серьезно, но вы можете использовать его в качестве руководства.
git
должен быть в пути (т.е. вы должны иметь возможность набратьgit <ENTER>
вcmd.exe
) - Для Linux я сначала проверяю, что я редактирую права vimrc.vim
- Сохранить текущий рабочий каталог в
tempdir
- Перейдите в файл vimrc.vim
- Сделать мерзавец совершить
- Вернуться в предыдущий рабочий каталог
- Я вручную нажимаю изменения мерзавца
Заметки:
- Команды могут быть "связаны" в vim с помощью
|
, Цепочка будет прервана, если какая-либо из команд не будет выполнена. Чтобы разбить несколько строк, начните следующую строку с\
. - Это может быть расширено до файлов ftplugin. Ваши фильтры будут
*.vim
иexpand($VIMCONF)."/ftplugin/"