Existe alguma maneira de conectar o save no Vim até o commit no git?

11

Eu sou novo no mundo do Vim e quero fazê-lo para que toda vez que eu salvar um arquivo, ele seja comprometido com o controle de versão. Isso é possível?

gonzo.floyd
fonte

Respostas:

4

Você pode usar os comandos automáticos do Vim:

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

Isso não foi testado, mas deve adicionar o arquivo e confirmar com o nome do arquivo como mensagem de confirmação.
Você deseja o BufWritePost, pois isso é acionado após a gravação do arquivo. Eu imagino que existem muitos casos extremos enfadonhos ou inseguros.

donutingsuccessfully
fonte
4

Eu uso um comando automático do vim que coloco no meu .vimrc. O comando primeiro faz uma verificação grosseira de que estamos trabalhando em um diretório git (verificando a existência de um diretório .git, no diretório atual ou em uso git rev-parse), e depois usa-o git -a -m %para que apenas os arquivos adicionados anteriormente sejam testados e confirmados .

autocmd BufWritePost * execute '! if [ -d .git ] || git rev-parse --git-dir > /dev/null 2>&1 ; then git add % ; git commit -m %; fi'
Nick Edwards
fonte
1
Falta aspas simples no final do cmd, logo após fi.
Andrew-Dufresne
2
Esta versão funciona apenas se você estiver no diretório raiz do seu repositório. Uma solução melhor é autocmd BufWritePost * execute '! if [ -d .git ] || git rev-parse --git-dir > /dev/null 2>&1 ; then git add % ; git commit -m %; fi', a partir de uma resposta SO
Andrew-Dufresne
Isso funciona para mim no linux. Alguma idéia de como fazê-lo funcionar no Windows?
user334287
2

Você pode querer olhar para o plugin fugitivo , é um plugin git muito poderoso para o vim. Você também pode configurar um autocmdcomo donothingsuccessfullysugere, mas ele deve aparecer :Gcommitou :Gstatus(a partir do qual você pode escolher as alterações para adicionar ao índice git)

mkomitee
fonte
1

Com base nas respostas fornecidas por outras pessoas:

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'

Isso é completamente transparente. Você não receberá a mensagem "Pressione Enter para continuar" (mas se o commit não funcionou, você não saberá que falhou).

sargon
fonte
0

Você certamente poderia fazer isso com uma macro ou com o remapeamento de comando.

(Verifique /programming/117150/can-i-re-map-commands-in-vim )

Não tenho certeza se é uma boa opção. Por enquanto não sou proficiente em git e sei que às vezes é diferente de svn. Mas eu não faria isso automaticamente com o svn. A confirmação precisa ser significativa e não salvar algumas vezes regularmente.

Você normalmente confirma porque adicionou uma função, corrigiu um bug ... não apenas porque trabalhou em um arquivo. Você não terminará com projeto não compilado ou função inacabada.

M'vy
fonte
Isso é verdade, mas também quero ter um script noturno que mova os arquivos compilados com êxito do repositório "save-on-commit" para um repositório "mudança significativa".
Gonzo.floyd 20/05
Bem, não é totalmente uma má ideia com o Git. "Confirmar com frequência" é uma espécie de lema. Também funciona melhor dessa maneira, porque você pode trabalhar simultaneamente no mesmo arquivo com vários desenvolvedores e com o mínimo de problemas. Seria bastante útil conectar-se ao mecanismo de salvamento do vim.
Metagrapher
Os fluxos de trabalho no Git podem ser radicalmente diferentes do Subversion. Você nunca pode fazer isso no svn porque seria abusivo, mas tem usos perfeitamente válidos no git. Por exemplo, um servidor de integração de teste de algum tipo pode ser conectado a uma ramificação de teste. A confirmação automática ao salvar torna-se bastante útil. Quando você chega ao ponto em que algo está funcionando, você usaria o git rebase para compactar toda a atividade em um único commit com uma mensagem significativa e depois se fundir no seu ramo de desenvolvimento. Se isso parece assustador ou complexo, é apenas porque você está adaptado às limitações de uma fonte não distribuída vcs.
Caleb
0

Sei que essa pergunta é antiga e é uma autopromoção flagrante, mas escrevi um plug-in do Vim que acionará certos scripts de shell para serem executados após autocmdeventos específicos do Vim . Por exemplo, um script chamado .bufwritepost.vimhook.shseria executado (de forma síncrona) toda vez que o BufWritePostcomando fosse acionado. Você pode incluir facilmente qualquer lógica que desejar para executar o commit git dentro desse script. O plug-in assume convenções de nomenclatura específicas desses scripts e também suporta scripts "hook", que são acionados apenas em arquivos que correspondem a determinados nomes ou que possuem determinadas extensões.

Detalhes completos: https://github.com/ahw/vim-hooks

Andrew
fonte
0

Quero relatar minha opinião sobre esse problema.

Eu tenho o vimrc.vimem um repositório git ( $VIMCONF, com um bootstrap .vimrc) e mapeado <Leader>ve("vim edit") para abrir o vimrc em uma nova guia. Isso não afeta o diretório de trabalho atual.

Portanto, se eu editar a vimrc.vimpartir de um vim iniciado em um diretório diferente fora do meu repositório vim git, a abordagem discutida por Nick Edwards falhará. Meu hack é o seguinte (para 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

Explicação:

  1. No Windows, altero o diretório para o local do arquivo vimrc. Este não é o melhor, e eu posso mudar mais tarde para ser semelhante ao Linux. Não leve isso muito a sério, mas você pode querer usá-lo como um guia. gittem de estar no caminho (ou seja, você deve ser capaz de escrever git <ENTER>em cmd.exe)
  2. Para Linux, primeiro verifiquei se estou editando o vimrc.vim correto
  3. Salve o diretório de trabalho atual em tempdir
  4. Mude o diretório para o arquivo vimrc.vim
  5. O git confirma
  6. Retornar ao diretório de trabalho anterior
  7. Eu empurro manualmente as alterações git

Notas:

  1. Os comandos podem ser "encadeados" no vim com |. A cadeia será interrompida se algum dos comandos falhar. Para quebrar várias linhas, inicie a próxima linha com \.
  2. Isso pode ser estendido para arquivos ftplugin. Seus filtros serão *.vimeexpand($VIMCONF)."/ftplugin/"
user334287
fonte