Чи є якийсь спосіб підключити економію у Vim аж до введення в git?


11

Я новачок у світі Vim, і я хочу зробити так, щоб кожен раз, коли я зберігаю файл, він передається на контроль версій. Чи можливо це?

Відповіді:


4

Ви можете використовувати автокоманди Vim:

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

Це неперевірено, але слід додати файл та закріпити його з ім'ям файлу як повідомлення про фіксацію.
Ви хочете BufWritePost, оскільки це запускається після запису файлу. Я б міг уявити, що є багато набридливих чи небезпечних випадків.


4

Я використовую автоматичну команду 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'

1
Не вистачає єдиної лапки в кінці cmd, відразу після fi.
Ендрю-Дуфресне

2
Ця версія працює лише в тому випадку, якщо ви знаходитесь в кореневій директорії репо. Краще рішення - autocmd BufWritePost * execute '! if [ -d .git ] || git rev-parse --git-dir > /dev/null 2>&1 ; then git add % ; git commit -m %; fi'з відповіді на відповідь
Ендрю-Дуфресне,

Це працює для мене на Linux. Будь-яка ідея, як змусити її працювати на Windows?
користувач334287

2

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


1

Спираючись на відповіді, які надали інші:

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

Ви, безумовно, можете це зробити нічим макросом або з перестановкою команд.

(Перевірте /programming/117150/can-i-re-map-commands-in-vim )

Я не впевнений, що це хороший варіант. Я зараз не знаю в git і знаю, що іноді відрізняється від svn. Але я б не робив цього автозв'язку зі svn. Здійснення зобов'язань має бути осмисленим, а не певним заощадженням у регулярний час.

Ви зазвичай здійснюєте фіксацію, тому що ви додали функцію, виправили помилку, ... не тільки тому, що працювали над файлом. Ви не закінчите з проектом, який не збирається, або незакінченою функцією.


Це правда, але я також хочу мати сценарій протягом ночі, який переміщує файли, які успішно компілюються з репо "збереження на фіксацію", до репосту "змістовної зміни".
gonzo.floyd

Ну, це не зовсім погана ідея з Git. "Часто виконувати зобов'язання" - це свого роду девіз. Це працює і краще, тому що ви можете одночасно працювати над одним файлом з декількома розробниками та мінімальними проблемами. Було б дуже корисно підключити механізм збереження vim.
Метаграф

Робочі процеси в Git можуть кардинально відрізнятися від Subversion. Ви ніколи не можете цього робити в svn, оскільки це було б образливо, але він має абсолютно правильне використання в git. Наприклад, якийсь сервер тестової інтеграції може бути підключений до тестової гілки. Автоматична фіксація на збереження потім стає досить корисною. Коли ви дістанетесь до того, що щось працює, ви скористаєтеся git rebase, щоб скріпити всю активність в одній послідовності зі значущим повідомленням, а потім об'єднатись у свою галузь розробки. Якщо це звучить страшно або складно, це лише тому, що ви адаптовані до обмежень нерозподіленого джерела vcs.
Калеб

0

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

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


0

Я хочу повідомити про свою проблему.

У мене є 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

Пояснення:

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

Примітки:

  1. Команди можна «прикувати» vim до |. Ланцюг перерве, якщо будь-яка команда не вдасться. Щоб перервати кілька рядків, розпочніть наступний рядок із \.
  2. Це можна поширити на ftplugin-файли. Ваші фільтри будуть *.vimіexpand($VIMCONF)."/ftplugin/"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.