Existe-t-il un moyen de connecter l'enregistrement dans Vim à la validation dans git?

11

Je suis nouveau dans le monde de Vim, et je veux que chaque fois que j'enregistre un fichier, il soit soumis au contrôle de version. Est-ce possible?

gonzo.floyd
la source

Réponses:

4

Vous pouvez utiliser les autocommandes de Vim:

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

Ce n'est pas testé, mais il doit ajouter le fichier et le valider avec le nom de fichier comme message de validation.
Vous souhaitez que BufWritePost soit déclenché après l'écriture du fichier. J'imagine qu'il y a beaucoup de cas marginaux gênants ou dangereux.

avec succès
la source
4

J'utilise une autocommande vim que je place dans mon .vimrc. La commande vérifie d'abord grossièrement que nous travaillons dans un répertoire git (en vérifiant l'existence d'un répertoire .git, que ce soit dans le répertoire courant ou en utilisant git rev-parse), puis utilise de git -a -m %sorte que seuls les fichiers qui ont été précédemment ajoutés soient mis en scène et validés .

autocmd BufWritePost * execute '! if [ -d .git ] || git rev-parse --git-dir > /dev/null 2>&1 ; then git add % ; git commit -m %; fi'
Nick Edwards
la source
1
Il manque un guillemet simple à la fin de la cmd, juste après fi.
Andrew-Dufresne
2
Cette version ne fonctionne que si vous êtes dans le répertoire racine de votre dépôt. Une meilleure solution est autocmd BufWritePost * execute '! if [ -d .git ] || git rev-parse --git-dir > /dev/null 2>&1 ; then git add % ; git commit -m %; fi', à partir d'une réponse SO
Andrew-Dufresne
Cela fonctionne pour moi sur Linux. Une idée de comment le faire fonctionner sur Windows?
user334287
2

Vous voudrez peut-être regarder le plugin fugitif , c'est un plugin git très puissant pour vim. Vous pouvez également configurer un autocmdcomme le donothingsuccessfullysuggère, mais le faire apparaître :Gcommitou :Gstatus(à partir duquel vous pouvez sélectionner les modifications à ajouter à l'index git)

mkomitee
la source
1

S'appuyant sur les réponses que d'autres ont fournies:

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'

C'est complètement transparent. Vous n'obtiendrez pas le message "Appuyez sur Entrée pour continuer" (mais si la validation n'a pas fonctionné, vous ne saurez pas qu'elle a échoué).

sargon
la source
0

Vous pouvez sûrement le faire avec une macro ou avec un remappage de commandes.

(Vérifiez /programming/117150/can-i-re-map-commands-in-vim )

Je ne suis pas sûr que ce soit une bonne option. Je ne maîtrise pas git pour l'instant et je sais que c'est parfois différent de svn. Mais je ne ferais pas cet auto-commit avec svn. L'engagement doit être significatif et ne pas faire d'économies à temps régulier.

Vous vous engagez normalement parce que vous avez ajouté une fonction, corrigé un bogue, ... pas seulement parce que vous avez travaillé sur un fichier. Vous ne vous retrouverez pas avec un projet non compilateur ou une fonction inachevée.

M'vy
la source
C'est vrai, mais je veux aussi avoir un script du jour au lendemain qui déplace les fichiers qui se compilent avec succès du référentiel "save-on-commit" vers un référentiel "changement significatif".
gonzo.floyd
Eh bien, ce n'est pas entièrement une mauvaise idée avec Git. "S'engager fréquemment" est une sorte de devise. Cela fonctionne mieux de cette façon également, car vous pouvez travailler simultanément sur le même fichier avec plusieurs développeurs et un minimum de problèmes. Il serait très utile de se connecter au mécanisme de sauvegarde de vim.
Métagraphe
Les flux de travail dans Git peuvent être radicalement différents de Subversion. Vous pourriez ne jamais faire cela dans svn car ce serait abusif, mais il a des utilisations parfaitement valides dans git. Par exemple, un serveur d'intégration de test quelconque pourrait être connecté à une branche de test. La validation automatique lors de la sauvegarde devient alors très utile. Lorsque vous arrivez au point où quelque chose fonctionne, vous utiliseriez alors git rebase pour écraser toutes les activités en un seul commit avec un message significatif, puis fusionner dans votre branche devel. Si cela semble effrayant ou complexe, c'est uniquement parce que vous êtes adapté aux limites d'un vcs source non distribué.
Caleb
0

Je sais que cette question est ancienne et qu'il s'agit d'une auto-promotion flagrante, mais j'ai écrit un plugin Vim qui déclenchera l'exécution de certains scripts shell après des autocmdévénements Vim spécifiques . Par exemple, un script nommé .bufwritepost.vimhook.shserait exécuté (de manière synchrone) chaque fois que la BufWritePostcommande est exécutée . Vous pouvez ensuite facilement inclure la logique que vous souhaitez pour effectuer la validation git dans ce script. Le plugin suppose des conventions de dénomination spécifiques de ces scripts et prend également en charge les scripts "hook" qui se déclenchent uniquement sur les fichiers correspondant à certains noms ou ayant certaines extensions.

Détails complets: https://github.com/ahw/vim-hooks

Andrew
la source
0

Je veux faire part de mon point de vue sur ce problème.

J'ai le vimrc.vim dans un référentiel git ( $VIMCONF, avec un bootstrap .vimrc), et mappé <Leader>ve("vim edit") pour ouvrir le vimrc dans un nouvel onglet. Cela n'affecte pas le répertoire de travail actuel.

Donc, si je modifie vimrc.vim partir d'un vim démarré dans un répertoire différent en dehors de mon référentiel vim git, l'approche qui a été discutée par Nick Edwards échouera. Mon hack est le suivant (pour Windows et 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

Explication:

  1. Pour Windows, je change le répertoire pour l'emplacement du fichier vimrc. Ce n'est pas le meilleur, et je pourrais changer plus tard pour être similaire à Linux. Ne prenez pas cela trop au sérieux, mais vous voudrez peut-être l'utiliser comme guide.gitdoit être dans le chemin (vous devriez être capable de taper git <ENTER>dans cmd.exe)
  2. Pour Linux, je vérifie d'abord que je modifie le bon vimrc.vim
  3. Enregistrez le répertoire de travail actuel dans tempdir
  4. Remplacez le répertoire par le fichier vimrc.vim
  5. Faites le git commit
  6. Retour au répertoire de travail précédent
  7. Je pousse manuellement les changements de git

Remarques:

  1. Les commandes peuvent être "chaînées" en vis-à-vis de |. La chaîne s'interrompra si l'une des commandes échoue. Pour franchir plusieurs lignes, commencez la ligne suivante avec\ .
  2. Cela peut être étendu aux fichiers ftplugin. Vos filtres seront *.vimetexpand($VIMCONF)."/ftplugin/"
user334287
la source