Come ricaricare il file corrente?


145

Molto spesso sto lavorando con file che sono controllati dalla versione, quindi è possibile che vengano apportati cambiamenti al di fuori di Vim.

Qual è un modo rapido per ricaricare il file senza dover chiudere e riaprire Vim? E c'è un modo per farlo automaticamente?


" Compare buffer with saved version nnoremap gd :DiffSaved<CR>
Tom Hale,

Se hai installato vim-faq , puoi ottenere una risposta offline lì: :h vim-faqe cerca /reload. Il tag difficile da memorizzare è :h faq-5.8.
Hotschke,

Risposte:


172

Il comando che vuoi è :e(abbreviazione di :edit). Se lo usi :edit!, le modifiche locali verranno scaricate e ricaricate.

Puoi anche fare in modo che vim lo faccia automaticamente con set autoreadnel tuo vimrc.


5
Vedi questa risposta per avvertimenti e soluzioni riguardanti autoread.
Tom Hale,

4
Per fare questo per tutti i buffer, utilizzare :bufdo :eo:bufdo :e!
Aaron H.

1
@AaronH. grazie per questo! di solito ho centinaia di buffer aperti alla volta e quando cambio rami, di solito chiudo vim e riavvio per aggiornare tutti i buffer con nuovi contenuti. Questo sarà un grande risparmio di tempo!
g19fanatic

1
@AaronH. Il secondo :è facoltativo: :bufdo efunzionerà allo stesso modo.
JoL

19

In molti casi, set autoreadnon funzionerà poiché questa risposta spiega:

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

Verranno attivati ​​eventi di messa a fuoco autoread, ma questi non vengono acquisiti a meno che non vengano utilizzati gvim. Quindi, se si esegue semplicemente vimall'interno di una finestra terminale o tmux, installare il plug -in vim-tmux-focus-events .

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

set -g focus-events on

Per ulteriore bontà, l'aggiunta di quanto segue vimrcsi attiverà autoreadquando si cambiano i buffer all'interno mentre all'interno di VIM:

au FocusGained,BufEnter * :checktime

Questo mi annoia da anni. Grazie per una soluzione approfondita! 💯😄
Nathan Long,

9

Se hai mai eseguito un comando esterno da Vim che modifica il buffer corrente, potresti aver notato che ti chiede di ricaricare il file poiché sono state apportate modifiche al disco. Puoi effettivamente invocare questo prompt usando il :checktimecomando.


3

Simpatico plugin per migliorare autoread https://github.com/djoshea/vim-autoread

Fa sì che vim ricarichi automaticamente i file che sono stati scritti sul disco ma non modificati nel buffer dall'ultima scrittura da vim. Ciò consente di modificare un file aperto in vim utilizzando un'altra applicazione e salvarlo. Al ritorno su vim, purché non sia stato modificato il file dall'ultima modifica, il file verrà automaticamente aggiornato per riflettere le modifiche apportate sul disco, come se si fosse premuto: e manualmente.


Benvenuti nello scambio di stack Vi. Questa è quasi una risposta solo link. Puoi migliorarlo descrivendo il plugin (ad es. Cosa fa? Come lo
useresti

0

Ho avuto il problema di guardare il contenuto di un file, aggiornare il file esternamente, visualizzare il file modificato e avere la possibilità di modificarlo quando necessario. L'ho risolto con il server Vim / le opzioni della riga di comando remota, ispirato da questa risposta .


Con i seguenti comandi è possibile ricaricare un file tramite un comando esterno. Innanzitutto, apri il file in questione con Vim, mentre avvii un'istanza del server.

vim --servername JABBERWOCKY /tmp/alice.log

Supponiamo che il file sia stato modificato esternamente, ad esempio da a echo "Curiouser and curiouser" >> /tmp/alice.log. Se necessario, inviare un comando all'istanza del server per ricaricare il file. Questo comando finirà rapidamente e non genererà un nuovo editor.

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

Se il file aperto è stato modificato in Vim ed esternamente, si verificherà un conflitto durante il ricaricamento (verrà visualizzato un messaggio di avviso). In tal caso, è necessario prendere una decisione: lasciarlo con quello e conservare le modifiche in Vim, oppure scartare le modifiche locali e forzare una ricarica .


Il comando con --remote-sendsopra richiede il ricaricamento manuale. Tuttavia, quel comando potrebbe essere legato a un semplice ciclo, usando Bash's for/ while, o usando un hacky one-liner in Linux / Unix:

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

Sebbene non sia stato testato, sono certo che qualcosa di simile potrebbe essere realizzato anche in PowerShell.

Su Linux / Unix è possibile realizzare un approccio basato sugli eventi ascoltando gli eventi del file system utilizzando, ad esempio, la libreria inotify , se non si utilizzano file system troppo pazzi. Personalmente mi piace usare molto lo strumento entr , che sembra essere incluso nelle principali distribuzioni Linux. Quindi ottengo:

echo /tmp/alice.log | entr vim --servername JABBERWOCKY --remote-send ":e<CR>"
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.