2009-05-28 8 views
52

Normalmente utilizzo gVim per la modifica, ma a volte utilizzo vim durante la connessione remota alla mia macchina.Rileva cambio di file, offerta di ricaricare il file

Quando ho un file aperto in gVim e è cambiato dall'esterno (ad esempio, nuovi aggiornamenti dal repository), gVim offre di ricaricarlo.

Tuttavia, quando una cosa del genere accade con Vim, non fa nulla finché non provi a salvare il file. Ti avverte solo che il file è cambiato, ma non offre di ricaricarlo.

Esiste un'impostazione per rendere il comportamento di Vim corrispondente a gVim?

+0

possibile duplicato http://stackoverflow.com/questions/2157914/can-vim-monitor-realtime- changes-to-a-file – ivotron

risposta

23

Questo viene fatto utilizzando un comando automatico chiamato FileChangedShell. Sono troppo nuova per postare link, ma la soluzione migliore sarebbe quella di leggere la parte autocmd della documentazione vim (Google per questo)

ma il succo è quello di impostare qualcosa di simile alla seguente riga nel vostro vimrc

:au FileChangedShell * echo "Warning: File changed on disk" 
+0

Non penso sia necessario, vim dovrebbe avvisarti della modifica automaticamente. –

+12

Anche se non è così, sfortunatamente. – Art

+0

Arte, il mio suggerimento ha funzionato? –

9

È possibile attivare manualmente il controllo con :checktime. gvim lo fa ogni volta che riprende l'attenzione, quindi non è necessario che spesso faccia il controllo manuale.

Non so se esiste un approccio diverso (come il controllo automatico di un certo intervallo di tempo).

+3

Proprio così, gvim lo fa, ma non vim – Art

51

Come detto ashcatch, il comando :checktime verificherà le modifiche sul disco e richiederà di ricaricare. Quindi imposta Vim per eseguire automaticamente checktime dopo qualche evento. Quale evento utilizzare dipende da te. Una possibilità è utilizzare CursorHold, che si attiva dopo aver spostato il cursore e quindi lasciarlo fermo per i millisecondi updatetime. (Default 4 secondi.)

:au CursorHold * checktime 

si potrebbe anche impostarlo su WinEnter o BufWinEnter modo cambia ogni volta che si passa tra i tamponi/windows. Se sei davvero paranoico, puoi impostarlo su CursorMoved in modo che controlli il file sul disco ogni volta che muovi il cursore, ma probabilmente è eccessivo e potrebbe rallentare un po '.

Vedere :h checktime, :h updatetime, :h autocmd-events-abc.

+7

Sono così male leggendo aiuto vim ... Non sono sicuro del perché mi intorpidisce la mente per qualche motivo. – ojblass

+0

Brian, vim dice "Nessun gruppo o evento simile: CurshorHold * checktime" – Art

+0

Spiacenti, errore di battitura. CurshorHold avrebbe dovuto essere Cursorhold. –

62

Se si desidera aprire il file aggiornato utilizzare

:e 

Occorre ricaricare il file aperto.

8

Per migliorare la risposta di Carper:

" Run checktime in buffers, but avoiding the "Command Line" (q:) window 
au CursorHold * if getcmdwintype() == '' | checktime | endif 

Senza questo controllo Vim becco errori se si tenta di utilizzare il buffer "riga di comando" (q :), perché questo buffer non supporta il comando :checktime . Trovato questo grazie a kdlv su #vim.

+1

Sembra 'getcmdwintype()' può richiedono vim 7.4? Mi sembra che funzioni su 7.3 usando invece 'getcmdtype()'. – overthink

+1

È possibile utilizzare 'au CursorHold, CursorHoldI * silent! checktime' per ignorare gli errori. Questo funzionerà anche nelle versioni precedenti di Vim. – Sameer

+1

È anche piacevole usare 'FocusGained, CursorHold' invece di solo' CursorHold' per assicurarsi che il buffer venga aggiornato immediatamente dopo averlo nuovamente focalizzato. – Torben

0

da questa answer (riferendosi ad una risposta da PhanHaiQuang e un commento di flukus)

Uno può eseguire questo oneliner da ex (whithin vim) quando necessario (o mettere ogni comando in vimrc, per quando log-files sono aperti)

:set autoread | au CursorHold * checktime | call feedkeys("lh")

Spiegazione:
- AutoRead: legge il file quando ha cambiato dall'esterno (ma non lavorare da solo, non v'è alcun timer interno o qualcosa di simile Sarà sola lettura. il file quando vim esegue un'azione, come un comando in ex :!
- CursorHold * tempo di controllo: quando il cursore non viene spostato dall'utente per il tempo specificato in 'updatetime' (che è di 4000 millisecondi per impostazione predefinita) orario di controllo viene eseguito, che controlla le modifiche da fuori del file
- chiamata feedkeys ("lh"): il cursore viene spostato una volta, a destra e indietro a sinistra. e quindi non succede nulla (... il che significa che CursorHold viene attivato, il che significa che abbiamo un ciclo )

Problemi correlati