Estoy usando VIm para todo tipo de cosas (o gVim en este caso), incluida la salida de monitoreo escrita en un archivo; Utilizo autoread
para hacer que Vim vuelva a leer el archivo, lo que hace cada vez que le cambio el foco del teclado.
¿Hay alguna forma de hacer que Vim actualice el búfer incluso si no cambio el foco del teclado? He intentado configurar checktime
pero no parece tener ningún efecto mientras el foco del teclado está en otra parte.
La salida que estoy monitoreando está reemplazando el archivo de salida por completo; y no estoy mirando a tail -f
él. Hay otras opciones, como canalizar una nueva instancia cada vez, o canalizar less
o algo así, pero sería genial si se pudiera hacer con VIm.
filesystem
falstro
fuente
fuente
CursorHold
evento? Si Vim no tiene foco, debería activarse cada n segundos.CursorHold
se ejecuta solo una vez, esto se documenta explícitamente como: "no dispara cada 'tiempo de actualización' ms si deja Vim para hacer un café. :)"Respuestas:
Actualización 2015-06-25 :
¿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:diffupdate
se usa:e
se emite para un archivo que ya tiene un búfer;!
;^Z
,fg
, sólo si la cáscara tiene control de trabajo);para gVim, esto también se hace cuando:
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 queneed_check_timestamps
se establece enTRUE
.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. Siautoread
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).Puede comenzar esto usando
:call AutoreadPython()
; por supuesto, puedes hacer esto en un autocmd; por ejemplo:Epílogo
En realidad, hay más métodos, por ejemplo, podría usar una herramienta como
entr
Pythoninotify
o elgamin
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 archivoSin 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?)fuente
Hice un pequeño complemento vim-autoread que usa
tail -f
para actualizar el búfer en segundo plano de forma asincrónica. Obviamente, esto necesita la función de trabajo de Vim Versión 8.Use
:AutoRead
para encenderlo y:AutoRead!
apagarlo.fuente
En Neovim, podría usar el siguiente comando que abrirá un búfer de terminal que ejecuta el comando de cola.
Esto continuará funcionando incluso si el archivo se elimina y se vuelve a crear.
O agregue lo siguiente a su
$MYVIMRC
fuente
de esta respuesta (refiriéndose a una respuesta de PhanHaiQuang y un comentario de flukus )
Uno puede ejecutar este oneliner desde ex (dentro de vim) cuando sea necesario (o poner cada comando en vimrc, para cuando se abren los archivos de registro).
:set autoread | au CursorHold * checktime | call feedkeys("lh")
Explicación:
- autoread : lee el archivo cuando se cambia desde el exterior (pero no funciona por sí solo, no hay un temporizador interno o algo así. Solo leerá el archivo cuando vim realice una acción, como un comando en ex
:!
- CursorHold * checktime : cuando el usuario no mueve el cursor durante el tiempo especificado en 'updatetime' (que es 4000 milisegundos por defecto) se ejecuta checktime, que verifica los cambios desde fuera del archivo
- llame a las teclas de alimentación ("lh") : el cursor se mueve una vez, hacia la derecha y hacia la izquierda, y luego no pasa nada (... lo que significa que se activa CursorHold, lo que significa que tenemos un bucle )
fuente