Bagaimana saya membuat Vim bersikap seperti "tail -f"?


36

Saya ingin tahu apakah ada cara untuk membuat Vim berperilaku seperti tail -f.
Bahkan plugin Vim terbaik yang saya temukan sejauh ini tidak melakukan apa yang saya harapkan.

Saya benar-benar ingin melihat pembaruan file secara real-time . Bahkan saya jauh dari keyboard, saya ingin Vim terus-menerus memuat ulang buffer dan melompat ke baris terakhir.

Bagaimana cara melakukannya?
(Saya tidak ingin memuat ulang seluruh file, karena beberapa file log sangat besar. Yang terbaik adalah hanya memuat baris terakhir, seperti tail -fhalnya.)


2
Mengapa harus ada di dalam vim? Ada apa dengan ini tail -f?
Sven

1
Karena saya ingin kekuatan vim ketika saya membaca file log. Seperti bisa mencari pola, dan terutama menikmati penyorotan sintaksis. Saya membuat penyorotan sintaks saya sendiri untuk beberapa file log (bind, apache, dll.).

Anda bisa tertarik dengan autoread dan FileChangedShell >: help autoread>: help FileChangedShell
gsi-frank

2
Untuk hanya mencari, Anda bisa melakukan less +Fbukan tail -f. Tidak memberi Anda sorotan sintaks.
Dennis Kaarsemaker

Jawaban:


28

Anda tidak bisa vimbersikap seperti itu tail -f. Anda dapat lessberperilaku seperti kombinasi vimdan tail -folah.

Maju selamanya (ikuti) mode

lessmemiliki mode penerusan selamanya yang dapat Anda masuki dengan menekan Fatau meneruskannya +Fsebagai argumen.

$ less +F

Dalam mode ini, lessberperilaku seperti tail -fitu tidak berhenti membaca ketika mencapai akhir file. Terus-menerus diperbarui dengan data baru dari file. Untuk keluar dari mode ini, tekan Ctrlc.

Penyorotan sintaksis

lessmendukung pemfilteran otomatis dari data yang dibacanya. Ada program yang disebut source-highlight yang dapat melakukan penyorotan kode sumber dasar. Muncul dengan skrip yang berfungsi dengan baik less. Untuk menggunakannya, cukup atur LESSOPENvariabel lingkungan dengan tepat.

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

Anda juga harus memberitahu lessuntuk lulus urutan melarikan diri terminal mentah (ini memberitahu terminal Anda bagaimana cara mewarnai teks) dengan memberikannya -Rbendera. Anda dapat mengatakan lessuntuk berpura-pura bahwa itu selalu dilewati -Rdengan menetapkan LESSvariabel lingkungan.

 export LESS=' -R '

Kapan lesstidak cukup

Meskipun lessmemiliki keybindings vi-seperti, itu tidak sama dengan Vim. Terkadang terasa asing dan tidak memiliki fitur penting seperti integrasi ctags dan kemampuan untuk mengedit teks.

Anda dapat melakukan lesspanggilan Vim (dengan asumsi EDITOR=vim) pada file yang sedang dilihatnya dengan menekan v. lessbahkan akan meletakkan kursor Anda di lokasi yang benar di dalam Vim. Ketika Anda keluar dari Vim, Anda akan menemukan diri Anda kembali less. Jika Anda membuat perubahan pada file saat Anda berada di Vim, mereka akan tercermin dalam less.


5
vim --servername TAIL_VIM /tmp/somefile

Sekarang, di shell lain (seperti bash), Anda dapat melakukan:

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

Di mana <C -> <CN> memaksa vim untuk pergi ke mode normal, "edit!" memberitahu vim untuk memuat ulang file saat ini (CR mensimulasikan menekan enter), dan G pergi ke bagian bawah file. Menghapus (G) membuatnya lebih mudah untuk menginstal file saat input masuk.


Saya melihat param "--servername" pada pria itu, namun saya mendapat pesan kesalahan berikut: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

jika Anda melakukan vim --versi apakah Anda melihat + clienterver (bukan -clientserver, dengan tanda hubung)? Jika tidak, banyak orang mengkompilasi vim dari sumber menggunakan ./configure --with-features = huge
crutux

Ya, ada + klien. Saya memiliki versi Ubuntu.
Fox

1

Saya menemukan jawabannya berkat komentar Evan Teitelman . Solusi saya terinspirasi dari /usr/share/vim/vimcurrent/macros/less.vim .

Saya membuat fungsi saya sendiri, tetapi itu bisa ditingkatkan banyak.

function! Tailf()
    e
    normal G
    redraw

    sleep 1
    call Tailf()
endfunction

Dan tekan saja CTRL + C untuk keluar dari Tailf.

Untuk membuka file log dalam mode Tailf: view -M "+call Tailf()" /path/to/logfile.log

Yang tidak saya sukai, adalah sleeppanggilan, yang tidak memungkinkan untuk melakukan apa pun di vim selama penyegaran otomatis. Yang terbaik adalah jika buffer otonom dan memperbarui bahkan jika saya berada di jendela lain. Bagaimanapun, ini awal yang baik. :)


2
Sepertinya itu juga membaca ulang seluruh file, yang bukan yang Anda inginkan, kan?
Bernhard

Ini memuat ulang seluruh file. Mungkin tidak akan terlalu sulit untuk membuat plugin berdasarkan inotifywait dan :readmenunggu sampai file telah dimodifikasi dan jika sudah ditambahkan, membaca di baris di bagian bawah file.

Ya, itu benar, memuat ulang seluruh file, jadi ini harus banyak diperbaiki. Ketika saya mengatakan bahwa saya menginginkan ini, saya lebih banyak berbicara tentang hasilnya (apa yang Anda lihat di layar: vim yang memperbarui file Anda sendiri dan tetap di baris terakhir). Sayangnya saya tidak memiliki cukup pengetahuan vim untuk membuat plugin yang bagus ...
Fox

@EvanTeitelman OK, saya melihat cara menggunakan inotifywait sekarang. Saya bisa tahu kapan file berubah. Tetapi bagaimana cara mengetahui apakah telah ditambahkan (tidak sepenuhnya dimodifikasi), dan bagaimana cara mengetahui berapa banyak baris baru telah ditambahkan?
Fox

Baca jumlah baris dalam file setiap kali file berubah. Jika jumlah baris meningkat, baca perubahannya.

1

Metode non rekursif untuk hal yang sama:

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

Saya suka pendek dan tanpa banyak peretasan. Anda dapat menjalankan oneliner ini dari ex (whithin vim) saat dibutuhkan (atau letakkan setiap perintah di vimrc, untuk saat file log dibuka.)

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

(jika Anda ingin melompat (hampir) ke akhir file, cukup gunakan "G" daripada "lh" dengan feedkey)

Penjelasan:

  • autoread: membaca file ketika diubah dari luar (tetapi tidak bekerja sendiri, tidak ada timer internal atau sesuatu seperti itu. Ini hanya akan membaca file ketika vim melakukan suatu tindakan, seperti perintah dalam ex :!
  • CursorHold * checktime: ketika kursor tidak dipindahkan oleh pengguna untuk waktu yang ditentukan dalam updatetime(yang 4000 milidetik secara default) checktimedieksekusi, yang memeriksa perubahan dari luar file
  • call feedkeys("lh"): kursor dipindahkan satu kali, kanan dan kiri belakang. dan kemudian tidak ada yang terjadi (... yang berarti, yang CursorHolddipicu, yang berarti kita memiliki loop )

Untuk menghentikan pengguliran saat menggunakan call feedkeys("G"), jalankan :set noautoread- sekarang vim akan memberi tahu, bahwa file telah diubah dan tanyakan apakah seseorang ingin membaca perubahan atau tidak)

Saya suka ide untuk menonton file log dalam vim (bukan tail -f), misalnya ketika Anda bekerja dalam sesi ssh tanpa layar / tmux. Selain itu Anda dapat menyalin langsung dari file log, jika perlu, atau menyimpan output secara langsung atau ... apa pun yang dapat Anda lakukan dengan vim :)

* dari jawaban ini (merujuk pada jawaban oleh PhanHaiQuang dan komentar oleh flukus )


0

Sunting: Saya minta maaf, sepenuhnya dilewati karena Anda sudah mencoba ini.

Anda dapat mencoba menggunakan plugin Tail Bundle , saya pikir itu harus melakukan apa yang Anda cari.

Untuk menginstal, buka tail-3.0.vba dengan vim dan jalankan:

:so %

Mulai ulang dan Anda harus dapat mengekstrak file dari dalam vim seperti:

:Tail /path/to/file

0

HANYA Untuk VIM 8.0+ mereka memperkenalkan timer, sehingga Anda dapat menggunakan timer untuk mensimulasikan fungsi ekor, ini bekerja cukup efektif dalam pengalaman saya.

Saya telah memetakan tombol F6 untuk menghidupkan ekor dan F7 untuk mematikan ekor, Anda dapat menyesuaikan yang ada di perintah di bawah ini, juga lihat bagian saya di bawah ini untuk KATA-KATA PERHATIAN.

Jalankan yang berikut ini

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>

Anda juga dapat menjadikan perintah di atas sebagai bagian dari vimrc sehingga Anda selalu memilikinya.

Beberapa kata peringatan:

  • Saya berasumsi Anda tidak memiliki penghitung waktu lain, jadi timer_stopall () akan secara efektif menghentikan semua penghitung waktu. Anda dapat memodifikasi ini sedikit lebih jauh untuk mendapatkan ID selama timer_start dan kemudian menahannya, dll tapi itu sepertinya sedikit bekerja untuk saya dan saya berasumsi kebanyakan orang tidak akan menggunakan timer.
  • ketika sedang dalam mode ekor, saya akan sangat menyarankan Anda untuk tidak mencoba menjalankan perintah, itu biasanya crash contoh vim, jadi TOLONG MATI TAIL (F7) sebelum Anda memutuskan untuk kembali ke mode pengeditan, ini SANGAT HANYA HANYA UNTUK MELIHAT LOG.

-1

Dari dalam Vim, jalankan:

!tail -f 

Itu akan menangguhkan Vim sementara anak bercabang dieksekusi tail -fpada buffer saat ini. Menekan akan Ctrl-Cmengembalikan Anda ke buffer di Vim.


1
Itu bukan vim, tapi jelas tailmelakukan pekerjaan. Vim portable. Ini bukan.
oligofren
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.