Eu tenho um arquivo de configuração que mantenho aberto no vim, mas que às vezes é alterado no disco, sem que essas alterações sejam refletidas no terminal. Posso atualizar o conteúdo na tela sem fechar e reabrir o arquivo? Se sim, como?
Eu tenho um arquivo de configuração que mantenho aberto no vim, mas que às vezes é alterado no disco, sem que essas alterações sejam refletidas no terminal. Posso atualizar o conteúdo na tela sem fechar e reabrir o arquivo? Se sim, como?
Respostas:
Você pode usar o :edit
comando, sem especificar um nome de arquivo, para recarregar o arquivo atual. Se você fez modificações no arquivo, pode usar
:edit!
para forçar o recarregamento do arquivo atual (você perderá as modificações).
O comando :edit
pode ser abreviado por :e
. A edição forçada pode ser feita por:e!
:e!
.
:edit
e :edit!
você pode usar :e
e :e!
respectivamente.
u
o :e!
.
:bufdo e
Além de atualizar manualmente o arquivo :edit
, você pode colocar em seu~/.vimrc
:set autoread
para fazer com que o Vim atualize automaticamente todos os arquivos que não foram editados pelo Vim. Veja também :checktime
.
git pull
estiver ciente de que pode perder as alterações não salvas na tela de maneira não intencional.
gvim
ou executar comandos externos.
:checktime
autoread
pode ser disparado automaticamente X segundos após o cursor parar de se mover, veja esta resposta .
Pule para o Wrap-up
cabeçalho das vimrc
linhas a serem adicionadas para tornar sua vida melhor.
Corre :checktime
Verifique se algum buffer foi alterado fora do Vim. Isso verifica e avisa se você terminaria com duas versões de um arquivo.
Para carregar automaticamente as alterações, adicione vimrc
:
Quando for detectado que um arquivo foi alterado fora do Vim e não foi alterado dentro do Vim, leia-o automaticamente novamente. Quando o arquivo foi excluído, isso não é feito.
Esta resposta adiciona uma ressalva:
A leitura automática não recarrega o arquivo, a menos que você execute algo como executar um comando externo (como
!ls
ou!sh
etc)
Leia sobre soluções.
Adicione ao seu vimrc
:
au CursorHold,CursorHoldI * checktime
Por padrão, CursorHold é acionado após o cursor permanecer parado por 4 segundos e é configurável via hora de atualização .
Adicione o seguinte ao seu vimrc
gatilho autoread
ao alterar buffers enquanto estiver dentro do vim:
au FocusGained,BufEnter * :checktime
Para que FocusGained
(veja acima) funcione no vim simples, dentro de um emulador de terminal (Xterm, tmux, etc) instale o plugin:
vim-tmux-focus-events
Nas versões tmux> 1.9, você precisará adicionar .tmux.conf
:
set -g focus-events on
Notificações quando autoread
gatilhos também são possíveis .
Aqui estão minhas vimrc
linhas para implementar todas as opções acima:
" Triger `autoread` when files changes on disk
" https://unix.stackexchange.com/questions/149209/refresh-changed-content-of-file-opened-in-vim/383044#383044
" https://vi.stackexchange.com/questions/13692/prevent-focusgained-autocmd-running-in-command-line-editing-mode
autocmd FocusGained,BufEnter,CursorHold,CursorHoldI * if mode() != 'c' | checktime | endif
" Notification after file change
" https://vi.stackexchange.com/questions/13091/autocmd-event-for-autoread
autocmd FileChangedShellPost *
\ echohl WarningMsg | echo "File changed on disk. Buffer reloaded." | echohl None
Obrigado a ErichBSchulz por me apontar na direção certa comau CursorHold
.