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?
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?
Odpowiedzi:
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.
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'
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
Możesz zajrzeć do zbiegającej się wtyczki, jest to bardzo potężna wtyczka git dla vima. Możesz również skonfigurować sugestie autocmd
as donothingsuccessfully
, ale pop-up wyskakuje :Gcommit
lub :Gstatus
(z którego możesz cherry wybrać zmiany, aby dodać do indeksu git)
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ę).
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ą.
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 autocmd
zdarzeniach Vima . Na przykład skrypt o nazwie .bufwritepost.vimhook.sh
będzie uruchamiany (synchronicznie) przy każdym uruchomieniu BufWritePost
polecenia. 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
Chcę zgłosić swoje podejście do tego problemu.
Mam vimrc.vim
repozytorium git ( $VIMCONF
z 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.vim
z 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:
git
musi być w ścieżce (czyli powinny być w stanie wpisać git <ENTER>
w cmd.exe
)tempdir
Uwagi:
|
. Łańcuch przerwie działanie, jeśli któreś z poleceń się nie powiedzie. Aby przełamać kilka linii, rozpocznij kolejną linię za pomocą \
.*.vim
iexpand($VIMCONF)."/ftplugin/"