Bir dosyayı VIM'de diskte değiştiğinde otomatik olarak yeniden yükleme


33

Bir dosyanın VIM arabelleğinde kaydedilmemiş değişiklikler olmadığını varsayarak, dosya diskte değişirse otomatik olarak yeniden yüklenmesini istiyorum. Bunun için en sık kullanılan durum, dosyanın bulunduğu çalışma kopyasını güncellememdir.

Bunu nasıl başarabilirim?


Sanırım demek istediğin bu, ancak benim özel kullanım durumum, farklı bir git şubesine göz attığımda veya işlediğimde, vim'in dosyayı yeniden yüklemesini istiyorum.
Nathan Long,

Yanıtlar:


32

İçinde ~/.vimrc:

set autoread

9
Genellikle autoreadsadece harici bir komut çalıştırdıktan sonra tetiklenir. Bu cevap çözümleri detaylandırır.
Tom Hale,

Bu işe yaramıyor Ayrıntılı bir cevap için @TomHale bağlantısını izleyin
JonnyRaa

11

Bu benim için çalıştı

set autoread                                                                                                                                                                                    
au CursorHold * checktime  

İlk satır kendi başına yeterli değildi. İçine koyabilirsin.vimrc

Phan Hai Quang'a teşekkür


Autocmd gerekli olmamalıdır - kontrol zamanının CursorHold olayının tetiklendiği sırada dahili olarak çalışması gerekiyordu. Başka bir deyişle, Vim'e ikinci bir kontrol saati yaptırmasını sağlıyorsunuz.
Heptit,

Benim için bu gerekli. Birçok araştırmadan sonra bulduğum en iyi çözüm. @Heptite, iddialarınız için bölümünüz ve ayetiniz var mı?
Tom Hale,

1
@TomHale Vim belgelerini gözden geçirdim ve söyleyebileceğim kadarıyla açıkça söylemiyor, ancak " :help timestamp" hatalı olduğumu ve "Vim'in yalnızca belirli olayları kontrol ettiğine işaret ediyor" gibi görünüyor. bu yüzden autocmd daha sık kontrol etmesini sağlamak için gerekli olabilir.
Heptit 16

5

Autoread düzgün çalışmıyor. Aşağıdaki benim için çalışıyor:

Önce betiği buradan yüklemeniz gerekir .

Doğrudan kurulum işlevini çağırarak en iyi sonucu aldım.

let autoreadargs={'autoread':1} 
execute WatchForChanges("*",autoreadargs) 

Bunun nedeni, bir ipython / screen / vim kurulumunu çalıştırmak istememdir.

Bunu kolayca gelişmiş bir görünüm sürümüne dönüştürebilirsiniz.

işlem komut dosyası ..

mkdir -p ~/bin
cat <<`OUT` > ~/bin/vimviewer
#!/usr/bin/env sh
exec vim -n --cmd "source /home/bryan/.vim/.vimrc.watchforchanges | let autoreadargs={'autoread':1} | execute WatchForChanges('*',autoreadargs)" $@
`OUT`

chmod 755 ~/bin/vimviewer
vimview test.txt

1
GVim veya MacVim gibi vim GUI'lerinden birini kullanıyorsanız, autoread komutu ortamın geri kalanıyla iyi bütünleşir. Örneğin, dosyayı başka bir programda, başka bir düzenleyicide veya kaynak kontrolünden düzenlemek, sonra tekrar vim'e çevirmek güncellenmiş dosyaları otomatik olarak okuyacaktır. Problem vim'in terminal versiyonunun nasıl bütünleştiği gibi görünüyor. Terminal sürümü, GUI'deki programlar arasında veya tmux gibi terminal çoklayıcıları kullanırken ne zaman geçiş yapacağınızı söyleyemez, bu nedenle ilgili zamanlarda otomatik olarak okumaz. Vim sadece ilgili dosya sistemi olaylarına abone olsaydı iyi olurdu.
oyun5353

3

vim-autoread eklentisi şu ana kadar benim için çalıştı:

vim-otomatik okuma

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 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.


Bu bağlantı soruyu cevaplayabilse de, cevabın temel kısımlarını buraya eklemek ve referans için bağlantıyı sağlamak daha iyidir. Bağlantılı sayfa değişirse, yalnızca bağlantı yanıtları geçersiz olabilir. - Şu kaynaktan
Burgi

@Burgi Sorunu nasıl çözdüğünü açıklayan bir eklenti açıklaması ekledim.
Wojtek Kruszewski

Denedim ama jetkili güncellemeyi görmek için bir gezinme komutu (benzeri ) yazmam gerekiyor. Burada bununla
Martin Delille

3

bu cevaptan ( PhanHaiQuang tarafından yazılan bir cevaba ve @flukus'un bir yorumuna)

Biri gerektiğinde bu oneliner'i ex'ten (vim içinde) çalıştırabilir (veya her komutu log-dosyaları açıldığında vimrc'ye koyabilirsiniz).

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

Açıklama:
- otomatik okuma : hayır iç zamanlayıcı ya da böyle bir şey yoktur, dışarıdan değişti dosyasını okur (ama kendi başına doesnt iş sadece vim eski bir komutla gibi bir eylem yapar dosyayı okuyacak. :!
- İmleçHold * kontrol süresi : imleç kullanıcı tarafından 'updatetime' da (varsayılan olarak 4000 milisaniye olan) belirtilen süre boyunca hareket etmediğinde, dosyanın dışından yapılan değişiklikleri denetleyen kontrol süresi yürütülür
- çağrı besleme tuşları ("lh") : imleç bir kez sağa ve sola hareket eder ve sonra hiçbir şey olmaz (... bu, CursorHold'un tetiklendiği anlamına gelir, yani bir döngü var demektir )


lhHiçbir şey yapmaz, imleç satırdaki son pozisyondaysa konumunu lhdeğiştirir.
Mahmoud Al-

Kesinlikle, bu nokta. Dosya, minimum etkileşim veya dosyada yapılan değişikliklerle yeniden yüklenir. İsterseniz son veya ilk satıra atlayabilirsiniz (sadece lh yerine gg veya G ile değiştirin), ancak buradaki amaç sadece dosyayı vim olarak yeniden yüklemek ve bu tek astarla yapılan şey, başka bir şey değil. Burada ne yapılmasını seviyorsun?
eli

@ MahmoudAl-Qudsi ... yani "lh" sadece CursorHold eylemini tetikler - eylemde (Açıklamada bahsetmiştim), ki daha sonra autoread'i tetikler
eli

1

Listelenen bazı eklentileri vardır burada kudreti çalışma Vim sürümüne bağlı olduğunu.

Başka bir yaklaşım, periyodik olarak checktimeharici bir işlemden atmak için komutu göndermek . İşte bunu yapmak için bir ShellJS betiği var (gerektirir shelljs-plugin-sleep, NeoVim ve nvr)

while (true) {
  sleep(15);
  var servernames = exec('nvr --serverlist').trim().split('\n');
  if (!servernames.length || !servernames[0]) {
    continue;
  }
  servernames.forEach(
    (sn) => exec(`nvr -c "checktime" --servername ${sn}`) );
}
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.