Comment recharger le fichier actuel?

145

Bien souvent, je travaille avec des fichiers dont la version est contrôlée. Il est donc possible de les modifier en dehors de Vim.

Quel est un moyen rapide de recharger le fichier sans avoir à fermer et rouvrir Vim? Et est-il possible de le faire automatiquement?

Kevin Brown
la source
" Compare buffer with saved version nnoremap gd :DiffSaved<CR>
Tom Hale
Si vous avez installé vim-faq , vous pouvez y obtenir une réponse hors ligne: :h vim-faqet effectuer une recherche /reload. Le tag difficile à mémoriser est :h faq-5.8.
Hotschke le

Réponses:

171

La commande que vous voulez est :e(courte :edit). Si vous l'utilisez :edit!, les modifications locales seront ignorées et rechargées.

Vous pouvez également demander à vim de le faire automatiquement set autoreaddans votre vimrc.

xième
la source
5
Voir cette réponse pour les mises en garde et les solutions concernant autoread.
Tom Hale
4
Pour faire cela pour tous les tampons, utilisez :bufdo :eou:bufdo :e!
Aaron H.
1
@ AaronH. Merci pour ça! J'ai généralement des centaines de tampons ouverts à la fois et lorsque je change de branche, je ferme simplement vim et redémarre pour actualiser tous les tampons avec un nouveau contenu. Ce sera un gain de temps majeur!
g19fanatic
1
@ AaronH. La seconde :est optionnelle: :bufdo efonctionnera de la même manière.
JoL
19

Dans de nombreux cas, set autoreadcela ne fonctionnera pas comme l' explique cette réponse :

Autoread ne recharge pas le fichier à moins que vous ne fassiez quelque chose comme exécuter une commande externe (comme !lsou !shetc.)

Les événements de focus se déclenchent autoread, mais ils ne sont pas capturés sauf si vous les utilisez gvim. Donc, si vous travaillez en clair vimdans une fenêtre de terminal ou dans tmux, installez le plugin vim-tmux-focus-events .

Sur les versions de tmux> 1.9, vous devrez ajouter .tmux.conf:

set -g focus-events on

Pour plus de commodité, ajouter ce qui suit à votre vimrcvolonté sera déclenché autoreadlors de la modification des tampons à l' intérieur de vim:

au FocusGained,BufEnter * :checktime
Tom Hale
la source
Cela m'ennuie depuis des années. Merci pour une solution complète! 💯😄
Nathan long
8

Si vous avez déjà exécuté une commande externe de Vim modifiant le tampon actuel, vous avez peut-être remarqué qu'elle vous invite à recharger le fichier depuis que des modifications ont été apportées au disque. Vous pouvez réellement appeler cette invite à l'aide de la :checktimecommande.

tommcdo
la source
3

Beau plugin pour améliorer autoread https://github.com/djoshea/vim-autoread

Vim recharge automatiquement les fichiers écrits sur le disque mais non modifiés dans le tampon depuis la dernière écriture à partir de vim. Cela permet de modifier un fichier ouvert dans vim à l'aide d'une autre application et de l'enregistrer. À votre retour dans 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.

und3rdg
la source
Bienvenue sur le Vi Stack Exchange. Ceci est presque une réponse de lien seulement. Vous pouvez l'améliorer en décrivant le plugin (par exemple, que fait-il? Comment l'utiliser pour atteindre les objectifs de OP?)
John O'M.
0

J'ai eu le problème de regarder le contenu d'un fichier, de mettre à jour le fichier en externe, d'afficher le fichier modifié et d'avoir la possibilité de le modifier si nécessaire. Je l'ai résolu avec les options de ligne de commande serveur / distant de Vim, inspirées par cette réponse .


Avec les commandes suivantes, un fichier peut être rechargé via une commande externe. Commencez par ouvrir le fichier en question avec Vim tout en démarrant une instance de serveur.

vim --servername JABBERWOCKY /tmp/alice.log

Supposons que le fichier a été modifié en externe, par exemple par un fichier echo "Curiouser and curiouser" >> /tmp/alice.log. Si nécessaire, envoyez une commande à l'instance du serveur pour recharger le fichier. Cette commande se terminera rapidement et ne générera pas un nouvel éditeur.

vim --servername JABBERWOCKY --remote-send ":e<CR>"

Si le fichier ouvert a été modifié dans Vim et en externe, il y aura un conflit lors du rechargement (un message d'avertissement apparaîtra). Pour ce cas, une décision doit être prise: laissez-le avec cela et conservez les modifications dans Vim, ou ignorez les modifications locales et forcez un rechargement .


La commande --remote-sendci-dessus nécessite un rechargement manuel. Cependant, cette commande pourrait être liée à une simple boucle, en utilisant for/ while, ou en utilisant un hacky one-liner sous Linux / Unix:

watch -n 1 'vim --servername JABBERWOCKY --remote-send ":e<CR>"'

Bien que cela n’ait pas été testé, je suis certain qu’un tel résultat pourrait également être réalisé dans PowerShell.

Sous Linux / Unix, une approche basée sur les événements peut être réalisée en écoutant les événements du système de fichiers en utilisant par exemple la bibliothèque inotify , si vous n’utilisez pas de systèmes de fichiers trop fous. Personnellement, j'aime beaucoup utiliser l'outil entr , qui semble être inclus dans les principales distributions Linux. Alors je reçois:

echo /tmp/alice.log | entr vim --servername JABBERWOCKY --remote-send ":e<CR>"
Piscoris
la source