Pembaruan 2015-06-25 :
- Saya telah membatalkan metode "shell", karena terlalu disfungsional. Itu menghentikan mode penyisipan dan meninggalkan proses zombie. Lihatlah riwayat revisi posting ini apakah Anda benar-benar ingin melihatnya.
- Saya telah membuat sebuah plugin dari ini: auto_autoread.vim . Saat ini, secara efektif sama dengan kode di bawah ini, tetapi saya sarankan Anda menggunakan plugin karena ini kemungkinan akan menerima pembaruan.
Apa yang autoread
harus dilakukan
Untuk 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;
- buffer dimasukkan;
:diffupdate
digunakan;
:e
dikeluarkan untuk file yang sudah memiliki buffer;
- mengeksekusi perintah eksternal dengan
!
;
- kembali ke latar depan (
^Z
, fg
, hanya jika shell memiliki kontrol pekerjaan);
untuk gVim, ini juga dilakukan ketika:
- menutup menu "klik kanan" (baik dengan memilih sesuatu, atau hanya dengan menutupnya);
- fokus diubah (ini yang sudah Anda perhatikan);
- menutup dialog browser file yang muncul jika Anda menggunakan "file -> open", "file -> save as" dari menu (dan juga beberapa tempat lain).
Saya mengumpulkan informasi ini dari sumber Vim dengan mencari semua panggilan ke
buf_check_timestamp()
, check_timestamps()
fungsi, dan lokasi di mana
need_check_timestamps
diatur ke TRUE
.
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. Jika autoread
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).
fun! AutoreadPython()
python << EOF
import time, vim
try: import thread
except ImportError: import _thread as thread # Py3
def autoread():
vim.command('checktime') # Run the 'checktime' command
vim.command('redraw') # Actually update the display
def autoread_loop():
while True:
time.sleep(1)
autoread()
thread.start_new_thread(autoread_loop, ())
EOF
endfun
Anda dapat memulai ini dengan menggunakan :call AutoreadPython()
; Anda tentu saja dapat melakukan ini dalam autocmd; sebagai contoh:
autocmd *.c call AutoreadPython()
Kata penutup
Sebenarnya ada lebih banyak metode, misalnya Anda dapat menggunakan alat seperti
entr
atau Python inotify
atau gamin
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?)
CursorHold
acara ini? Jika Vim tidak memiliki fokus, itu harus memicu setiap n detik.