8

Я новичок в мире Vim и хочу сделать так, чтобы каждый раз, когда я сохранял файл, он передавался на контроль версий. Это возможно?

7 ответов7

3

Я использую автокоманду 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'
3

Вы можете использовать автокоманды Vim:

:autocmd BufWritePost * execute '!git add % && git commit -m %'

Это не проверено, но он должен добавить файл и зафиксировать его с именем файла как сообщение о коммите.
Вы хотите BufWritePost, так как это срабатывает после записи файла. Я думаю, что есть много утомительных или небезопасных крайних случаев.

2

Возможно, вы захотите взглянуть на беглый плагин, это очень мощный плагин для git для vim. Вы также можете настроить autocmd как подсказывает donothingsuccessfully , но у него есть всплывающее окно :Gcommit или :Gstatus (из которого вы можете выбирать изменения для добавления в индекс git).

0

Вы наверняка могли бы с этим макрос или с переназначением команды.

(Проверьте https://stackoverflow.com/questions/117150/can-i-re-map-commands-in-vim)

Я не уверен, что это хороший вариант. Я не очень хорошо разбираюсь в git и знаю, что иногда он отличается от svn. Но я бы не делал эту авто-фиксацию с SVN. Фиксация должна быть значимой, а не сохранять в обычное время.

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

0

Я знаю, что этот вопрос старый и это явное самореклама, но я написал плагин Vim, который будет запускать определенные сценарии оболочки после определенных событий Vim autocmd . Например, сценарий с именем .bufwritepost.vimhook.sh будет запускаться (синхронно) каждый раз при запуске команды BufWritePost . Затем вы можете легко включить любую логику для выполнения git commit внутри этого скрипта. Плагин предполагает определенные соглашения об именах этих сценариев, а также поддерживает сценарии "ловушки", которые запускаются только для файлов, соответствующих определенным именам или имеющих определенные расширения.

Полная информация: https://github.com/ahw/vim-hooks

0

Опираясь на ответы, предоставленные другими:

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 для продолжения" (но если фиксация не сработала, вы не узнаете, что она не удалась).

0

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

У меня есть 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

Объяснение:

  1. Для windows я меняю каталог на местоположение файла vimrc. Это не самое лучшее, и я могу изменить позже, чтобы быть похожим на Linux. Не принимайте это слишком серьезно, но вы можете использовать его в качестве руководства. git должен быть в пути (т.е. вы должны иметь возможность набрать git <ENTER> в cmd.exe)
  2. Для Linux я сначала проверяю, что я редактирую права vimrc.vim
  3. Сохранить текущий рабочий каталог в tempdir
  4. Перейдите в файл vimrc.vim
  5. Сделать мерзавец совершить
  6. Вернуться в предыдущий рабочий каталог
  7. Я вручную нажимаю изменения мерзавца

Заметки:

  1. Команды могут быть "связаны" в vim с помощью | , Цепочка будет прервана, если какая-либо из команд не будет выполнена. Чтобы разбить несколько строк, начните следующую строку с \ .
  2. Это может быть расширено до файлов ftplugin. Ваши фильтры будут *.vim и expand($VIMCONF)."/ftplugin/"

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .