2

У меня есть файл (errors.txt), содержащий список ошибок (проблемы стиля кода), которые я загружаю в QuickFix Vim (:cf errors.txt). error.txt автоматически обновляется внешней программой (работающей независимо от Vim), когда я исправляю ошибки. Есть ли способ, чтобы Vim автоматически обновлял список быстрых исправлений при изменении error.txt?

Обратите внимание, что я не хочу, чтобы Vim обновлял error.txt. Это делает другая программа, и я не хочу звонить из Vim. Я просто хочу, чтобы Vim quickfix отслеживал ошибки .txt на наличие изменений. Спасибо!

Поисковые теги: vim quickfix update reload update файл монитора автоматическое обновление

2 ответа2

1

Если у вас достаточно свежая версия Vim (не знаю, какая именно, но если вы запускаете vim --version , вам нужно увидеть +timers), вы можете установить асинхронный таймер, чтобы проверить, был ли файл изменен, и запустите другой cfile errors.txt чтобы перезагрузить содержимое окна быстрого исправления. Вот доказательство правильности концепции (проверьте здесь для подсвеченной версии):

" 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

Если вы поместите это в ваш .vimrc или в отдельный файл в ~/.vim/plugins/ , вы получите команду :Cfile вы можете использовать точно так же, как и "настоящую", за исключением того, что она также будет контролировать файл Вы дали это для изменений каждые 200 мс. Он остановит автообновление при удалении файла.

К сожалению, я почти уверен, что будут крайние случаи, о которых вам придется позаботиться, поэтому я рекомендую вам использовать это как отправную точку, попытаться понять это (используя :help для любых функций или команд, которые вы не знаю), и построить что-то, что соответствует вашим конкретным потребностям.

0

Я нашел предложение для своего собственного вопроса, которое, мы надеемся, будет способствовать некоторой дискуссии здесь. Я мог бы использовать клиент-серверную функцию Vim, которая позволит другому процессу сообщить Vim обновить список Quickfix. В этом случае моя фоновая программа может сообщать Vim всякий раз, когда она обновляет errors.txt! Проверьте этот раздел для своего рода подобного примера. Как видите, другая программа использует --remote, чтобы сообщить Vim, что делать.

Единственная проблема в том, что версия Vim, используемая моими коллегами, не скомпилирована +clientserver ... Я надеялся на более "готовое" решение ...

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .