Actualiser le contenu modifié du fichier ouvert dans vi (m)

362

J'ai un fichier de configuration que je garde ouvert dans vim, mais il est parfois modifié sur le disque sans que ces modifications soient répercutées sur le terminal. Puis-je actualiser le contenu à l'écran sans fermer ni rouvrir le fichier? Si c'est le cas, comment?

twan163
la source
En résumé: jusqu’à présent, toutes les réponses sont du type "Poll" au lieu du style "Push". Autrement dit, au lieu de recevoir un événement de modification de fichier externe, comme cela avait été le cas avec les fonctionnalités similaires d'un autre logiciel, ces réponses reposent sur une interrogation active de la modification du fichier par vim, soit manuellement, soit par suite d'une action de l'utilisateur ou d'un minuteur. Le résultat final est que vous ne verrez pas le changement actualisé instantanément à l'écran.
Penghe Geng

Réponses:

464

Vous pouvez utiliser la :editcommande, sans spécifier de nom de fichier, pour recharger le fichier actuel. Si vous avez apporté des modifications au fichier, vous pouvez utiliser :edit!pour forcer le rechargement du fichier actuel (vous perdrez vos modifications).

La commande :editpeut être abrégée par :e. Le force-edit peut donc être fait par:e!

Thushi
la source
2
Le "!" m'a fait trébucher, mais maintenant c'est clair.
twan163
107
Remarque: c'est généralement abrégé en :e!.
Stéphane Chazelas
31
@StephaneChazelas: Ouais, c'est bien ça :) @ twan163: Au lieu de :editet :edit!vous pouvez utiliser :eet :e!respectivement.
Thushi
11
Perdre des modifications, oui et non. Surtout, vous pouvez toujours ne pas ule faire :e!.
gerrit
5
De plus, si vous voulez recharger tous vos tampons, exécutez::bufdo e
pkout
193

En plus d'actualiser manuellement le fichier avec :edit, vous pouvez mettre dans votre~/.vimrc

:set autoread

pour que Vim actualise automatiquement tous les fichiers qui n'ont pas été édités par Vim. Voir aussi :checktime.

Ingo Karkat
la source
2
Attention à l'acheteur - Si vous travaillez sur un nouveau code et git pullsoyez conscient, vous risquez de perdre vos modifications non enregistrées à l'écran de manière non intentionnelle.
Azatar
5
@toszter Non, Vim actualisera uniquement les tampons non modifiés. En cas de changement, il y aura toujours une requête: conserver ou charger?
Ingo Karkat
10
NB autoread ne fonctionne pas exactement automatiquement. Vous devez soit utiliser gvimou exécuter des commandes externes.
Sparhawk
3
Ceux qui utilisent vim dans tmux peuvent obtenir des événements de focus en utilisant github.com/tmux-plugins/vim-tmux-focus-events . Autrement, l'autoread ne vous aidera pas dans le terminal, sauf si vous appelez d'une manière ou d'une autre:checktime
Karl Bartel, le
3
autoreadpeut être déclenché automatiquement X secondes après que le curseur ait cessé de bouger, voir cette réponse .
Tom Hale
57

TL; DR

Passez à la Wrap-uprubrique des vimrclignes à ajouter pour améliorer votre vie.

Manuellement

Courir :checktime

Vérifiez si des tampons ont été changés en dehors de Vim. Ceci vérifie et vous avertit si vous vous retrouviez avec deux versions d'un fichier.

Automatiquement

Pour charger automatiquement les modifications, ajoutez dans votre vimrc:

set autoread

Lorsqu'un fichier a été détecté comme ayant été modifié en dehors de Vim et qu'il n'a pas été modifié à l'intérieur de Vim, relisez-le automatiquement. Lorsque le fichier a été supprimé, cela n'est pas fait.

Cette réponse ajoute une mise en garde:

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

Lisez la suite pour des solutions.

Déclenche lorsque le curseur ne bouge plus

Ajouter à votre vimrc:

au CursorHold,CursorHoldI * checktime

Par défaut, CursorHold est déclenché après que le curseur est resté immobile pendant 4 secondes et est configurable via updatetime .

Déclenchement sur changement de tampon ou focus terminal

Ajoutez les éléments suivants à votre vimrcdéclencheur autoreadlors de la modification des tampons dans vim:

au FocusGained,BufEnter * :checktime

Mise au point de la fenêtre du terminal dans vim

Pour avoir FocusGained(voir ci-dessus) travailler en clair vim, à l'intérieur d'un émulateur de terminal (Xterm, tmux, etc.), installez le plugin: vim-tmux-focus-events

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

set -g focus-events on

Emballer

Les notifications lorsque des autoreaddéclencheurs sont également possibles .

Voici mes vimrclignes pour mettre en œuvre tout ce qui précède:

" Triger `autoread` when files changes on disk
" https://unix.stackexchange.com/questions/149209/refresh-changed-content-of-file-opened-in-vim/383044#383044
" https://vi.stackexchange.com/questions/13692/prevent-focusgained-autocmd-running-in-command-line-editing-mode
autocmd FocusGained,BufEnter,CursorHold,CursorHoldI * if mode() != 'c' | checktime | endif
" Notification after file change
" https://vi.stackexchange.com/questions/13091/autocmd-event-for-autoread
autocmd FileChangedShellPost *
  \ echohl WarningMsg | echo "File changed on disk. Buffer reloaded." | echohl None

Merci à ErichBSchulz de m'avoir orienté dans la bonne direction avecau CursorHold .

Tom Hale
la source
2
excellent post! On se sent comme une de ces choses où cela devrait être le comportement par défaut
JonnyRaa