vi (m) 'de açılan dosyanın değiştirilmiş içeriğini yenile


362

Vim'de açık tuttuğum bir yapılandırma dosyasına sahibim, ancak bazen bu değişiklikler terminale yansıtılmadan diskte değişiyor. Dosyayı kapatıp yeniden açmadan ekrandaki içeriği yenileyebilir miyim? Öyleyse nasıl?



Sarın: Şimdiye kadarki tüm cevaplar "Push" tarzı yerine "Anket" tir. Diğer bir deyişle, diğer yazılımların benzer özellikleri tarafından yapıldığı gibi harici bir dosya değişikliği olayı almak yerine, bu cevaplar manuel olarak veya bir kullanıcı eylemi veya bir zamanlayıcı tarafından tetiklenen dosya değişikliğini aktif olarak yoklayan vim'e dayanmaktadır. Sonuçta ekranda anında bir değişiklik değişmeyecek.
Penghe Geng

Yanıtlar:


464

:editGeçerli dosyayı yeniden yüklemek için bir dosya adı belirtmeden komutu kullanabilirsiniz . Dosyada değişiklikler yaptıysanız :edit!, geçerli dosyanın yeniden yüklenmesini zorlamak için kullanabilirsiniz (değişikliklerinizi kaybedersiniz).

Komut :editile kısaltılabilir :e. Kuvvet düzenleme böylece yapılabilir:e!


2
"!" Beni kandırıyordu ama şimdi belli.
twan163

107
Not: Bu genellikle kısaltılır :e!.
Stéphane Chazelas 08

31
@StephaneChazelas: Bunun yerine: Evet, bu doğru :) @ twan163 var :editve :edit!kullanabileceğiniz :eve :e!sırasıyla.
Thushi

11
Değişiklikleri kaybet, evet ve hayır. En önemlisi, hala ubaşaramazsın :e!.
gerrit

5
Ayrıca, tüm tamponlarınızı yeniden yüklemek istiyorsanız, şunu çalıştırın::bufdo e
pkout

193

Dosyayı el ile yenilemenin yanı sıra :edit,~/.vimrc

:set autoread

Vim'in Vim tarafından düzenlenmemiş dosyaları otomatik olarak yenilemesini sağlamak için. Ayrıca bkz :checktime.


2
Alıcı dikkatli olun - Yeni kod üzerinde çalışıyorsanız ve git pullekranda kaydedilmemiş değişikliklerinizi istemeden kaybedebilirsiniz.
azatar

5
@toszter Hayır, Vim yalnızca değişmeyen arabellekleri yenileyecektir . Değişiklik durumunda, hala bir sorgu olacak: Tutmak veya yüklemek?
Ingo Karkat

10
NB autoread tam olarak otomatik olarak çalışmıyor . gvimHarici komutları kullanmanız veya çalıştırmanız gerekir.
Sparhawk

3
Tmux içinde vim kullananlar github.com/tmux-plugins/vim-tmux-focus-events kullanarak odak olaylarına erişebilirler . Aksi takdirde, autoread bir şekilde aramadığınız sürece terminale yardımcı olmaz:checktime
Karl Bartel

3
autoreadİmleç hareketi durduktan X saniye sonra otomatik olarak tetiklenebilir, bu cevaba bakınız .
Tom Hale,

57

TL; DR

Hayatınızı daha iyi hale getirmek için eklenecek satırların Wrap-upbaşlığına atlayın vimrc.

el ile

Çalıştırmak :checktime

Tamponun Vim dışında değiştirilip değiştirilmediğini kontrol edin. Bir dosyanın iki sürümüyle sonuçlanırsa bu sizi kontrol eder ve uyarır.

Otomatik olarak

Değişiklikleri otomatik olarak yüklemek için şunu ekleyin vimrc:

set autoread

Bir dosyanın Vim dışında değiştirildiği ve Vim'in içinde değiştirilmediği tespit edildiğinde, otomatik olarak tekrar okuyun. Dosya silindiğinde bu yapılmaz.

Bu cevap bir uyarı ekler:

Harici komutu çalıştır ( !lsveya !shbenzeri) gibi bir şey yapmazsanız, Autoread dosyayı yeniden yüklemez

Çözümler için okumaya devam edin.

İmleç hareket etmeyi durdurduğunda tetik

Şuna ekle vimrc:

au CursorHold,CursorHoldI * checktime

Varsayılan olarak, CursorHold imleç 4 saniye boyunca hareketsiz kalır ve üzeri yapılandırılabilir sonra tetiklenir updatetime .

Tampon değişimi veya terminal odağını tetikleyin

Tamponu vim içindeyken değiştirirken vimrctetiklemek için aşağıdakini ekleyin :autoread

au FocusGained,BufEnter * :checktime

Düz vim içinde terminal pencere odağını yakalamak

Sahip olmak FocusGainedyüklemek eklentisi bir terminal emülatörü (Xterm, tmux, vs) içindeki düz vim çalışmalarını (yukarıya bakınız): vim-tmux odaklama-olayları

Tmux> 1.9 sürümlerinde, şunu eklemeniz gerekir .tmux.conf:

set -g focus-events on

Sarmak

autoreadTetikleyiciler de mümkün olduğunda bildirimler .

İşte benim olan vimrcher şeyden uygulamak hatları:

" 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

Beni doğru yöne yönlendirdiğiau CursorHold için ErichBSchulz'a teşekkürler .


2
mükemmel yazı! Bunun varsayılan davranış olması gerektiği şeylerden biri gibi geliyor
JonnyRaa
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.