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?
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?
Réponses:
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.
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'
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
Vous voudrez peut-être regarder le plugin fugitif , c'est un plugin git très puissant pour vim. Vous pouvez également configurer un autocmd
comme le donothingsuccessfully
suggère, mais le faire apparaître :Gcommit
ou :Gstatus
(à partir duquel vous pouvez sélectionner les modifications à ajouter à l'index git)
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é).
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.
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.sh
serait exécuté (de manière synchrone) chaque fois que la BufWritePost
commande 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
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:
git
doit être dans le chemin (vous devriez être capable de taper git <ENTER>
dans cmd.exe
)tempdir
Remarques:
|
. La chaîne s'interrompra si l'une des commandes échoue. Pour franchir plusieurs lignes, commencez la ligne suivante avec\
.*.vim
etexpand($VIMCONF)."/ftplugin/"