Mise à jour 2015-06-25 :
- J'ai abandonné la méthode "shell", car elle était trop dysfonctionnelle. Il a arrêté le mode d'insertion et laissé les processus zombies. Regardez l'historique des révisions de ce message si vous voulez vraiment le voir de toute façon.
- J'ai créé un plugin à partir de cela: auto_autoread.vim . Pour le moment, c'est effectivement le même que le code ci-dessous, mais je vous recommande d'utiliser le plugin car il est susceptible de recevoir des mises à jour.
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é;
- un tampon est entré;
:diffupdate
est utilisé;
:e
est émis pour un fichier qui a déjà un tampon;
- exécuter une commande externe avec
!
;
- retour au premier plan (
^Z
, fg
, seulement si la coquille a le contrôle de l' emploi);
pour gVim, cela se fait également lorsque:
- fermer le menu "clic droit" (soit en sélectionnant quelque chose, soit simplement en le fermant);
- le focus est changé (c'est ce que vous avez déjà remarqué);
- en fermant la boîte de dialogue des navigateurs de fichiers qui apparaît si vous utilisez "fichier -> ouvrir", "fichier -> enregistrer sous" dans le menu (ainsi que d'autres endroits).
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. Si autoread
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).
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
Vous pouvez commencer cela en utilisant :call AutoreadPython()
; vous pouvez bien sûr le faire dans un autocmd; par exemple:
autocmd *.c call AutoreadPython()
Épilogue
Il existe en fait plus de méthodes, par exemple, vous pouvez utiliser un outil tel que
entr
ou le Python inotify
ou le gamin
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?)
CursorHold
vous de l' événement? Si Vim n'a pas de focus, il devrait se déclencher toutes les n secondes.