Auto-recarrega um arquivo no VIM assim que ele é alterado no disco

23

Supondo que um arquivo não tenha alterações não salvas no buffer VIM, eu gostaria que ele fosse recarregado automaticamente se o arquivo fosse alterado no disco. O caso de uso mais frequente é quando atualizo a cópia de trabalho em que o arquivo reside.

Como posso conseguir isso?

    
por GJ. 27.08.2010 / 15:13

6 respostas

25

No seu ~/.vimrc :

set autoread
    
por 27.08.2010 / 15:24
9

Isso é o que funcionou para mim

set autoread                                                                                                                                                                                    
au CursorHold * checktime  

A primeira linha não foi suficiente por si só. Você pode colocar em você .vimrc

crédito para Phan Hai Quang

    
por 18.06.2016 / 12:08
4

O Autoread não funciona corretamente. O seguinte funciona para mim:

Você precisa primeiro instalar o script de aqui .

Eu obtive os melhores resultados chamando a função de configuração diretamente, assim.

let autoreadargs={'autoread':1} 
execute WatchForChanges("*",autoreadargs) 

A razão para isso é que eu quero executar uma configuração ipython / screen / vim.

Você pode converter isso facilmente em uma versão aprimorada da visualização.

script do processo ..

mkdir -p ~/bin
cat <<'OUT' > ~/bin/vimviewer
#!/usr/bin/env sh
exec vim -n --cmd "source /home/bryan/.vim/.vimrc.watchforchanges | let autoreadargs={'autoread':1} | execute WatchForChanges('*',autoreadargs)" $@
'OUT'

chmod 755 ~/bin/vimviewer
vimview test.txt
    
por 22.12.2011 / 23:33
1
O plugin

vim-autoread funcionou para mim até agora:

vim-autoread

Automatically causes vim to reload files which have been written on disk but not modified in the buffer since the last write from vim. This enables a file open in vim to be edited using another application and saved. Upon returning to vim, as long as you haven't modified the file since the last change, the file will be automatically updated to reflect the changes made on disk, as though you had pressed :e manually.

    
por 05.05.2017 / 14:50
1

desta resposta (consulte uma resposta de PhanHaiQuang e um comentário de @flukus)

Pode-se executar este oneliner de ex (dentro do vim) quando necessário (ou colocar cada comando no vimrc, para quando os arquivos de log forem abertos).

:set autoread | au CursorHold * checktime | call feedkeys("lh")

Explicação:
- autoread : lê o arquivo quando alterado de fora (mas ele não funciona sozinho, não há temporizador interno ou algo assim. Ele só lê o arquivo quando o vim faz uma ação, como um comando em ex :!
- CursorHold * checktime : quando o cursor não é movido pelo usuário pelo tempo especificado em 'updatetime' (que é 4.000 milissegundos por padrão), o tempo de verificação é executado, que verifica as alterações fora do arquivo
- chamar as teclas de alimentação ("lh") : o cursor é movido uma vez, para a direita e vice-versa. e então nada acontece (... o que significa que o CursorHold é acionado, o que significa que temos um loop )

    
por 17.01.2018 / 09:50
0

Existem alguns plugins listados aqui que pode funcionar dependendo da sua versão do Vim.

Outra abordagem é enviar periodicamente o comando checktime para o vim de um processo externo. Aqui está um script ShellJS para fazer isso (requer shelljs-plugin-sleep , NeoVim e nvr )

while (true) {
  sleep(15);
  var servernames = exec('nvr --serverlist').trim().split('\n');
  if (!servernames.length || !servernames[0]) {
    continue;
  }
  servernames.forEach(
    (sn) => exec('nvr -c "checktime" --servername ${sn}') );
}
    
por 02.08.2017 / 01:37

Tags