Vim - secara otomatis memuat ulang file kesalahan perbaikan cepat ketika itu berubah

2

Saya memiliki file (errors.txt) yang berisi daftar kesalahan (masalah gaya kode), yang saya muatkan ke perbaikan cepat Vim ( :cf errors.txt). errors.txt secara otomatis diperbarui oleh program eksternal (berjalan secara independen dari Vim) saat saya memperbaiki kesalahan. Apakah ada cara untuk membuat Vim memperbarui secara otomatis daftar perbaikan cepat ketika kesalahan.txt berubah?

Perhatikan bahwa saya tidak ingin Vim memperbarui error.txt. Program lain melakukan ini dan saya tidak ingin menyebutnya dari Vim. Saya hanya ingin perbaikan cepat Vim untuk memonitor errors.txt untuk perubahan. Terima kasih!

Tag pencarian: vim pembaruan perbaikan cepat memuat ulang pembaruan otomatis monitor file

Kaya
sumber

Jawaban:

1

Jika Anda memiliki versi Vim yang cukup baru (tidak yakin yang mana, tetapi jika Anda menjalankannya vim --version, Anda harus melihatnya +timers), Anda dapat mengatur timer asinkron untuk memeriksa apakah file telah dimodifikasi, dan menjalankan yang lain cfile errors.txtuntuk memuat ulang perbaikan cepat isi jendela. Berikut ini adalah konsep bukti (periksa di sini untuk versi yang disorot sintaksis):

" 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

Jika Anda memasukkannya ke dalam .vimrc, atau di file terpisah ~/.vim/plugins/, Anda akan mendapatkan :Cfileperintah yang dapat Anda gunakan seperti yang "asli", kecuali yang ini juga akan memantau file yang Anda berikan untuk perubahan setiap 200ms. Ini akan berhenti memperbarui secara otomatis ketika file dihapus.

Sayangnya, saya cukup yakin akan ada kasus tepi yang harus Anda tangani, jadi saya sarankan Anda menggunakan ini sebagai titik awal, cobalah untuk memahaminya (dengan menggunakan :helpuntuk fungsi atau perintah yang Anda tidak perlu tidak tahu tentang), dan membangun sesuatu yang sesuai dengan kebutuhan spesifik Anda.

Andrew Radev
sumber
Terima kasih banyak. Saya telah mencari menggunakan timer untuk mencapai ini. Saya menemukan halaman web ini berguna karena menyediakan pengatur waktu "palsu" untuk versi Vim yang lebih lama (tetapi tidak ideal) dan menyebutkan bahwa versi 8 memiliki pengatur waktu "nyata" yang digunakan oleh contoh Anda, yang terlihat jauh lebih baik. Sayangnya kantor saya tampaknya menggunakan versi Vim yang lebih lama yang tidak memiliki pengatur waktu ...
Rich
Maaf saya tidak memiliki reputasi untuk memperbaiki solusi Anda. Tetapi saya dapat menerimanya jika itu menang!
Kaya
0

Saya telah menemukan saran untuk pertanyaan saya sendiri yang diharapkan akan mendorong beberapa diskusi di sini. Saya bisa menggunakan fitur klien / server Vim yang akan memungkinkan proses lain untuk memberitahu Vim untuk memperbarui daftar Perbaikan Cepat. Dalam hal ini, program latar belakang saya dapat memberi tahu Vim setiap kali memperbarui kesalahan.txt! Lihatlah bagian ini untuk contoh yang agak mirip. Seperti yang Anda lihat, program lain menggunakan --remote untuk memberi tahu Vim apa yang harus dilakukan.

Satu-satunya masalah adalah versi Vim yang digunakan oleh kolega saya tidak memiliki + klien yang dikompilasi ... Saya berharap untuk solusi yang lebih "out-of-the-box" ...

Kaya
sumber
Ya, sebenarnya tidak banyak yang bisa Anda lakukan di luar kotak. Mungkin Anda bisa menggunakan perintah otomatis CursorHolduntuk memperbarui daftar ketika tidak aktif: vimdoc.sourceforge.net/htmldoc/autocmd.html#CursorHold . Tapi itu juga tidak ideal, karena itu hanya akan memicu setelah Anda berhenti mengetik selama beberapa milidetik.
Andrew Radev