No seu ~/.vimrc
:
set autoread
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?
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
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.
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
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.
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 )
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}') );
}
Tags vim