actualizar el contenido modificado del archivo abierto en vi (m)

362

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?

twan163
fuente
Cierre: todas las respuestas hasta ahora son de "Encuesta" en lugar de estilo "Empujar". Es decir, en lugar de recibir un evento de cambio de archivo externo como lo hicieron las características similares de otro software, estas respuestas dependen de que vim realice un sondeo activo del cambio de archivo, ya sea manualmente o desencadenado por una acción del usuario o un temporizador. El resultado final es que no verá cambios actualizados en la pantalla instantáneamente.
Penghe Geng

Respuestas:

464

Puede usar el :editcomando, sin especificar un nombre de archivo, para volver a cargar el archivo actual. Si ha realizado modificaciones en el archivo, puede usarlo :edit!para forzar la recarga del archivo actual (perderá sus modificaciones).

El comando :editpuede ser abreviado por :e. La edición forzada puede ser realizada por:e!

Thushi
fuente
2
Los "!" me estaba tropezando, pero ahora está claro.
twan163
107
Nota: generalmente se abrevia como :e!.
Stéphane Chazelas
31
@StephaneChazelas: Sí, eso es correcto :) @ twan163: En lugar de :edity :edit!puedes usar :ey :e!respectivamente.
Thushi
11
Pierde modificaciones, sí y no. Crucialmente, todavía puedes hacer uel :e!.
gerrit
55
Además, si desea recargar todas sus memorias intermedias, ejecute::bufdo e
pkout
193

Además de actualizar manualmente el archivo con :edit, puede poner en su~/.vimrc

:set autoread

para hacer que Vim actualice automáticamente cualquier archivo que no haya sido editado por Vim. También vea :checktime.

Ingo Karkat
fuente
2
Cuidado con el comprador: si está trabajando en un código nuevo y git pulltenga en cuenta que podría perder sus cambios no guardados en la pantalla de manera no intencional.
azatar
55
@toszter No, Vim solo actualizará los búferes sin cambios . En caso de cambios, todavía habrá una consulta: ¿Mantener o cargar?
Ingo Karkat
10
NB autoread no funciona exactamente automáticamente. Tienes que usar gvimo ejecutar comandos externos.
Sparhawk
3
Aquellos que usan vim dentro de tmux pueden obtener eventos de enfoque usando github.com/tmux-plugins/vim-tmux-focus-events . De lo contrario, la lectura automática no ayudará en la terminal a menos que llame de alguna manera:checktime
Karl Bartel
3
autoreadpuede activarse automáticamente X segundos después de que el cursor deja de moverse, vea esta respuesta .
Tom Hale
57

TL; DR

Vaya al Wrap-upencabezado de las vimrclíneas para agregar para mejorar su vida.

A mano

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.

Automáticamente

Para cargar cambios automáticamente, agregue su vimrc:

set autoread

Cuando se detecta que un archivo 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 !lso !shetc.)

Sigue leyendo para encontrar soluciones.

Se dispara cuando el cursor deja de moverse

Añadir a su vimrc:

au CursorHold,CursorHoldI * checktime

De manera predeterminada, CursorHold se activa después de que el cursor permanezca quieto durante 4 segundos y se puede configurar a través del tiempo de actualización .

Disparador en el cambio de búfer o foco de terminal

Agregue lo siguiente a su vimrcpara activar autoreadcuando cambie los búferes mientras está dentro de vim:

au FocusGained,BufEnter * :checktime

Capturar el foco de la ventana de terminal dentro de vim simple

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

Envolver

Notificaciones cuando los autoreaddisparadores también son posibles .

Aquí están mis vimrclí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() != '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

Gracias a ErichBSchulz por señalarme en la dirección correctaau CursorHold .

Tom Hale
fuente
2
excelente post! Se siente como una de esas cosas en las que este debería ser el comportamiento predeterminado
JonnyRaa