Aggiornamento 25/06/2015 :
- Ho eliminato il metodo "shell", poiché era troppo disfunzionale. Ha interrotto la modalità di inserimento e ha lasciato i processi di zombi. Guarda la cronologia delle revisioni di questo post se vuoi davvero vederla comunque.
- Da questo ho creato un plug-in: auto_autoread.vim . Al momento, è effettivamente lo stesso del codice seguente, ma ti consiglio di utilizzare il plug-in poiché è probabile che questo riceva aggiornamenti.
Cosa fa autoread
?
Per rispondere a questa domanda, dobbiamo prima capire cosa fa l' autoread
opzione e, cosa più importante, cosa non fa.
Sfortunatamente :help 'autoread'
non ci sono molte informazioni al riguardo, dice solo "è stato rilevato che un file è stato modificato al di fuori di Vim" . In che modo Vim rileva che un file è cambiato? Su alcune azioni, Vim controlla il tempo di modifica del file.
Quando:
:checktime
viene usato;
- viene inserito un buffer;
:diffupdate
viene usato;
:e
viene emesso per un file che ha già un buffer;
- eseguire un comando esterno con
!
;
- tornare in primo piano (
^Z
, fg
solo se la shell ha il controllo del lavoro);
per gVim, questo viene fatto anche quando:
- chiudendo il menu "tasto destro" (selezionando qualcosa o semplicemente chiudendolo);
- lo stato attivo è cambiato (questo è quello che hai già notato);
- chiudendo la finestra di dialogo dei browser di file che si apre se si utilizza "file -> apri", "file -> salva come" dal menu (così come in altri luoghi).
Ho raccolto queste informazioni dalla fonte Vim individuando tutte le chiamate a
buf_check_timestamp()
, check_timestamps()
funzioni e posizioni su cui
need_check_timestamps
è impostata TRUE
.
Potrei aver perso alcuni eventi, ma la cosa fondamentale da ricordare è che Vim verifica solo se il file viene modificato in una serie molto limitata di circostanze . Certamente non "poll" il file per le modifiche mai n secondi, che è fondamentalmente quello che stai cercando.
Quindi, per il tuo scopo, set autoread
non è abbastanza.
Usando Python
Questo programma l'esecuzione di un thread Python in background, verrà eseguito
:checktime
ogni n secondi. Se autoread
viene attivato , questo ricaricherà il buffer dal disco, altrimenti sarà solo avvertire.
Ciò richiede che Vim abbia +python
o +python3
dentro :version
. Dovrebbe funzionare su tutte le piattaforme (incluso 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
Puoi iniziare usando :call AutoreadPython()
; puoi ovviamente farlo in un autocmd; per esempio:
autocmd *.c call AutoreadPython()
postfazione
Esistono in realtà più metodi, ad esempio è possibile utilizzare uno strumento come
entr
o Python inotify
o il gamin
modulo per monitorare un file per le modifiche, :checktime
controlla anche tutti i buffer se non viene fornito alcun argomento, questo può essere migliorato controllando solo un singolo buffer o un certo file.
Tuttavia, questa risposta è già piuttosto lunga :-) Questi metodi dovrebbero (si spera!) Funzionare bene per la maggior parte degli scenari o dovrebbero essere facilmente adattabili al tuo scenario.
PS. Ho anche provato a usare Ruby, ma sfortunatamente i thread di Ruby (usando Thread
) non funzionano in background come fa Python, quindi non sono riuscito a farlo funzionare (forse c'è un altro modo, però?)
CursorHold
dell'evento? Se Vim non ha lo stato attivo, dovrebbe attivarsi ogni n secondi.