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?
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!
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
.
Passer au Wrap-up
en-tête pour les lignes vimrc
à ajouter pour rendre votre vie meilleure.
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.
Pour charger automatiquement les modifications, ajoutez votre vimrc
:
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.
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 .
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
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
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.