Existe alguma maneira de conectar o salvamento no Vim ao commit no git?

8

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

    
por gonzo.floyd 20.05.2011 / 17:06

7 respostas

3

Eu uso um autocommand do vim que eu coloco no meu .vimrc. O comando primeiro faz uma verificação bruta de que estamos trabalhando em um diretório git (verificando a existência de um diretório .git, no diretório atual ou usando git rev-parse ), então usa git -a -m % para que somente os arquivos que já tenham foram adicionados são encenados e comprometidos.

autocmd BufWritePost * execute '! if [ -d .git ] || git rev-parse --git-dir > /dev/null 2>&1 ; then git add % ; git commit -m %; fi'
    
por 06.09.2012 / 16:44
2

Você pode usar os autocommands do Vim:

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

Isso não foi testado, mas deve adicionar o arquivo e confirmá-lo com o nome do arquivo como mensagem de confirmação.
Você deseja BufWritePost como isso é acionado depois que o arquivo é gravado. Eu imagino que há muitos casos de limites inseguros ou inseguros.

    
por 20.05.2011 / 18:10
2

Você pode querer olhar para o plug-in fugitivo, é um plugin git muito poderoso para vim. Você também pode configurar um autocmd como donothingsuccessfully sugere, mas ele deve aparecer :Gcommit ou :Gstatus (a partir do qual você pode selecionar as alterações para adicionar ao índice git)

    
por 27.05.2011 / 15:08
0

Você certamente poderia, até agora, com uma macro ou com remapeamento de comandos.

(Verifique link )

Não tenho certeza se é uma boa opção. Eu não sou proficiente no git por enquanto e sei que às vezes é diferente do svn. Mas eu não faria isso auto-commit com svn. O commit precisa ser significativo e não economizar no horário regular.

Você normalmente se compromete porque adicionou uma função, corrigiu um bug ... não apenas porque trabalhou em um arquivo. Você não vai acabar com projeto não compilado ou função inacabada.

    
por 20.05.2011 / 17:18
0

Com base nas respostas que outras pessoas forneceram:

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 funcionar, você não saberá que falhou).

    
por 26.04.2013 / 21:36
0

Eu sei que essa pergunta é antiga e isso é uma autopromoção descarada, mas eu escrevi um plugin Vim que acionará certos scripts de shell para serem executados após eventos Vim autocmd específicos. Por exemplo, um script chamado .bufwritepost.vimhook.sh seria executado (de forma síncrona) sempre que o comando BufWritePost fosse disparado. Você poderia então incluir facilmente qualquer lógica que você queira para executar o commit do git dentro daquele 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: link

    
por 14.10.2014 / 20:23
0

Quero relatar minha opinião sobre esse problema.

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

Então, se eu editar vimrc.vim 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. Para windows, altero o diretório para o local do arquivo vimrc. Este não é o melhor, e eu poderia 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. git precisa estar no caminho (ou seja, você deve digitar git <ENTER> em cmd.exe )
  2. Para o Linux, eu primeiro verifico se estou editando o vimrc.vim correto
  3. Salve o diretório de trabalho atual em tempdir
  4. Altere o diretório para o arquivo vimrc.vim
  5. Faça o commit do git
  6. Retornar ao diretório de trabalho anterior
  7. eu empurro manualmente as alterações do git

Notas:

  1. Os comandos podem ser "encadeados" no vim com | . A cadeia será abortada 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 *.vim e expand($VIMCONF)."/ftplugin/"
por 02.03.2018 / 03:21

Tags