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 autoread
daha ö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
, fg
yalnı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_timestamps
ayarlı 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 autoread
yeterli değil.
Python'u Kullanma
Bu, arka planda çalıştırmak için bir Python iş parçacığı zamanlar,
:checktime
her n saniyede bir çalışır. Eğer autoread
bir etkin , bu aksi takdirde sadece uyaracak diskten tampon yeniden yükleyecektir.
Bu, Vim'in içinde +python
veya +python3
iç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 entr
için Python inotify
veya gamin
modül gibi bir araç kullanabilirsiniz
, :checktime
herhangi 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ı?)
CursorHold
olay? Vim'in odağı yoksa, her n saniyede bir tetiklemesi gerekir.