Sono nuovo nel mondo di Vim e voglio farlo in modo che ogni volta che salvo un file sia sottoposto al controllo della versione. È possibile?
Sono nuovo nel mondo di Vim e voglio farlo in modo che ogni volta che salvo un file sia sottoposto al controllo della versione. È possibile?
Risposte:
Puoi usare i autocomandi di Vim:
:autocmd BufWritePost * execute '!git add % && git commit -m %'
Non è testato ma dovrebbe aggiungere il file e salvarlo con il nome file come messaggio di commit.
Volete BufWritePost poiché questo viene attivato dopo la scrittura del file. Immagino che ci siano molti casi limite fastidiosi o non sicuri.
Uso un autocomando vim che inserisco nel mio .vimrc. Il comando prima controlla se stiamo lavorando in una directory git (controllando l'esistenza di una directory .git, nella directory corrente o usando git rev-parse
), quindi usa in git -a -m %
modo che solo i file che sono stati precedentemente aggiunti vengano messi in scena e impegnati .
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'
, da una risposta SO
Sulla base delle risposte fornite da altri:
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'
Questo è completamente trasparente. Non verrà visualizzato il messaggio "Premi Invio per continuare" (ma se il commit non ha funzionato, non saprai che non è riuscito).
Potresti sicuramente farlo con una macro o con il comando di rimappatura.
(Controlla /programming/117150/can-i-re-map-commands-in-vim )
Non sono sicuro che sia una buona opzione. Non sono esperto di git per ora e so che a volte è diverso da svn. Ma non farei questo auto-commit con svn. L'impegno deve essere significativo e non essere risparmiato a intervalli regolari.
Normalmente commetti perché hai aggiunto una funzione, corretto un bug, ... non solo perché hai lavorato su un file. Non finirai con un progetto non compilante o una funzione incompiuta.
So che questa domanda è vecchia e questa è palese autopromozione, ma ho scritto un plug-in Vim che attiverà alcuni script di shell da eseguire dopo specifici autocmd
eventi Vim . Ad esempio, uno script chiamato .bufwritepost.vimhook.sh
verrebbe eseguito (in modo sincrono) ogni volta che il BufWritePost
comando viene attivato. Potresti quindi includere facilmente qualsiasi logica desideri per eseguire il commit git all'interno di quello script. Il plug-in presuppone specifiche convenzioni di denominazione di questi script e supporta anche script "hook" che si attivano solo su file corrispondenti a determinati nomi o con determinate estensioni.
Dettagli completi: https://github.com/ahw/vim-hooks
Voglio segnalare la mia opinione su questo problema.
Ho vimrc.vim
un repository in git ( $VIMCONF
, con un bootstrap .vimrc) e mappato <Leader>ve
("vim edit") per aprire il vimrc in una nuova scheda. Ciò non influisce sulla directory di lavoro corrente.
Quindi, se modifico vimrc.vim
da un vim iniziato in una directory diversa al di fuori del mio repository vim git, l'approccio discusso da Nick Edwards fallirà. Il mio hack è il seguente (per Windows e 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
Spiegazione:
git
è di essere nel percorso (per esempio, si dovrebbe essere in grado di digitare git <ENTER>
in cmd.exe
)tempdir
Appunti:
|
. La catena si interromperà se uno qualsiasi dei comandi fallisce. Per spezzare più linee, inizia la riga successiva con \
.*.vim
eexpand($VIMCONF)."/ftplugin/"