Vim - arquivo de erro de atualização rápida de atualização automática quando é alterado

2

Eu tenho um arquivo (errors.txt) contendo uma lista de erros (problemas de estilo de código), que eu carrego na correção rápida do Vim ( :cf errors.txt ). O errors.txt é automaticamente atualizado por um programa externo (rodando independentemente do Vim) enquanto eu corrijo os erros. Existe uma maneira de fazer com que o Vim atualize automaticamente a lista de correcções rápidas quando o arquivo errors.txt é alterado?

Note que não quero que o Vim atualize o errors.txt. Outro programa faz isso e eu não quero chamá-lo do Vim. Eu só quero Vim quickfix para monitorar erros.txt para mudanças. Obrigado!

Tags de pesquisa: atualização vim quickfix atualização do arquivo de atualização do monitor de atualização automática

    
por Rich 15.09.2016 / 14:57

2 respostas

1

Se você tiver uma versão recente do Vim (não sei qual, mas se você executar vim --version , precisará ver +timers ), poderá definir um temporizador assíncrono para verificar se o arquivo foi modificado e execute outro cfile errors.txt para recarregar o conteúdo da janela de quickfix. Aqui está uma prova de conceito (confira aqui para uma versão destacada da sintaxe):

" The filename used for the cfile
let s:cfile_filename = ''
" The last mtime of the filename
let s:cfile_mtime = -1

" Define a command that can be called like:
"
"   Cfile errors.txt
"
command! -nargs=1 -complete=file Cfile call s:Cfile(<f-args>)

function! s:Cfile(filename)
  let s:cfile_filename = a:filename

  " Update every 200ms
  let timer = timer_start(200, function('s:UpdateCfile'), {'repeat': -1})
  " First "update" to actually load the qf window immediately
  call s:UpdateCfile(timer)
endfunction

function! s:UpdateCfile(timer_id)
  " Stop the timer if the file is deleted
  if s:cfile_filename == '' || !filereadable(s:cfile_filename)
    call timer_stop(a:timer_id)
    let s:cfile_filename = ''
    let s:cfile_mtime = -1

    return
  endif

  " Get file mtime
  let mtime = system('stat -c %Y '.shellescape(s:cfile_filename))

  " Load the file in the quickfix window if the mtime is newer than the last
  " recorded one
  if mtime > s:cfile_mtime
    exe 'cfile '.s:cfile_filename
    let s:cfile_mtime = mtime
  endif
endfunction

Se você colocar isso no seu .vimrc , ou em um arquivo separado em ~/.vim/plugins/ , você receberá um comando :Cfile que você pode usar como o "real", exceto que este também irá monitorar o arquivo que você deu para mudanças a cada 200ms. Parará a atualização automática quando o arquivo for excluído.

Infelizmente, tenho certeza de que haverá casos de limites que você deve resolver, então eu recomendo que você use isso como ponto de partida, tente entendê-lo (usando :help para qualquer funções ou comandos que você não conhece) e construa algo que se adapte às suas necessidades específicas.

    
por 15.09.2016 / 20:27
0

Encontrei uma sugestão para minha própria pergunta, que esperamos encorajar alguma discussão aqui. Eu poderia usar o recurso cliente / servidor do Vim, que permitirá que outro processo informe ao Vim para atualizar a lista de Correção Rápida. Nesse caso, meu programa em segundo plano pode informar ao Vim sempre que ele atualizar o arquivo errors.txt! Confira esta seção para um exemplo similar. Como você pode ver, o outro programa usa --remote para informar ao Vim o que fazer.

O único problema é que a versão do Vim usada pelos meus colegas não tem + clienterserver compilado ... Eu estava esperando por uma solução mais "pronta para uso" ...

    
por 16.09.2016 / 10:19

Tags