desarrollo-web-br-bd.com

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

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?

379
twan163

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!

484
Thushi

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.

196
Ingo Karkat

TL; DR

Saltar a la Wrap-up rumbo a las líneas vimrc para agregar y mejorar tu 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 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.

Se dispara cuando el cursor deja de moverse

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 .

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

Agregue lo siguiente a su vimrc para activar autoread al cambiar los búferes mientras dentro 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 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.

74
Tom Hale