Vim'in “tail -f” gibi davranmasını nasıl sağlayabilirim?


36

Vim gibi davranmak için bir yol olup olmadığını bilmek istiyorum tail -f. Şimdiye kadar bulduğum
en iyi Vim eklentisi bile beklediğim şeyi yapmıyor.

Dosya güncellemesini gerçek zamanlı olarak görmek istiyorum . Klavyeden uzak olsam bile, Vim'in arabelleği sürekli olarak yeniden doldurmasını ve son satıra atlamasını istiyorum.

Bu nasıl yapılır?
(Bazı günlük dosyaları çok büyük olduğu için tüm dosyayı yeniden yüklemek istemiyorum. En iyisi, yalnızca olduğu gibi son satırları yüklemek tail -f.)


2
Neden içinde olmalı vim? Neyin var tail -f?
Sven,

1
Çünkü logfiles okurken vim gücünü istiyorum. Desen aramak gibi olmak ve özellikle sözdizimi vurgulamanın tadını çıkarmak gibi. Bazı günlük dosyaları (ciltleme, apache, vb.) İçin kendi sözdizimi yazdım.

Sen ilgilenen olabilir AutoRead ve FileChangedShell >: help otomatik okuma>: Yardım FileChangedShell
gsi-frank

2
Sadece arama için, less +Fyerine yapabilirsin tail -f. Yine de vurgulayarak sözdizimi vermez.
Dennis Kaarsemaker

Yanıtlar:


28

Gibi vimdavranamazsın tail -f. Sen yapabilir lessbir kombinasyonu gibi davranacaksan vimve tail -fgerçi.

Sonsuza kadar ileri (takip et) modu

lesssonsuza dek, moda basarak Fveya basılarak +Fargüman olarak geçerek iletebileceğiniz ileri bir moda sahiptir .

$ less +F

Bu modda, bir dosyanın sonuna ulaştığında okumayı bırakmadığı lessgibi davranır tail -f. Dosyadaki yeni verilerle sürekli yenilenir. Bu moddan çıkmak için tuşuna basın Ctrlc.

Sözdizimi vurgulama

lessOkuduğu verilerin otomatik olarak filtrelenmesini destekler. Temel kaynak kodunu vurgulamayı gerçekleştirebilen source-highlight adlı bir program var . İyi çalışan bir senaryo ile birlikte gelir less. Kullanmak için, sadece LESSOPENçevre değişkenini uygun şekilde ayarlayın.

 export LESSOPEN="| /path/to/src-hilite-lesspipe.sh %s"

Ayrıca lessham terminal kaçış dizilerini (bunlar terminalinize metnin nasıl renklendirileceğini söyler) -Rbayrağını geçirerek geçmeniz gerektiğini söylemelisiniz . Çevresel değişkeni ayarlayarak bayrağın lessbayıldığını her zaman söyleyebilirsiniz .-RLESS

 export LESS=' -R '

Ne zaman lessyeterli değil

Her ne lesskadar vi-benzeri tuş takmalara sahip olsa da, sadece Vim ile aynı değil. Bazen yabancı hissediyor ve ctags entegrasyonu ve metin düzenleme yeteneği gibi önemli özelliklerden yoksun.

Şu anda görüntülemekte olduğu dosyada lessVim (varsayım EDITOR=vim) çağrısı yaparak tuşuna basabilirsiniz v. lessimlecinizi Vim içinde doğru yere bile koyacaktır. Vim'den çıktığınızda, kendinizi geri bulacaksınız less. Vim'deyken dosyada herhangi bir değişiklik yaptıysanız, bunlar yansıtılacaktır less.


5
vim --servername TAIL_VIM /tmp/somefile

Şimdi, başka bir kabukta (bash gibi) şunları yapabilirsiniz:

while true
do
    inotifywait --event modify /tmp/somefile \
    && vim --servername TAIL_VIM --remote-send '<C-\><C-N>:edit!<CR>G';
done

<C -> <CN> vim'i normal moda gitmeye zorladığında, "düzenle!" vim'e geçerli dosyayı yeniden yüklemesini söyler (CR, enter'a basmayı simüle eder) ve G, dosyanın altına gider. (G) 'nin çıkartılması, giriş yapılırken dosyanın çıkarılmasını kolaylaştırır.


Adamda "- sunucuadı" paragrafını görüyorum, ancak şu hata mesajını alıyorum:VIM - Vi IMproved 7.3 (2010 Aug 15, compiled Feb 10 2013 02:28:47) Option inconnue: "--servername=toto" Plus d'info avec: "vim -h"
Fox

vim --version yaparsanız görüyorsunuz + clienterver (değil -clientserver)
Olmazsa

Evet, + müşteri sunucusu var. Ubuntu versiyonuna sahibim.
Fox,

1

Cevapları Evan Teitelman'in yorumuna teşekkürler . Benim çözümüm /usr/share/vim/vimcurrent/macros/less.vim'den ilham alıyor .

Kendi fonksiyonumu kendim yaptım, fakat çok daha iyi olabilirdi.

function! Tailf()
    e
    normal G
    redraw

    sleep 1
    call Tailf()
endfunction

Ve sadece Tailf'den çıkmak için CTRL + C tuşlarına basın.

Tailf modunda bir günlük dosyasını açmak için: view -M "+call Tailf()" /path/to/logfile.log

Ne sevmiyorum olduğunu sleepotomatik yenileme sırasında vim bir şey yapmak izin vermez çağrı. En iyisi arabellek özerkse ve başka bir bölünmüş pencerede olsam bile güncellenir. Neyse, bu iyi bir başlangıç. :)


2
Görünüşe göre aynı zamanda tüm dosyayı da okuyor, ki istediğin bu değildi, değil mi?
Bernhard

Bu, tüm dosyayı yeniden yükler. İnotifywait'e dayanan bir eklenti yapmak çok zor olmayacak ve :readbir dosya değiştirilinceye ve eğer eklendiyse , dosyanın altındaki satırlarda okunacak olana kadar beklemeniz zor olmayacaktır .

Evet, doğru, tüm dosyayı yeniden yüklüyor, bu yüzden bunun çok daha iyi olması gerekiyor. Bunu istediğimi söylediğimde, sonuçtan daha çok söz ediyorum (ekranda ne görüyorsun: dosyanızı tek başına güncelleyen ve son satırda kalan bir vim). Ne yazık ki güzel bir eklenti yapmak için yeterli bilgim yok ...
Fox

@EvanTeitelman Tamam, şimdi inotifywait'i nasıl kullanacağımı görüyorum. Dosya ne zaman değiştiğini bilirim. Ancak eklenip eklenmediğini (tamamen değiştirilmemiş) ve nasıl yeni satırların eklendiğini nasıl bilebiliriz?
Fox,

Dosya her değiştiğinde dosyadaki satır sayısını okuyun. Satır sayısı artarsa, değişiklikleri okuyun.

1

Aynı için özyinelemeli olmayan bir yöntem:

cmap tailf<CR> call Tailf()<CR>
         function! Tailf()
    "Press C-c to stop tailing
        while 1
            e                                  
            normal G
            redraw
            sleep 1
        endwhile
    endfunction

1

Kısa ve çok kesmeksizin hoşuma gidiyor. Gerektiğinde bu oneliner'i ex'ten (vim içinde) çalıştırabilirsiniz (veya her bir komutu vimrc'ye, günlük dosyaları açıldığında koyabilirsiniz).

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

(dosyanın sonuna atlamak için (neredeyse), feedkey'lerle "lh" yerine "G" kullanın.)

Açıklama:

  • autoread: dışarıdan değiştiğinde dosyayı okur (ancak kendi başına çalışmaz, dahili bir zamanlayıcı ya da benzeri bir şey yoktur. :!
  • CursorHold * checktime: imleç kullanıcı tarafından belirtilen süre boyunca hareket etmediğinde updatetime(varsayılan olarak 4000 milisaniye olan) checktimedosyanın dışından yapılan değişiklikleri kontrol eder.
  • call feedkeys("lh"): imleç bir kez sağa ve sola hareket ettirilir. ve sonra hiçbir şey olmuyor (... yani CursorHoldbu tetikleniyor, yani bir döngümüz var )

Kullanırken kaydırmayı durdurmak için call feedkeys("G"), yürüt :set noautoread- şimdi vim, dosyanın değiştiğini ve birisinin değişiklikleri okumak isteyip istemediğini sorar.

Logfiles'i vim'de (tail -f yerine) izlemek fikrini seviyorum, örneğin screen / tmux'suz bir ssh oturumunda çalışırken. Ek olarak, gerekirse doğrudan günlük dosyasından kopyalayabilir veya çıktıyı doğrudan kaydedebilirsiniz veya ... vim ile ne yapabilirseniz yapın :)

* bu cevaptan ( PhanHaiQuang'ın bir cevabına ve flukus'un bir yorumuna atıfta bulunarak )


0

Düzenleme: Özür dilerim, bunu zaten denediğiniz için tamamen atladım.

Tail Bundle eklentisini kullanmayı deneyebilirsiniz , aradığınızı yapması gerektiğini düşünüyorum.

Kurmak için, tail-3.0.vba dosyasını vim ile açın ve çalıştırın:

:so %

Yeniden başlatın ve böyle bir dosyayı vim içinden yerleştirebilmelisiniz:

:Tail /path/to/file

0

SADECE VIM 8.0+ için zamanlayıcıları kullandılar, bu nedenle kuyruk fonksiyonunu simüle etmek için bir zamanlayıcı kullanabilirsiniz, bu benim deneyimimde oldukça etkilidir.

Kuyruğu açmak için F6 tuşunu ve kuyruğu kapatmak için F7 tuşlarını eşledim, aşağıdaki komutlarda bunları özelleştirebilirsiniz, ayrıca aşağıdaki DİKKATLER bölümüne bakın.

Aşağıdakileri çalıştırın

exe ":function! Tail(timer) \n :exe 'normal :e!\<ENTER>G' \n endfunction"
map <F6> :exe timer_start(2000, 'Tail', {'repeat':-1})<CR> 
map <F7> :exe timer_stopall()<CR>

Ayrıca yukarıdaki komutları vimrc'nin bir parçası haline getirebilir, böylece her zaman yanınızda bulundurursunuz.

Dikkatli bazı kelimeler:

  • Başka zamanlayıcılar olmadığını varsayalım, bu yüzden timer_stopall () aslında tüm zamanlayıcıları etkili bir şekilde durduracaktır. Timer_start sırasında kimliği elde etmek ve daha sonra tutmak, vb. İçin biraz daha değişiklik yapabilirsiniz, fakat bu bana biraz iş gibi geldi ve çoğu insanın zamanlayıcı kullanmayacağını varsaydım.
  • kuyruk modundayken, herhangi bir komut çalıştırmayı denememenizi şiddetle tavsiye ederim, genellikle vim örneklerini çöker, bu nedenle düzenleme moduna geri dönmeye karar vermeden önce TAIL KAPALI (LÜTFEN KAPATIN (F7)) LÜTFEN Günlükleri görüntülemek için.

-1

Vim içinden, yürütmek:

!tail -f 

Bu, çatallı çocuk tail -fmevcut tampon üzerinde yürütülürken Vim'i askıya alır . Vurmak Ctrl-C, Vim'deki arabelleğe geri döner.


1
Bu vim değil, sade tailişi yapıyor. Vim taşınabilir. Bu değil.
oligofren
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.