Я новичок в мире Vim и хочу сделать так, чтобы каждый раз, когда я сохранял файл, он передавался на контроль версий. Это возможно?
Я новичок в мире Vim и хочу сделать так, чтобы каждый раз, когда я сохранял файл, он передавался на контроль версий. Это возможно?
Ответы:
Вы можете использовать автокоманды Vim:
:autocmd BufWritePost * execute '!git add % && git commit -m %'
Это не проверено, но он должен добавить файл и зафиксировать его с именем файла как сообщение о коммите.
Вы хотите BufWritePost, так как это срабатывает после записи файла. Я думаю, что есть много утомительных или небезопасных крайних случаев.
Я использую автокоманду 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'
autocmd BufWritePost * execute '! if [ -d .git ] || git rev-parse --git-dir > /dev/null 2>&1 ; then git add % ; git commit -m %; fi'
из SO ответа
Возможно, вы захотите заглянуть в беглый плагин, это очень мощный плагин для git для vim. Вы также можете настроить autocmd
как donothingsuccessfully
предложено, но у него есть всплывающее окно :Gcommit
или :Gstatus
(из которого вы можете выбрать изменения для добавления в индекс git)
Опираясь на ответы, предоставленные другими:
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 для продолжения» (но если фиксация не сработала, вы не узнаете, что она не удалась).
Вы наверняка могли бы с этим макрос или с переназначением команды.
(Проверьте /programming/117150/can-i-re-map-commands-in-vim )
Я не уверен, что это хороший вариант. Я не очень хорошо разбираюсь в git и знаю, что иногда он отличается от svn. Но я бы не делал эту авто-фиксацию с SVN. Фиксация должна быть значимой, а не сохранять в обычное время.
Обычно вы делаете коммит, потому что вы добавили функцию, исправили ошибку, а не только потому, что вы работали с файлом. У вас не будет некомпилируемого проекта или незавершенной функции.
Я знаю, что этот вопрос старый и это явное самореклама, но я написал плагин Vim, который будет запускать определенные сценарии оболочки после определенных autocmd
событий Vim . Например, названный скрипт .bufwritepost.vimhook.sh
будет запускаться (синхронно) каждый раз при запуске BufWritePost
команды. После этого вы можете легко включить любую логику для выполнения коммита git внутри этого скрипта. Плагин принимает определенные соглашения об именах этих сценариев, а также поддерживает сценарии «ловушки», которые запускаются только для файлов, соответствующих определенным именам или имеющих определенные расширения.
Полная информация: https://github.com/ahw/vim-hooks
Я хочу сообщить о своем взгляде на эту проблему.
У меня есть 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
Объяснение:
git
должен находиться в пути (вы должны быть в состоянии напечатать git <ENTER>
в cmd.exe
)tempdir
Ноты:
|
. Цепочка будет прервана, если какая-либо из команд не будет выполнена. Чтобы разбить несколько строк, начните следующую строку с \
.*.vim
иexpand($VIMCONF)."/ftplugin/"