Actualización 2015-06-25 :
- He descartado el método "shell", ya que era demasiado disfuncional. Se detuvo el modo de inserción y dejó procesos zombie. Mira el historial de revisiones de esta publicación si realmente quieres verlo de todos modos.
- He hecho un complemento de esto: auto_autoread.vim . Por el momento, es efectivamente el mismo que el código a continuación, pero recomendaría que use el complemento ya que es probable que reciba actualizaciones.
¿Qué autoread
hacer?
Para responder a esta pregunta, primero debemos entender qué hace la autoread
opción y, lo que es más importante, qué no hace.
Lamentablemente :help 'autoread'
no tiene mucha información sobre esto, solo dice "se ha detectado que un archivo ha sido cambiado fuera de Vim" . ¿Cómo detecta Vim que se ha cambiado un archivo? En ciertas acciones, Vim verifica el tiempo de modificación del archivo.
Cuando:
:checktime
se usa
- se ingresa un buffer;
:diffupdate
se usa
:e
se emite para un archivo que ya tiene un búfer;
- ejecutando un comando externo con
!
;
- volver al primer plano (
^Z
, fg
, sólo si la cáscara tiene control de trabajo);
para gVim, esto también se hace cuando:
- cerrar el menú "clic derecho" (ya sea seleccionando algo o simplemente cerrándolo);
- se cambia el enfoque (esto es lo que ya notó);
- cerrar el cuadro de diálogo del explorador de archivos que aparece si usa "archivo -> abrir", "archivo -> guardar como" en el menú (así como en otros lugares).
Reuní esta información desde la fuente de Vim mediante la localización de todas las llamadas a las
buf_check_timestamp()
, check_timestamps()
funciones y lugares en los que
need_check_timestamps
se establece en TRUE
.
Puede que me haya perdido algunos eventos, pero la clave para recordar es que Vim solo verifica si el archivo se modifica en un conjunto muy limitado de circunstancias . Ciertamente no "sondea" el archivo en busca de cambios cada n segundos, que es básicamente lo que buscas.
Entonces, para su propósito, set autoread
no es suficiente.
Usando Python
Esto programa un hilo de Python para que se ejecute en segundo plano, se ejecutará
:checktime
cada n segundos. Si autoread
está habilitado , esto volverá a cargar el búfer del disco, de lo contrario, solo advertirá.
Esto requiere que Vim tenga +python
o +python3
en :version
. Debería funcionar en todas las plataformas (incluido 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
Puede comenzar esto usando :call AutoreadPython()
; por supuesto, puedes hacer esto en un autocmd; por ejemplo:
autocmd *.c call AutoreadPython()
Epílogo
En realidad, hay más métodos, por ejemplo, podría usar una herramienta como
entr
Python inotify
o el gamin
módulo para monitorear un archivo en busca de cambios, :checktime
también verifica todos los buffers si no tiene ningún argumento, esto podría mejorarse al verificar solo un solo buffer o un cierto archivo
Sin embargo, esta respuesta ya es bastante larga :-) Este método debería (¡ojalá!) Funcionar bien para la mayoría de los escenarios, o debería ser fácilmente adaptable a su escenario.
PD. También intenté usar Ruby, pero desafortunadamente los hilos de Ruby (usando Thread
) no se ejecutan en segundo plano como lo hace Python, por lo que no pude hacer que esto funcionara (¿quizás hay otra forma, sin embargo?)
CursorHold
evento? Si Vim no tiene foco, debería activarse cada n segundos.