J'utilise VIm pour toutes sortes de choses (ou gVim dans ce cas), y compris la surveillance de la sortie écrite dans un fichier; J'utilise autoread
pour que Vim relise le fichier, ce qu'il fait chaque fois que je lui passe le focus du clavier.
Existe-t-il un moyen de faire mettre à jour Vim le tampon même si je ne change pas le focus du clavier? J'ai essayé le réglage, checktime
mais il ne semble pas avoir d'effet alors que le focus du clavier est ailleurs.
La sortie que je surveille remplace complètement le fichier de sortie; et je n'y regarde pas tail -f
. Il existe d'autres options, comme le piping dans une nouvelle instance à chaque fois, ou le piping dans less
ou quelque chose, mais ce serait cool si cela pouvait être fait avec VIm.
filesystem
falstro
la source
la source
CursorHold
vous de l' événement? Si Vim n'a pas de focus, il devrait se déclencher toutes les n secondes.CursorHold
n'est exécuté qu'une seule fois, cela est explicitement documenté comme suitRéponses:
Mise à jour 2015-06-25 :
Que fait
autoread
-il?Pour répondre à cette question, nous devons d'abord comprendre ce que fait l'
autoread
option et, plus important encore, ce qu'elle ne fait pas .Malheureusement, il
:help 'autoread'
n'a pas beaucoup d'informations à ce sujet, il dit simplement "qu'un fichier a été détecté comme ayant été modifié en dehors de Vim" . Comment Vim détecte-t-il qu'un fichier est modifié? Sur certaines actions, Vim vérifie l'heure de modification du fichier.Quand:
:checktime
est utilisé;:diffupdate
est utilisé;:e
est émis pour un fichier qui a déjà un tampon;!
;^Z
,fg
, seulement si la coquille a le contrôle de l' emploi);pour gVim, cela se fait également lorsque:
J'ai rassemblé ces informations de la source vim de localiser tous les appels vers les
buf_check_timestamp()
,check_timestamps()
fonctions, et les lieux oùneed_check_timestamps
est mis àTRUE
.J'ai peut-être manqué certains événements, mais l'essentiel à retenir est que Vim vérifie uniquement si le fichier est modifié dans un ensemble très limité de circonstances . Il n'effectue certainement pas "d'interrogation" sur le fichier pour les changements de n secondes, ce qui est essentiellement ce que vous recherchez.
Donc, pour vous, ce
set autoread
n'est pas suffisant.Utiliser Python
Cela planifie un thread Python pour s'exécuter en arrière-plan, il s'exécutera
:checktime
toutes les n secondes. Siautoread
est activé , cela rechargera le tampon du disque, sinon il avertira simplement.Cela nécessite que Vim ait
+python
ou+python3
en:version
. Il devrait fonctionner sur toutes les plateformes (y compris Windows).Vous pouvez commencer cela en utilisant
:call AutoreadPython()
; vous pouvez bien sûr le faire dans un autocmd; par exemple:Épilogue
Il existe en fait plus de méthodes, par exemple, vous pouvez utiliser un outil tel que
entr
ou le Pythoninotify
ou legamin
module pour surveiller les modifications d'un fichier,:checktime
vérifie également tous les tampons si aucun argument n'est fourni, cela pourrait être amélioré en vérifiant uniquement un seul tampon ou un certain fichier.Cependant, cette réponse est déjà assez longue :-) Ces méthodes devraient (espérons-le!) Fonctionner correctement pour la plupart des scénarios, ou devraient être facilement adaptables à votre scénario.
PS. J'ai également essayé d'utiliser Ruby, mais malheureusement, les threads Ruby (en utilisant
Thread
) ne s'exécutent pas en arrière-plan comme le fait Python, donc je n'ai pas pu faire fonctionner cela (peut-être qu'il y a un autre moyen, cependant?)la source
J'ai fait un petit plugin vim-autoread qui utilise
tail -f
pour mettre à jour le tampon en arrière-plan de manière asynchrone. Cela nécessite évidemment la fonction de travail de Vim Version 8.Utilisez
:AutoRead
pour l'allumer et l':AutoRead!
éteindre.la source
Dans Neovim, vous pouvez utiliser la commande suivante qui ouvrira un tampon de terminal exécutant la commande tail.
Cela continuera de fonctionner même si le fichier est supprimé et recréé.
Ou ajoutez ce qui suit à votre
$MYVIMRC
la source
de cette réponse (se référant à une réponse de PhanHaiQuang et un commentaire de flukus )
On peut exécuter ce oneliner depuis ex (dans vim) en cas de besoin (ou mettre chaque commande dans vimrc, lorsque les fichiers journaux sont ouverts.)
:set autoread | au CursorHold * checktime | call feedkeys("lh")
Explication:
- lecture automatique : lit le fichier lorsqu'il est modifié de l'extérieur (mais cela ne fonctionne pas seul, il n'y a pas de temporisateur interne ou quelque chose comme ça. Il ne lira le fichier que lorsque vim fait une action, comme une commande dans ex
:!
- CursorHold * checktime : lorsque le curseur n'est pas déplacé par l'utilisateur pendant la durée spécifiée dans 'updatetime' (qui est de 4000 millisecondes par défaut) checktime est exécuté, qui vérifie les modifications de l'extérieur du fichier
- appelez les touches de flux ("lh") : le curseur est déplacé une fois, à droite et en arrière à gauche, puis rien ne se passe (... ce qui signifie que CursorHold est déclenché, ce qui signifie que nous avons une boucle )
la source