Estou usando o VIm para todos os tipos de coisas (ou gVim nesse caso), incluindo o monitoramento da saída gravada em um arquivo; Eu uso autoread
para fazer o Vim reler o arquivo, o que acontece sempre que alterno o foco do teclado para ele.
Existe alguma maneira de fazer o Vim atualizar o buffer, mesmo que eu não mude o foco do teclado? Eu tentei configurar, checktime
mas parece não ter nenhum efeito enquanto o foco do teclado estiver em outro lugar.
A saída que estou monitorando está substituindo o arquivo de saída completamente; e eu não estou olhando para tail -f
isso. Existem outras opções, como canalizar para uma nova instância todas as vezes, canalizar less
ou algo assim, mas seria legal se isso pudesse ser feito com o VIm.
filesystem
falstro
fonte
fonte
CursorHold
evento? Se o Vim não tiver foco, ele deve ser acionado a cada n segundos.CursorHold
é executado apenas uma vez, isso está explicitamente documentado como: "não dispara todos os ms de 'horário de atualização' se você deixar o Vim para fazer um café. :)"Respostas:
Atualização 25/06/2015 :
O que
autoread
faz?Para responder a essa pergunta, precisamos primeiro entender o que a
autoread
opção faz e, mais importante, o que ela não faz.Infelizmente
:help 'autoread'
, não há muitas informações sobre isso, apenas diz que "um arquivo foi detectado como alterado fora do Vim" . Como o Vim detecta que um arquivo foi alterado? Em determinadas ações, o Vim verifica a hora da modificação do arquivo.Quando:
:checktime
é usado;:diffupdate
é usado;:e
é emitido para um arquivo que já possui um buffer;!
;^Z
,fg
, somente se o shell tem controle de trabalho);para o gVim, isso também é feito quando:
Reuni essas informações da fonte Vim, localizando todas as chamadas para
buf_check_timestamp()
,check_timestamps()
funções e locais em queneed_check_timestamps
está definidoTRUE
.Posso ter perdido alguns eventos, mas o principal a lembrar é que o Vim apenas verifica se o arquivo foi modificado em um conjunto muito limitado de circunstâncias . Certamente não "pesquisa" o arquivo em busca de alterações a cada n segundos, que é basicamente o que você procura .
Portanto, para o seu propósito,
set autoread
não é suficiente.Usando Python
Isso programa um thread Python para ser executado em segundo plano; ele será executado a
:checktime
cada n segundos. Seautoread
estiver ativado , isso recarregará o buffer do disco, caso contrário, apenas avisará.Isto requer que Vim tem
+python
ou+python3
em:version
. Ele deve funcionar em todas as plataformas (incluindo Windows).Você pode iniciar isso usando
:call AutoreadPython()
; é claro que você pode fazer isso em um autocmd; por exemplo:Posfácio
Na verdade, existem mais métodos, por exemplo, você pode usar uma ferramenta como
entr
o Pythoninotify
ou ogamin
módulo para monitorar um arquivo em busca de alterações,:checktime
também verifica todos os buffers se não houver argumentos, isso pode ser aprimorado apenas com a verificação de um único buffer ou um determinado arquivo.No entanto, essa resposta já é bastante longa :-) Esse método deve (espero!) Funcionar bem para a maioria dos cenários ou deve ser facilmente adaptável ao seu cenário.
PS. Também tentei usar o Ruby, mas infelizmente os threads do Ruby (usando
Thread
) não são executados em segundo plano como o Python, então não pude fazer isso funcionar (talvez haja outra maneira?)fonte
Eu fiz um pequeno plugin vim-autoread que usa
tail -f
para atualizar o buffer em segundo plano de forma assíncrona. Obviamente, isso precisa do recurso de trabalho do Vim Versão 8.Use
:AutoRead
para ligá-lo e:AutoRead!
desligá-lo.fonte
No Neovim, você pode usar o seguinte comando, que abrirá um buffer de terminal executando o comando tail.
Isso continuará funcionando mesmo se o arquivo for removido e recriado.
Ou adicione o seguinte ao seu
$MYVIMRC
fonte
desta resposta (consultando uma resposta de PhanHaiQuang e um comentário de flukus )
Pode-se executar este oneliner a partir 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 do lado de fora (mas não funciona por si só, não há cronômetro interno ou algo assim. Ele só lerá o arquivo quando o vim executar uma ação, como um comando ex
:!
- CursorHold * checktime : quando o cursor não é movido pelo usuário pelo tempo especificado em 'updatetime' (que é de 4000 milissegundos por padrão), o checktime é executado, que verifica alterações fora do arquivo
- chame feedkeys ("lh") : o cursor é movido uma vez, direita e volta à esquerda ... e então nada acontece (... o que significa que o CursorHold é acionado, o que significa que temos um loop )
fonte