Geçerli dosyayı nasıl yeniden yüklerim?


145

Oldukça sık sürüm kontrolü olan dosyalar üzerinde çalışıyorum, bu yüzden Vim dışında kendilerinde değişiklik yapılması mümkün.

Vim'i kapatıp yeniden açmak zorunda kalmadan dosyayı yeniden yüklemenin hızlı bir yolu nedir? Bunu otomatik olarak yapmanın bir yolu var mı?


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

Eğer vim-faq kurduysanız , orada çevrimdışı bir cevap alabilirsiniz: :h vim-faqve arama /reload. Ezberlemek etiketi zor :h faq-5.8.
Hotschke

Yanıtlar:


172

İstediğiniz komut :e(kısa :edit). Eğer kullanırsanız :edit!o yerel değişiklikleri ve yeniden yüklenmesine kaybolacak.

Bunu vimc'inizde vim ile otomatik olarak da yapabilirsiniz set autoread.


5
Uyarılar ve ilgili çözümler için bu cevaba bakınız autoread.
Tom Hale

4
Bunu tüm tamponlar için yapmak için, :bufdo :eya da:bufdo :e!
Aaron H.

1
@AaronH. Bunun için teşekkür ederim! genellikle bir anda yüzlerce tampon kullanıyorum ve şubeler değiştirilirken genellikle vim'i kapatıp yeni içerikleri olan tüm tamponları yenilemek için yeniden başlatıyorum. Bu büyük bir zaman kazandıracak!
g19fanatic

1
@AaronH. İkincisi :isteğe bağlıdır: :bufdo eaynı şekilde çalışacaktır.
JoL

19

Çoğu durumda, bu cevabın açıkladığı set autoreadgibi çalışmayacaktır :

Eğer harici komutu çalıştır ( !lsveya !shbenzeri) yapmazsanız, Autoread dosyayı yeniden yüklemez.

Odak olayları tetiklenir autoread, ancak kullanmadıkça bunlar yakalanmaz gvim. Bu yüzden, eğer vimbir uçbirim penceresi veya tmux içerisinde düz çalışıyorsa , eklenti vim-tmux-focus-events'u kurun .

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

set -g focus-events on

Daha fazla iyilik için, vim içindeyken tamponları değiştirirken aşağıdakileri vimrctetikleyecektir :autoread

au FocusGained,BufEnter * :checktime

Bu yıllardır beni rahatsız ediyor. Tam bir çözüm için teşekkürler! 💯😄
Nathan Long

9

Mevcut arabelleği değiştiren Vim'den harici bir komut çalıştırdıysanız, diskte değişiklik yapıldığından dosyayı yeniden yüklemenizi istediğini fark etmiş olabilirsiniz. :checktimeKomutu kullanarak bu istemi gerçekten çağırabilirsiniz .


3

Https://github.com/djoshea/vim-autoread geliştirmek için güzel bir eklentiautoread

Otomatik olarak vim'in diske yazılan ancak vim'den son yazılandan bu yana tamponda değiştirilmeyen dosyaları yeniden yüklemesine neden olur. Bu, vim'de açık bir dosyanın başka bir uygulama kullanılarak düzenlenmesini ve kaydedilmesini sağlar. Vim'e geri döndüğünüzde, son değişiklikten bu yana dosyayı değiştirmediyseniz, dosya, otomatik olarak, sanki: e manuel olarak bastığınız gibi yapılan değişiklikleri yansıtacak şekilde güncellenecektir.


Vi Stack Exchange'e hoş geldiniz. Bu neredeyse sadece bir bağlantı cevaptır. Eklentiyi tanımlayarak bunu geliştirebilirsiniz (örneğin ne yapar? OP'nin hedeflerine ulaşmak için onu nasıl kullanırım?)
John O'M.

0

Bir dosyanın içeriğine bakma, dosyayı harici olarak güncelleme, değiştirilen dosyayı görüntüleme ve gerektiğinde bunları düzenleme seçeneğim vardı. Bu cevaptan esinlenerek Vim server / uzak komut satırı seçenekleriyle çözdüm .


Aşağıdaki komutlarla bir dosya harici bir komutla yeniden yüklenebilir. İlk olarak, bir sunucu vakasını başlatırken söz konusu dosyayı Vim ile açın.

vim --servername JABBERWOCKY /tmp/alice.log

Dosyanın harici olarak değiştirildiğini varsayalım, örneğin a echo "Curiouser and curiouser" >> /tmp/alice.log. Gerektiğinde, dosyayı yeniden yüklemek için sunucuya bir komut gönderin. Bu komut çabucak bitecek ve yeni bir editör ortaya çıkmayacak.

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

Açılan dosya Vim'de ve harici olarak değiştirilmişse, yeniden yükleme sırasında bir çakışma olacaktır (bir uyarı mesajı görünecektir). Bu durumda bir karar verilmelidir: Şununla bırakın ve Vim'deki değişiklikleri saklayın veya yerel değişiklikleri atın ve yeniden doldurmaya zorlayın .


Yukarıdaki komutun --remote-sendelle yeniden yüklenmesi gerekir. Bununla birlikte, bu komut basit bir döngüye, Bash'in for/ whilekullanarak veya Linux / Unix'te tek bir liner kullanılarak bağlanabilir:

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

Test edilmemiş olmasına rağmen, PowerShell'de de böyle bir şeyin gerçekleştirilebileceğinden eminim.

Linux / Unix'te , çok çılgın dosya sistemleri kullanmıyorsanız, örneğin inotify kütüphanesini kullanarak dosya sistemi olaylarını dinleyerek olaya dayalı bir yaklaşım gerçekleştirilebilir . Şahsen ben çok büyük Linux dağıtımlarında yer aldığı anlaşılan araç entr , çok seviyorum . Sonra anladım:

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