C'è un modo per agganciare il salvataggio in Vim fino al commit in git?


11

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:


4

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.


4

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'

1
Manca una virgoletta singola alla fine del cmd, subito dopo fi.
Andrew-Dufresne,

2
Questa versione funziona solo se ci si trova nella directory principale del repository. Una soluzione migliore è 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
Andrew-Dufresne,

Questo funziona per me su Linux. Qualche idea su come farlo funzionare su Windows?
user334287

2

Potresti voler esaminare il plugin fuggitivo , è un plugin git molto potente per vim. Puoi anche impostare un autocmdcome donothingsuccessfullysuggerisce, ma farlo apparire :Gcommito :Gstatus(da cui puoi scegliere le modifiche da aggiungere all'indice git)


1

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).


0

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.


È vero, ma voglio anche avere uno script notturno che sposta i file che vengono compilati con successo dal repository "save-on-commit" in un repository "modifica significativa".
gonzo.floyd,

Bene, non è del tutto una cattiva idea con Git. "Commit frequentemente" è una specie di motto. Funziona meglio anche in questo modo, perché puoi lavorare contemporaneamente sullo stesso file con più sviluppatori e problemi minimi. Sarebbe abbastanza utile agganciarsi al meccanismo di salvataggio di Vim.
Metagrafo

I flussi di lavoro in Git possono essere radicalmente diversi da Subversion. Non potresti mai farlo in svn perché sarebbe abusivo, ma ha usi perfettamente validi in git. Ad esempio, un server di integrazione di test di qualche tipo potrebbe essere collegato a un ramo di test. Il commit automatico al salvataggio diventa quindi abbastanza utile. Quando arrivate al punto in cui qualcosa sta funzionando, userete git rebase per comprimere tutte le attività in un unico commit con un messaggio significativo, quindi unirvi nel vostro ramo di sviluppo. Se questo suona spaventoso o complesso è solo perché sei adattato ai limiti di un vcs sorgente non distribuito.
Caleb,

0

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 autocmdeventi Vim . Ad esempio, uno script chiamato .bufwritepost.vimhook.shverrebbe eseguito (in modo sincrono) ogni volta che il BufWritePostcomando 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


0

Voglio segnalare la mia opinione su questo problema.

Ho vimrc.vimun 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.vimda 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:

  1. Per Windows, cambio la directory nella posizione del file vimrc. Questo non è il migliore, e potrei cambiare in seguito per essere simile a Linux. Non prenderlo troppo sul serio ma potresti volerlo usare come guida. gitè di essere nel percorso (per esempio, si dovrebbe essere in grado di digitare git <ENTER>in cmd.exe)
  2. Per Linux, per prima cosa controllo che sto modificando il giusto vimrc.vim
  3. Salvare la directory di lavoro corrente in tempdir
  4. Cambia la directory nel file vimrc.vim
  5. Fai il commit git
  6. Ritorna alla directory di lavoro precedente
  7. Spingo manualmente le modifiche git

Appunti:

  1. I comandi possono essere "concatenati" in vim con |. La catena si interromperà se uno qualsiasi dei comandi fallisce. Per spezzare più linee, inizia la riga successiva con \.
  2. Questo può essere esteso ai file ftplugin. I tuoi filtri saranno *.vimeexpand($VIMCONF)."/ftplugin/"
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.