Saya menggunakan VIm untuk semua hal (atau gVim dalam hal ini), termasuk memantau keluaran yang ditulis ke file; Saya menggunakan autoread
untuk membuat Vim membaca ulang file, yang ia lakukan setiap kali saya mengalihkan fokus keyboard untuk itu.
Apakah ada cara untuk membuat Vim memperbarui buffer bahkan jika saya tidak mengganti fokus keyboard? Saya sudah mencoba pengaturan checktime
tetapi tampaknya tidak berpengaruh apa pun saat fokus keyboard ada di tempat lain.
Output yang saya pantau adalah mengganti file output sepenuhnya; dan aku tidak melihatnya tail -f
. Ada opsi lain, seperti memipet ke instance baru setiap saat, atau memipis ke less
atau sesuatu, tapi itu akan keren jika itu bisa dilakukan dengan VIm.
filesystem
Falstro
sumber
sumber
CursorHold
acara ini? Jika Vim tidak memiliki fokus, itu harus memicu setiap n detik.CursorHold
dijalankan hanya sekali, ini secara eksplisit didokumentasikan sebagai: "tidak memecat setiap 'waktu pembaruan' ms jika Anda meninggalkan Vim untuk membuat kopi. :)"Jawaban:
Pembaruan 2015-06-25 :
Apa yang
autoread
harus dilakukanUntuk menjawab pertanyaan ini, pertama-tama kita harus memahami apa yang dilakukan
autoread
opsi, dan yang lebih penting, apa yang tidak dilakukan.Sayangnya
:help 'autoread'
tidak memiliki banyak informasi tentang ini, hanya mengatakan "file telah terdeteksi telah diubah di luar Vim" . Bagaimana Vim mendeteksi bahwa suatu file diubah? Pada tindakan tertentu, Vim memeriksa waktu modifikasi file.Kapan:
:checktime
digunakan;:diffupdate
digunakan;:e
dikeluarkan untuk file yang sudah memiliki buffer;!
;^Z
,fg
, hanya jika shell memiliki kontrol pekerjaan);untuk gVim, ini juga dilakukan ketika:
Saya mengumpulkan informasi ini dari sumber Vim dengan mencari semua panggilan ke
buf_check_timestamp()
,check_timestamps()
fungsi, dan lokasi di mananeed_check_timestamps
diatur keTRUE
.Saya mungkin telah melewatkan beberapa peristiwa, tetapi hal utama yang perlu diingat adalah bahwa Vim hanya memeriksa apakah file tersebut dimodifikasi dalam serangkaian keadaan yang sangat terbatas . Itu tentu tidak "polling" file untuk perubahan n setiap detik, yang pada dasarnya apa yang Anda cari.
Jadi, untuk tujuan Anda,
set autoread
tidak cukup.Menggunakan Python
Ini menjadwalkan utas Python untuk dijalankan di latar belakang, ini akan berjalan
:checktime
setiap n detik. Jikaautoread
sudah diaktifkan , ini akan reload buffer dari disk, yang lain itu hanya akan memperingatkan.Ini mengharuskan Vim memiliki
+python
atau+python3
dalam:version
. Ini harus bekerja pada semua platform (termasuk Windows).Anda dapat memulai ini dengan menggunakan
:call AutoreadPython()
; Anda tentu saja dapat melakukan ini dalam autocmd; sebagai contoh:Kata penutup
Sebenarnya ada lebih banyak metode, misalnya Anda dapat menggunakan alat seperti
entr
atau Pythoninotify
ataugamin
modul untuk memantau file untuk perubahan,:checktime
juga memeriksa semua buffer jika tidak diberikan argumen, ini dapat ditingkatkan dengan hanya memeriksa satu buffer atau file tertentu.Namun, jawaban ini sudah agak lama :-) Metode ini seharusnya (mudah-mudahan!) Berfungsi dengan baik untuk sebagian besar skenario, atau harus mudah beradaptasi dengan skenario Anda.
PS. Saya juga mencoba menggunakan Ruby, tapi sayangnya utas Ruby (menggunakan
Thread
) tidak berjalan di latar belakang seperti yang dilakukan oleh Python, jadi saya tidak bisa menjalankannya (mungkin ada cara lain, sih?)sumber
Saya membuat sedikit plugin vim-autoread yang digunakan
tail -f
untuk memperbarui buffer di latar belakang secara tidak sinkron. Ini jelas membutuhkan fitur pekerjaan Vim Versi 8.Gunakan
:AutoRead
untuk menyalakannya dan:AutoRead!
mematikannya.sumber
Di Neovim Anda bisa menggunakan perintah berikut yang akan membuka terminal buffer menjalankan perintah tail.
Ini akan terus berfungsi bahkan jika file dihapus dan diciptakan kembali.
Atau tambahkan berikut ini ke
$MYVIMRC
sumber
dari jawaban ini (merujuk pada jawaban oleh PhanHaiQuang dan komentar oleh flukus )
Seseorang dapat menjalankan oneliner ini dari ex (whithin vim) saat dibutuhkan (atau menempatkan setiap perintah dalam vimrc, untuk saat file log dibuka.)
:set autoread | au CursorHold * checktime | call feedkeys("lh")
Penjelasan:
- autoread : membaca file ketika diubah dari luar (tetapi tidak bekerja sendiri, tidak ada timer internal atau sesuatu seperti itu. Itu hanya akan membaca file ketika vim melakukan suatu tindakan, seperti perintah dalam ex
:!
- CursorHold * checktime : ketika cursor tidak dipindahkan oleh pengguna untuk waktu yang ditentukan dalam 'updatetime' (yang secara default 4000 milidetik) dijalankan, yang memeriksa perubahan dari luar file
- panggilan feedkeys ("lh") : kursor dipindahkan satu kali, kanan dan kiri kiri. dan kemudian tidak ada yang terjadi (... yang berarti, bahwa CursorHold dipicu, yang berarti kita memiliki loop )
sumber