Я новачок у світі 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'
з відповіді на відповідь
Спираючись на відповіді, які надали інші:
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"), щоб відкрити 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/"