refresh mudou o conteúdo do arquivo aberto no vi (m)

328

Eu tenho um arquivo de configuração que eu 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?

    
por twan163 08.08.2014 / 13:28

3 respostas

420

Você pode usar o comando :edit , sem especificar um nome de arquivo, para recarregar o arquivo atual. Se você fez modificações no arquivo, você pode usar :edit! para forçar o recarregamento do arquivo atual (você perderá seu modificações).

    
por 08.08.2014 / 13:31
183

Além de atualizar manualmente o arquivo com :edit , você pode colocar em seu ~/.vimrc

:set autoread

para que o Vim atualize automaticamente todos os arquivos que não foram editados pelo Vim. Veja também :checktime .

    
por 08.08.2014 / 13:51
31

TL; DR

Pule para o cabeçalho Wrap-up das linhas vimrc a adicionar para melhorar sua vida.

manualmente

Execute :checktime

Check if any buffers were changed outside of Vim. This checks and warns you if you would end up with two versions of a file.

Automaticamente

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

set autoread

When a file has been detected to have been changed outside of Vim and it has not been changed inside of Vim, automatically read it again. When the file has been deleted this is not done.

Esta resposta adiciona uma ressalva:

Autoread does not reload file unless you do something like run external command (like !ls or !sh etc)

Leia as 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 updatetime .

Disparo na troca do buffer ou no foco do terminal

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

au FocusGained,BufEnter * :checktime

Captura do foco da janela do terminal dentro do vim simples

Para que o FocusGained (veja acima) trabalhe no vim simples, dentro de um emulador de terminal (Xterm, tmux, etc) instale o plugin: vim-tmux-focus-events

Nas versões do tmux > 1.9, você precisará adicionar .tmux.conf :

set -g focus-events on

Finalização

Notificações quando autoread de acionadores também são possíveis .

Aqui estão as 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

Agradecemos a ErichBSchulz por me apontar na direção certa com au CursorHold .

    
por 01.08.2017 / 05:42

Tags