Rechargement automatique d'un fichier dans VIM dès qu'il change sur le disque

33

En supposant qu'un fichier n'a pas de modifications non enregistrées dans le tampon VIM, je voudrais qu'il se recharge automatiquement si le fichier change sur le disque. Le cas d'utilisation le plus fréquent est lorsque je mets à jour la copie de travail dans laquelle réside le fichier.

Comment puis-je atteindre cet objectif?

GJ.
la source
Je pense que c'est ce que vous voulez dire, mais mon cas d'utilisation spécifique est lorsque je vérifie une branche git ou un commit différent, je veux que vim recharge le fichier.
Nathan Long

Réponses:

32

Dans votre ~/.vimrc:

set autoread
Benjamin Bannier
la source
9
Généralement, autoreadil ne se déclenchera qu'après l'exécution d'une commande externe. Cette réponse détaille les solutions.
Tom Hale
Cela ne fonctionne pas Suivez le lien @TomHale pour une réponse détaillée qui fonctionne
JonnyRaa
11

C'est ce qui a fonctionné pour moi

set autoread                                                                                                                                                                                    
au CursorHold * checktime  

La première ligne n'était pas suffisante en soi. Vous pouvez mettre en vous.vimrc

crédit à Phan Hai Quang

ErichBSchulz
la source
L'autocmd ne devrait pas être nécessaire - checktime est censé s'exécuter en interne en même temps que l'événement CursorHold est déclenché. En d'autres termes, vous faites simplement effectuer à Vim une deuxième vérification.
Heptite
Pour moi, c'est nécessaire. La meilleure solution que j'ai trouvée après de nombreuses recherches. @Heptite, avez-vous un chapitre et un verset pour votre affirmation?
Tom Hale
1
@TomHale J'ai passé en revue les documents Vim et cela ne dit pas explicitement, pour autant que je sache, mais " :help timestamp" semble indiquer que je suis celui qui a commis une erreur, et que Vim n'effectue la vérification que sur des événements spécifiques, ainsi l'autocmd pourrait être nécessaire pour le faire vérifier plus fréquemment.
Heptite
5

La lecture automatique ne fonctionne pas correctement. Ce qui suit fonctionne pour moi:

Vous devez d'abord installer le script à partir d' ici .

J'ai obtenu les meilleurs résultats en appelant directement la fonction de configuration, comme ça.

let autoreadargs={'autoread':1} 
execute WatchForChanges("*",autoreadargs) 

La raison en est que je veux exécuter une configuration ipython / screen / vim.

Vous pouvez facilement le convertir en une version améliorée de la vue.

script le processus ..

mkdir -p ~/bin
cat <<`OUT` > ~/bin/vimviewer
#!/usr/bin/env sh
exec vim -n --cmd "source /home/bryan/.vim/.vimrc.watchforchanges | let autoreadargs={'autoread':1} | execute WatchForChanges('*',autoreadargs)" $@
`OUT`

chmod 755 ~/bin/vimviewer
vimview test.txt
Bryan Hunt
la source
1
Si vous utilisez l'une des interfaces graphiques vim telles que gVim ou MacVim, la commande de lecture automatique s'intègre parfaitement avec le reste de l'environnement. Par exemple, éditer le fichier dans un autre programme, un autre éditeur ou depuis le contrôle de code source, puis revenir à vim relira automatiquement les fichiers mis à jour. Le problème semble être lié à l'intégration de la version terminale de vim. La version du terminal ne peut pas dire quand vous basculez entre les programmes dans l'interface graphique ou à l'aide de multiplexeurs de terminaux comme tmux, elle ne parvient donc pas à la lecture automatique aux moments pertinents. Ce serait bien si vim se contentait de s'abonner aux événements pertinents du système de fichiers.
bames53
3

Le plugin vim-autoread a fonctionné pour moi jusqu'à présent:

vim-autoread

Entraîne automatiquement vim à recharger les fichiers qui ont été écrits sur le disque mais qui n'ont pas été modifiés dans le tampon depuis la dernière écriture de vim. Cela permet à un fichier ouvert dans vim d'être modifié à l'aide d'une autre application et enregistré. En revenant à vim, tant que vous n'avez pas modifié le fichier depuis la dernière modification, le fichier sera automatiquement mis à jour pour refléter les modifications apportées sur le disque, comme si vous aviez appuyé sur: e manuellement.

Wojtek Kruszewski
la source
Bien que ce lien puisse répondre à la question, il est préférable d'inclure les parties essentielles de la réponse ici et de fournir le lien de référence. Les réponses de lien uniquement peuvent devenir invalides si la page liée change. - De l'avis
Burgi
@Burgi J'ai ajouté une description du plugin qui explique comment cela résout le problème.
Wojtek Kruszewski
Je l'ai essayé mais je dois taper une commande de navigation (comme j) pour voir la mise à jour effective. J'ai créé un problème ici à ce sujet: github.com/djoshea/vim-autoread/issues/3
Martin Delille
3

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 )

eli
la source
lhne fait rien, si le curseur est à la dernière position sur la ligne, lhchangera son emplacement.
Mahmoud Al-Qudsi
Exactement, c'est le point. Le fichier est rechargé avec le minimum d'interaction ou de modifications apportées au fichier. Vous pouvez passer à la dernière ou à la première ligne si vous le souhaitez (remplacez simplement lh par gg ou G), mais le but ici, est simplement de recharger le fichier dans vim, et c'est ce qui est fait par ce one-liner, rien de plus. Qu'aimez-vous faire ici?
eli
@ MahmoudAl-Qudsi ... ce qui signifie que "lh" déclenche simplement l'action CursorHold - (je l'ai mentionné dans l'explication), ce qui déclenche à nouveau la lecture automatique
eli
1

Certains plugins répertoriés ici peuvent fonctionner en fonction de votre version de Vim.

Une autre approche consiste à envoyer périodiquement la checktimecommande à vim à partir d'un processus externe. Voici un script ShellJS pour ce faire (nécessite shelljs-plugin-sleepNeoVim et nvr)

while (true) {
  sleep(15);
  var servernames = exec('nvr --serverlist').trim().split('\n');
  if (!servernames.length || !servernames[0]) {
    continue;
  }
  servernames.forEach(
    (sn) => exec(`nvr -c "checktime" --servername ${sn}`) );
}
Andrew
la source