Minha pergunta é semelhante a esta como monitorar um arquivo de texto em tempo real,
mas quero fazer isso no vim. Eu sei que posso ler um arquivo de uso de arquivo aberto tail -f sample.xml
e, quando um novo conteúdo é gravado no arquivo, ele também grava o novo conteúdo na minha tela. Posso fazer com que o vim preencha automaticamente os novos dados quando um arquivo for atualizado?
104
autoread
funciona e suas limitações.Não sei sobre automaticamente, mas você pode digitar:
para recarregar o arquivo
fonte
Coloque o seguinte em seu
.vimrc
:fonte
como @flukus disse em um comentário sobre uma resposta anterior, você pode
call feedkeys["lh"]
(move o cursor para a direita e para a esquerda, o que normalmente não faz mal ao visualizar um arquivo de log)Então, se você combinar o resto da resposta, você terá um oneliner que pode executar de ex (dentro do vim) quando necessário:
:set autoread | au CursorHold * checktime | call feedkeys("lh")
(se você quiser pular (quase) para o final do arquivo, basta usar "G" em vez de "lh" com feedkeys)
Explicação:
- autoread : lê o arquivo quando alterado de fora (mas não funciona por conta própria, não há temporizador interno ou algo parecido. Ele só lerá o arquivo quando o vim fizer 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 é 4000 milissegundos por padrão) checktime é executado, que verifica as alterações de fora do arquivo
- chame feedkeys ("lh") : o cursor é movido uma vez, para a direita e para a esquerda. e então nada acontece (... o que significa que o CursorHold é acionado, o que significa que temos um loop )
Além disso, você pode
:set syntax=logtalk
colorir o logPara parar a rolagem ao usar
call feedkeys("G")
, execute:set noautoread
- agora o vim dirá que o arquivo foi alterado e perguntará se alguém deseja ler as alterações ou não)(Isso tem algum efeito colateral?)
Edit: eu vejo um efeito colateral: se alguém usa "G" es a chave de alimentação, ele vai rolar para baixo todos os buffers abertos atualmente ?! Portanto, não é possível trabalhar no buffer esquerdo de uma janela de divisão enquanto o buffer direito rola para baixo um arquivo de log automaticamente
fonte
Cole isso em seu .vimrc e ele deve funcionar como um chefe. (Retirado de: http://vim.wikia.com/wiki/Have_Vim_check_automatically_if_the_file_has_changed_externally )
fonte
CursorHold
é executado uma vez . Portanto, se você sair para tomar um café ou estiver fazendo algo em outra janela, ele não será atualizado.Tail Bundle deve fazer o que você quiser. Observe, eu mesmo não usei.
fonte
Se unix + neovim
:term tail -f <filename>
Obviamente, isso não funcionará para todos, mas é como eu faço.
fonte
Também existe um plugin:
https://github.com/djoshea/vim-autoread
Essa era a única maneira de fazer isso funcionar no OSX.
fonte
O VIM irá avisá-lo quando um arquivo for atualizado para que você não substitua as alterações feitas desde que você o abriu. Nesse momento, ele solicitará que você recarregue o arquivo.
fonte