¿Cómo recargo el archivo actual?

145

Muy a menudo estoy trabajando con archivos que están controlados por versiones, por lo que es posible que se realicen cambios fuera de Vim.

¿Cuál es una forma rápida de volver a cargar el archivo sin tener que cerrar y volver a abrir Vim? ¿Y hay alguna manera de hacer esto automáticamente?

Kevin Brown
fuente
" Compare buffer with saved version nnoremap gd :DiffSaved<CR>
Tom Hale
Si ha instalado vim-faq , puede obtener una respuesta sin conexión allí: :h vim-faqy buscar /reload. La etiqueta difícil de memorizar es :h faq-5.8.
Hotschke

Respuestas:

171

El comando que desea es :e(abreviatura de :edit). Si lo usa :edit!, descartará los cambios locales y se volverá a cargar.

También puede hacer que vim haga esto automáticamente set autoreaden su vimrc.

xthrd
fuente
55
Vea esta respuesta para advertencias y soluciones relacionadas autoread.
Tom Hale
44
Para hacer esto para todos los buffers, use :bufdo :eo:bufdo :e!
Aaron H.
1
@AaronH. ¡gracias por eso! Por lo general, tengo cientos de buffers abiertos a la vez y cuando cambio de sucursales, generalmente cierro vim y reinicio para actualizar todos los buffers con nuevos contenidos. ¡Esto será un gran ahorro de tiempo!
g19fanatic
1
@AaronH. El segundo :es opcional: :bufdo efuncionará igual.
JoL
19

En muchos casos, set autoreadno funcionará, ya que esta respuesta explica:

Autoread no vuelve a cargar el archivo a menos que haga algo como ejecutar un comando externo (como !lso !shetc.)

Los eventos de enfoque se dispararán autoread, pero estos no se capturan a menos que se usen gvim. Entonces, si se ejecuta sin problemas vimdentro de una ventana de terminal o tmux, instale el complemento vim-tmux-focus-events .

En las versiones tmux> 1.9, deberá agregar .tmux.conf:

set -g focus-events on

Para una bondad adicional, agregar lo siguiente a su vimrcdisparador se activará autoreadal cambiar los búferes dentro de vim:

au FocusGained,BufEnter * :checktime
Tom Hale
fuente
Esto me ha estado molestando por años. Gracias por una solución completa! 💯😄
Nathan Long
8

Si alguna vez ha ejecutado un comando externo desde Vim que modifica el búfer actual, es posible que haya notado que le solicita que vuelva a cargar el archivo ya que se han realizado cambios en el disco. En realidad, puede invocar este aviso utilizando el :checktimecomando.

tommcdo
fuente
3

Bonito complemento para mejorar autoread https://github.com/djoshea/vim-autoread

Hace que vim vuelva a cargar automáticamente los archivos que se han escrito en el disco pero que no se han modificado en el búfer desde la última escritura desde vim. Esto permite editar un archivo abierto en vim usando otra aplicación y guardarlo. Al regresar a vim, siempre que no haya modificado el archivo desde el último cambio, el archivo se actualizará automáticamente para reflejar los cambios realizados en el disco, como si hubiera presionado: e manualmente.

und3rdg
fuente
Bienvenido a Vi Stack Exchange. Esta es casi una respuesta de solo enlace. Puede mejorarlo describiendo el complemento (por ejemplo, ¿qué hace? ¿Cómo lo usaría uno para lograr los objetivos de OP?)
John O'M.
0

Tuve el problema de mirar el contenido de un archivo, actualizar el archivo externamente, mostrar el archivo modificado y tener la opción de editarlo cuando sea necesario. Lo resolví con el servidor Vim / opciones de línea de comando remoto, inspirado en esta respuesta .


Con los siguientes comandos, un archivo puede recargarse mediante un comando externo. Primero, abra el archivo en cuestión con Vim, mientras inicia una instancia del servidor.

vim --servername JABBERWOCKY /tmp/alice.log

Supongamos que el archivo se ha cambiado externamente, por ejemplo, a echo "Curiouser and curiouser" >> /tmp/alice.log. Cuando sea necesario, envíe un comando a la instancia del servidor para volver a cargar el archivo. Este comando finalizará rápidamente y no generará un nuevo editor.

vim --servername JABBERWOCKY --remote-send ":e<CR>"

Si el archivo abierto se cambió en Vim y externamente, habrá un conflicto durante la recarga (aparecerá un mensaje de advertencia). Para ese caso, se debe tomar una decisión: dejarlo así y mantener los cambios en Vim, o descartar los cambios locales y forzar una recarga .


El comando --remote-sendanterior requiere la recarga manual. Sin embargo, ese comando podría estar vinculado a un bucle simple, usando Bash's for/ while, o usando un hacky one-liner en Linux / Unix:

watch -n 1 'vim --servername JABBERWOCKY --remote-send ":e<CR>"'

Aunque no se ha probado, estoy seguro de que algo así también podría realizarse en PowerShell.

En Linux / Unix, se puede realizar un enfoque basado en eventos al escuchar eventos del sistema de archivos utilizando, por ejemplo, la biblioteca inotify , si no está utilizando sistemas de archivos demasiado locos. Personalmente, me gusta mucho usar la herramienta entr , que parece estar incluida en las principales distribuciones de Linux. Entonces me sale:

echo /tmp/alice.log | entr vim --servername JABBERWOCKY --remote-send ":e<CR>"
Piscoris
fuente