Czy jest jakiś sposób na przechwycenie oszczędzania w Vimie do zatwierdzania w git?

11

Jestem nowy w świecie Vima i chcę to zrobić, aby za każdym razem, gdy zapisywałem plik, był on odpowiedzialny za kontrolę wersji. czy to możliwe?

gonzo.floyd
źródło

Odpowiedzi:

4

Możesz użyć komend Vima:

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

To nie zostało przetestowane, ale powinno dodać plik i zatwierdzić go z nazwą pliku jako komunikat zatwierdzenia.
Chcesz BufWritePost, ponieważ jest on uruchamiany po zapisaniu pliku. Wyobrażam sobie jednak, że istnieje wiele uciążliwych lub niebezpiecznych skrzynek.

z powodzeniem
źródło
4

Korzystam z automatycznego polecenia vim, które umieszczam w moim .vimrc. Komenda najpierw wykonuje ogólne sprawdzenie, czy pracujemy w katalogu git (sprawdzając istnienie katalogu .git, w bieżącym katalogu lub za pomocą git rev-parse), a następnie używa git -a -m %, aby tylko pliki, które zostały wcześniej dodane, były przemieszczane i zatwierdzane .

autocmd BufWritePost * execute '! if [ -d .git ] || git rev-parse --git-dir > /dev/null 2>&1 ; then git add % ; git commit -m %; fi'
Nick Edwards
źródło
1
Brakuje pojedynczego cudzysłowu na końcu cmd, zaraz po fi.
Andrew-Dufresne,
2
Ta wersja działa tylko wtedy, gdy znajdujesz się w katalogu głównym repozytorium. Lepszym rozwiązaniem jest autocmd BufWritePost * execute '! if [ -d .git ] || git rev-parse --git-dir > /dev/null 2>&1 ; then git add % ; git commit -m %; fi', ze odpowiedź SO
Andrew-Dufresne
Działa to dla mnie na systemie Linux. Masz pomysł, jak to zrobić w systemie Windows?
user334287
2

Możesz zajrzeć do zbiegającej się wtyczki, jest to bardzo potężna wtyczka git dla vima. Możesz również skonfigurować sugestie autocmdas donothingsuccessfully, ale pop-up wyskakuje :Gcommitlub :Gstatus(z którego możesz cherry wybrać zmiany, aby dodać do indeksu git)

mkomitee
źródło
1

Opierając się na odpowiedziach udzielonych przez innych:

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'

To jest całkowicie przejrzyste. Nie dostaniesz komunikatu „Naciśnij Enter, aby kontynuować” (ale jeśli zatwierdzenie nie zadziałało, nie będziesz wiedział, że nie powiodło się).

Sargon
źródło
0

Z pewnością można to zrobić za pomocą makra lub z mapowaniem poleceń.

(Sprawdź /programming/117150/can-i-re-map-commands-in-vim )

Nie jestem jednak pewien, czy to dobra opcja. Na razie nie jestem biegły w git i wiem, że czasem różni się od svn. Ale nie zrobiłbym tego automatycznego zatwierdzania za pomocą svn. Zaangażowanie musi mieć sens, a nie oszczędzać w zwykłym czasie.

Zwykle zatwierdzasz, ponieważ dodałeś funkcję, naprawiłeś błąd, ... nie tylko dlatego, że pracowałeś nad plikiem. Nie skończysz z niekompilującym się projektem lub niedokończoną funkcją.

M'vy
źródło
To prawda, ale chcę również mieć skrypt na noc, który przenosi pliki, które pomyślnie skompilowano z repozytorium „zapisz przy zatwierdzeniu” do repozytorium „znacząca zmiana”.
gonzo.floyd
Cóż, nie jest to całkiem zły pomysł z Gitem. „Często się angażuj” to motto. Działa to również w ten sposób lepiej, ponieważ możesz pracować jednocześnie nad tym samym plikiem z wieloma programistami i minimalnymi problemami. Przydałoby się wpiąć mechanizm zapisu Vima.
Metagrapher,
Przepływy pracy w Git mogą radykalnie różnić się od Subversion. Możesz tego nigdy nie robić w svn, ponieważ byłoby to obelżywe, ale ma całkowicie poprawne zastosowania w git. Na przykład jakiś testowy serwer integracyjny może zostać podłączony do gałęzi testowej. Automatyczne zatwierdzanie przy zapisywaniu staje się wtedy całkiem przydatne. Kiedy dojdziesz do punktu, że coś działa, użyjesz git rebase, aby zgnieść całą aktywność do jednego zatwierdzenia z sensownym komunikatem, a następnie połączyć się z gałęzią devel. Jeśli brzmi to przerażająco lub skomplikowanie, to tylko dlatego, że jesteś przystosowany do ograniczeń nierozproszonego źródła vcs.
Caleb
0

Wiem, że to pytanie jest stare i jest to rażąca autopromocja, ale napisałem wtyczkę Vima, która uruchomi niektóre skrypty powłoki, które będą uruchamiane po określonych autocmdzdarzeniach Vima . Na przykład skrypt o nazwie .bufwritepost.vimhook.shbędzie uruchamiany (synchronicznie) przy każdym uruchomieniu BufWritePostpolecenia. Następnie możesz łatwo dołączyć dowolną logikę do wykonania polecenia git commit w tym skrypcie. Wtyczka zakłada określone konwencje nazewnictwa tych skryptów, a także obsługuje skrypty przechwytujące, które uruchamiają się tylko w plikach o określonych nazwach lub o określonych rozszerzeniach.

Pełne szczegóły: https://github.com/ahw/vim-hooks

Andrzej
źródło
0

Chcę zgłosić swoje podejście do tego problemu.

Mam vimrc.vimrepozytorium git ( $VIMCONFz bootstrap .vimrc) i zmapowane<Leader>ve („edycja vim”), aby otworzyć vimrc w nowej karcie. Nie wpływa to na bieżący katalog roboczy.

Więc jeśli edytuję vimrc.vimz vima uruchomionego w innym katalogu poza moim repozytorium git vim, podejście omówione przez Nicka Edwardsa zakończy się niepowodzeniem. Mój hack jest następujący (dla Windows i 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

Wyjaśnienie:

  1. W systemie Windows zmieniam katalog na lokalizację pliku vimrc. To nie jest najlepsze i mógłbym później zmienić się na podobny do Linuksa. Nie bierz tego zbyt poważnie, ale możesz użyć go jako przewodnika. gitmusi być w ścieżce (czyli powinny być w stanie wpisać git <ENTER>w cmd.exe)
  2. W przypadku systemu Linux najpierw sprawdzam, czy edytuję odpowiedni plik vimrc.vim
  3. Zapisz bieżący katalog roboczy w tempdir
  4. Zmień katalog na plik vimrc.vim
  5. Wykonaj polecenie git
  6. Wróć do poprzedniego katalogu roboczego
  7. Ręcznie przesuwam zmiany git

Uwagi:

  1. Polecenia mogą być „powiązane” w vimie za pomocą |. Łańcuch przerwie działanie, jeśli któreś z poleceń się nie powiedzie. Aby przełamać kilka linii, rozpocznij kolejną linię za pomocą \.
  2. Można to rozszerzyć na pliki ftplugin. Twoje filtry to *.vimiexpand($VIMCONF)."/ftplugin/"
użytkownik334287
źródło