aggiorna il contenuto modificato del file aperto in vi (m)


362

Ho un file di configurazione che tengo aperto in vim, ma che a volte viene modificato sul disco, senza che queste modifiche si riflettano sul terminale. Posso aggiornare il contenuto sullo schermo senza chiudere e riaprire il file? Se é cosi, come?



In conclusione: tutte le risposte finora sono di "Poll" anziché di "Push". Cioè, invece di ricevere un evento di modifica di file esterno come è stato fatto da funzionalità simili di altri software, queste risposte si basano su vim che esegue il polling attivo della modifica del file, manualmente o innescato da un'azione dell'utente o da un timer. Il risultato finale è che non vedrai il cambiamento aggiornato sullo schermo istantaneamente.
Penghe Geng

Risposte:


464

È possibile utilizzare il :editcomando, senza specificare un nome file, per ricaricare il file corrente. Se hai apportato modifiche al file, puoi utilizzare :edit!per forzare il ricaricamento del file corrente (perderai le modifiche).

Il comando :editpuò essere abbreviato da :e. La modifica forzata può quindi essere eseguita da:e!


2
Il "!" mi stava inciampando, ma ora è chiaro.
twan163

107
Nota: in genere abbreviato in :e!.
Stéphane Chazelas,

31
@StephaneChazelas: Sì, è corretto :) @ twan163: Invece di :edite :edit!puoi usare :ee :e!rispettivamente.
Thushi,

11
Perdere modifiche, sì e no. Fondamentalmente, puoi ancora uannullare il :e!.
Gerrit,

5
Inoltre, se si desidera ricaricare tutti i buffer, eseguire::bufdo e
pkout

193

Oltre ad aggiornare manualmente il file con :edit, puoi inserirlo nel tuo~/.vimrc

:set autoread

per fare in modo che Vim aggiorni automaticamente tutti i file che non sono stati modificati da Vim. Vedere anche :checktime.


2
Attenzione dell'acquirente: se stai lavorando su un nuovo codice e git pulltieni presente che potresti perdere le modifiche non salvate sullo schermo piuttosto involontariamente.
azatar,

5
@toszter No, Vim aggiorna solo i buffer invariati . In caso di modifiche, ci sarà ancora una query: mantenere o caricare?
Ingo Karkat,

10
NB Autoread non funziona esattamente automaticamente. Devi usare gvimo eseguire comandi esterni.
Sparhawk,

3
Coloro che utilizzano vim all'interno di tmux possono ottenere eventi di messa a fuoco utilizzando github.com/tmux-plugins/vim-tmux-focus-events . Altrimenti la lettura automatica non ti aiuterà nel terminale a meno che tu non chiami in qualche modo:checktime
Karl Bartel il

3
autoreadpuò essere attivato automaticamente X secondi dopo che il cursore si ferma, vedi questa risposta .
Tom Hale,

57

TL; DR

Passare alla Wrap-uprubrica per le vimrclinee da aggiungere per fare rendere la vostra vita migliore.

manualmente

Correre :checktime

Controlla se qualche buffer è stato modificato al di fuori di Vim. Questo controlla e ti avverte se finiresti con due versioni di un file.

Automaticamente

Per caricare automaticamente le modifiche, aggiungi vimrc:

set autoread

Quando è stato rilevato che un file è stato modificato al di fuori di Vim e non è stato modificato all'interno di Vim, leggerlo di nuovo automaticamente. Quando il file è stato cancellato, questo non è fatto.

Questa risposta aggiunge un avvertimento:

Autoread non ricarica il file a meno che tu non faccia qualcosa come eseguire un comando esterno (come !lso !shecc)

Continua a leggere per soluzioni.

Attiva quando il cursore si ferma

Aggiungi a vimrc:

au CursorHold,CursorHoldI * checktime

Per impostazione predefinita, CursorHold viene attivato dopo che il cursore rimane fermo per 4 secondi ed è configurabile tramite updatetime .

Trigger su cambio buffer o messa a fuoco del terminale

Aggiungi quanto segue al tuo vimrctrigger autoreadquando cambi i buffer mentre sei all'interno di VIM:

au FocusGained,BufEnter * :checktime

Messa a fuoco della finestra del terminale di cattura all'interno di vim normale

Per far funzionare FocusGained(vedi sopra) in semplice vim, all'interno di un emulatore di terminale (Xterm, tmux, ecc.) Installare il plug-in: vim-tmux-focus-events

Nelle versioni di tmux> 1.9, devi aggiungere .tmux.conf:

set -g focus-events on

Incartare

Notifiche quando autoreadsono anche possibili trigger .

Ecco le mie vimrclinee per implementare tutto quanto sopra:

" 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

Grazie a ErichBSchulz per avermi indicato nella giusta direzioneau CursorHold .


2
post eccellente! Sembra una di quelle cose in cui questo dovrebbe essere il comportamento predefinito
JonnyRaa il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.