desenv-web-rp.com

atualizar o conteúdo alterado do arquivo aberto no vi (m)

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?

379
twan163

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 a recarga do arquivo atual (você perderá suas modificações).

O comando :edit pode ser abreviado por :e. A edição forçada pode ser feita por :e!

484
Thushi

Além de atualizar manualmente o arquivo com :edit, você pode colocar no 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.

196
Ingo Karkat

TL; DR

Vá para o Wrap-up rumo às vimrc linhas a serem adicionadas para tornar sua vida melhor.

Manualmente

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.

Automaticamente

Para carregar automaticamente as alterações, adicione seu vimrc:

set autoread

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.

Disparar quando o cursor parar de se mover

Adicione ao seu vimrc:

au CursorHold,CursorHoldI * checktime

Por padrão, CursorHold é acionado depois que o cursor permanece parado por 4 segundos e é configurável via pdatetime .

Gatilho na alteração do buffer ou no foco do terminal

Adicione o seguinte ao seu vimrc para acionar autoread ao alterar os buffers enquanto dentro do vim:

au FocusGained,BufEnter * :checktime

Captura do foco da janela do terminal dentro do vim comum

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

Embrulhar

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() !~ '\v(c|r.?|!|t)' && getcmdwintype() == '' | 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 com au CursorHold .

Obrigado a esta resposta por resolver o problema do cmdwin.

74
Tom Hale