web-dev-qa-db-fra.com

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

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

379
twan163

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

La commande :edit peut être abrégé par :e. L'édition forcée peut donc être effectuée par :e!

484
Thushi

Outre l'actualisation manuelle du fichier avec :edit, vous pouvez mettre dans votre ~/.vimrc

:set autoread

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

196
Ingo Karkat

TL; DR

Passer au Wrap-up en-tête pour les lignes vimrc à ajouter pour rendre votre vie meilleure.

Manuellement

Courir :checktime

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

Automatiquement

Pour charger automatiquement les modifications, ajoutez 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. Une fois le fichier supprimé, cela n'est pas fait.

Cette réponse ajoute une mise en garde:

La lecture automatique ne recharge pas le fichier sauf si vous faites quelque chose comme exécuter une commande externe (comme !ls ou !sh etc)

Lisez la suite pour trouver des solutions.

Déclencher lorsque le curseur cesse de bouger

Ajoutez à votre vimrc:

au CursorHold,CursorHoldI * checktime

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

Déclenchement sur changement de tampon ou focus terminal

Ajoutez ce qui suit à votre vimrc pour déclencher autoread lors du changement de tampons pendant que à l'intérieur vim:

au FocusGained,BufEnter * :checktime

Attraper le focus de la fenêtre du terminal à l'intérieur de VIM simple

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

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

set -g focus-events on

Emballer

Notifications lorsque des déclencheurs autoread sont également possibles .

Voici mes lignes vimrc pour implémenter 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() !~ '\v(c|r.?|!|t)' && getcmdwintype() == '' | 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 pointé dans la bonne direction avec au CursorHold .

Merci à cette réponse pour avoir résolu le problème de cmdwin.

74
Tom Hale