2015-06-25 Güncellemesi :
- Çok işlevsiz olduğu için "kabuk" yöntemini hurdaya çıkardım. Ekleme kipini durdurdu ve zombi işlemlerini bıraktı. Bak bu ileti düzeltme geçmişinde gerçekten Yine de görmek istediğim.
- Bundan bir eklenti yaptım: auto_autoread.vim . Şu anda, etkili bir şekilde aşağıdaki kodla aynı, ancak eklentileri kullanmanızı öneririz, çünkü bu güncelleme alıyor olabilir.
Ne yapar autoread?
Bu soruyu cevaplamak için önce anlamak gerekir autoreaddaha önemlisi, hangi seçeneği yapar ve gelmez yapmak.
Maalesef :help 'autoread'
bu konuda pek fazla bilgiye sahip değil, sadece "Vim'in dışında bir dosyanın değiştiği tespit edildi" diyor . Vim bir dosyanın değiştiğini nasıl tespit eder? Bazı işlemlerde Vim, dosyanın değişiklik zamanını kontrol eder.
Ne zaman:
:checktime kullanıldı;
- bir tampon girilir;
:diffupdate kullanıldı;
:e zaten tamponu olan bir dosya için verilir;
- harici bir komut çalıştırmak
!;
- ön plana geri dönme (
^Z, fgyalnızca kabuk iş kontrolüne sahipse);
gVim için bu, şu durumlarda da yapılır:
- "sağ klik" menüsünü kapatmak (bir şeyi seçerek veya yalnızca kapatarak);
- odak değiştirildi (farkettin budur);
- Menüden "dosya -> açık", "dosya -> farklı kaydet" seçeneğini kullanırsanız (bazı diğer yerlerin yanı sıra) açılan tarayıcı pencerelerini kapatma.
Bu bilgiyi Vim kaynağından tüm çağrıları buf_check_timestamp(), check_timestamps()işlevleri ve need_check_timestampsayarlı konumları
bularak topladım
TRUE.
Bazı olayları kaçırmış olabilirim, ancak hatırlanması gereken en önemli şey, Vim'in yalnızca dosyanın çok sınırlı sayıda koşulda değiştirilip değiştirilmediğini kontrol etmesidir . Kesinlikle değil "anket" değişikliklerin sonsuza dek dosyayı yapar n ne sonra konum temelde hangi saniye.
Yani, amacınız için set autoreadyeterli değil.
Python'u Kullanma
Bu, arka planda çalıştırmak için bir Python iş parçacığı zamanlar,
:checktimeher n saniyede bir çalışır. Eğer autoreadbir etkin , bu aksi takdirde sadece uyaracak diskten tampon yeniden yükleyecektir.
Bu, Vim'in içinde +pythonveya +python3içinde olmasını gerektirir :version. Tüm platformlarda çalışmalıdır (Windows dahil).
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
Bunu kullanarak başlayabilirsiniz :call AutoreadPython(); elbette bunu bir autocmd içinde yapabilirsiniz; Örneğin:
autocmd *.c call AutoreadPython()
Sonsöz
Aslında daha fazla yöntem var, örneğin, bir dosyayı değişiklikler için izlemek entriçin Python inotifyveya gaminmodül gibi bir araç kullanabilirsiniz
, :checktimeherhangi bir argüman verilmezse tüm arabellekleri de denetler, bu yalnızca bir arabellek denetleyerek geliştirilebilir. belirli bir dosya.
Ancak, bu cevap zaten oldukça uzun :-) Bu yöntem (umarım!) Çoğu senaryo için iyi çalışmalı veya senaryoya kolayca uyarlanmalıdır.
PS. Ruby'yi de kullanmaya çalıştım, ancak ne yazık ki Ruby konu başlıkları (kullanarak Thread) Python'un yaptığı gibi arka planda çalışmadı, bu yüzden çalışmasını sağlayamadım (belki de başka bir yol var mı?)
CursorHoldolay? Vim'in odağı yoksa, her n saniyede bir tetiklemesi gerekir.