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?
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?
Respostas:
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.
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'
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
Você pode querer olhar para o plugin fugitivo , é um plugin git muito poderoso para o vim. Você também pode configurar um autocmd
como donothingsuccessfully
sugere, mas ele deve aparecer :Gcommit
ou :Gstatus
(a partir do qual você pode escolher as alterações para adicionar ao índice git)
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).
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.
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 autocmd
eventos específicos do Vim . Por exemplo, um script chamado .bufwritepost.vimhook.sh
seria executado (de forma síncrona) toda vez que o BufWritePost
comando 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
Quero relatar minha opinião sobre esse problema.
Eu tenho o vimrc.vim
em 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.vim
partir 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:
git
tem de estar no caminho (ou seja, você deve ser capaz de escrever git <ENTER>
em cmd.exe
)tempdir
Notas:
|
. A cadeia será interrompida se algum dos comandos falhar. Para quebrar várias linhas, inicie a próxima linha com \
.*.vim
eexpand($VIMCONF)."/ftplugin/"