Tengo un archivo de configuración que mantengo abierto en vim, pero que a veces se cambia en el disco, sin que estos cambios se reflejen en el terminal. ¿Puedo actualizar el contenido en la pantalla sin cerrar y volver a abrir el archivo? ¿Si es así, cómo?
Puedes usar el :edit
comando, sin especificar un nombre de archivo, para volver a cargar el archivo actual. Si ha realizado modificaciones en el archivo, puede usar :edit!
para forzar la recarga del archivo actual (perderá sus modificaciones).
El comando :edit
se puede abreviar por :e
. La edición forzada puede ser realizada por :e!
Además de actualizar manualmente el archivo con :edit
, puedes poner en tu ~/.vimrc
:set autoread
para hacer que Vim actualice automáticamente cualquier archivo que no haya sido editado por Vim. Ver también :checktime
.
Saltar a la Wrap-up
rumbo a las líneas vimrc
para agregar y mejorar tu vida.
Correr :checktime
Compruebe si se cambiaron los búferes fuera de Vim. Esto comprueba y le advierte si terminaría con dos versiones de un archivo.
Para cargar cambios automáticamente, agregue su vimrc
:
Cuando se ha detectado que un archivo se ha cambiado fuera de Vim y no se ha cambiado dentro de Vim, vuelva a leerlo automáticamente. Cuando el archivo ha sido eliminado, esto no se hace.
Esta respuesta agrega una advertencia:
Autoread no vuelve a cargar el archivo a menos que haga algo como ejecutar un comando externo (como
!ls
o!sh
etc.)
Sigue leyendo para encontrar soluciones.
Agregue a su vimrc
:
au CursorHold,CursorHoldI * checktime
Por defecto, CursorHold se activa después de que el cursor permanezca quieto durante 4 segundos, y se puede configurar a través de tiempo de actualización .
Agregue lo siguiente a su vimrc
para activar autoread
al cambiar los búferes mientras dentro vim:
au FocusGained,BufEnter * :checktime
Para que FocusGained
(ver arriba) funcione en vim simple, dentro de un emulador de terminal (Xterm, tmux, etc.) instale el complemento: vim-tmux-focus-events
En las versiones tmux> 1.9, deberá agregar .tmux.conf
:
set -g focus-events on
Notificaciones cuando los activadores autoread
también son posibles .
Aquí están mis vimrc
líneas para implementar todo lo anterior:
" 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
Gracias a ErichBSchulz por señalarme en la dirección correcta con au CursorHold
.
Gracias a esta respuesta por resolver el problema de cmdwin.