Vimを「tail -f」のように動作させるにはどうすればよいですか?


36

Vimを次のように動作させる方法があるかどうかを知りたいですtail -f。私がこれまでに見つけ
た最高のVimプラグインでさえ、私が期待することをしません。

私は本当にリアルタイムでファイルの更新を見たいです。キーボードから離れていても、Vimにバッファーを常にリロードさせ、最後の行にジャンプしてほしい。

これを行う方法?
(一部のログファイルは非常に大きいため、ファイル全体を再読み込みしたくありません。最善の方法は、最後の行のみを読み込むtail -fことです。)


2
なぜそれが内側になければならないのvimですか?何が問題なのtail -fですか?
スヴェン

1
ログファイルを読むときにvimの力が欲しいからです。パターンを検索でき、特に構文の強調表示を楽しむことができます。いくつかのログファイル(バインド、Apacheなど)について、独自の構文強調表示を作成しました。

自動読み取りFileChangedShellに興味があるかもしれません>:help autoread>:help FileChangedShell
gsi-フランク

2
単に検索する場合は、less +F代わりに行うことができますtail -f。ただし、構文の強調表示は行いません。
デニスカースメーカー

回答:


28

のようにvim振る舞わせることはできませんtail -f。とのless組み合わせのように動作させることができます。vimtail -f

永遠に進む(フォロー)モード

lessを押すF+F、引数として渡すことで入力できる「永遠に進む」モードがあります。

$ less +F

このモードでlesstail -f、ファイルの終わりに達しても読み取りを停止しないという点で動作します。ファイルの新しいデータで常に更新されます。このモードを終了するには、を押しCtrlcます。

構文の強調表示

less読み取るデータの自動フィルタリングをサポートします。基本的なソースコードの強調表示を実行できるsource-highlightというプログラムがあります。でうまく機能するスクリプトが付属していますless。それを使用するには、LESSOPEN環境変数を適切に設定するだけです。

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

またless-Rフラグを渡すことにより、未加工の端末エスケープシーケンスを渡すように指示する必要があります(これらは端末にテキストの色を付ける方法を指示します)。環境変数を設定lessすることで、常に-Rフラグが渡されるように見せることができLESSます。

 export LESS=' -R '

less十分ではないとき

が、lessviのようなキーバインドを持っている、それだけでVimのと同じではありません。時々異質に感じられ、ctags統合やテキスト編集機能などの重要な機能が欠けています。

を押すと、現在表示しているファイルに対してlessVim を呼び出すことができます(仮定EDITOR=vimvlessカーソルをVim内の正しい場所に置くこともできます。Vimを終了すると、に戻りlessます。Vimでファイルに変更を加えた場合、変更はに反映されlessます。


5
vim --servername TAIL_VIM /tmp/somefile

これで、別のシェル(bashなど)で次のことができます。

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

<C-> <CN>がvimを通常モードに強制する場合、「編集!」vimに現在のファイルをリロードするように指示し(CRはEnterキーを押すことをシミュレートします)、Gはファイルの最後に移動します。(G)を削除すると、入力が入っているときにファイルを簡単に削除できます。


:私は「--servernameは」男に、しかし、私はエラーメッセージを以下しまったのparamを参照してください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"
フォックス

vim --versionを実行すると、+ clientserver(-clientserverではなく、ハイペンが表示されます)が表示されますか?そうでない場合、多くの人が./configure --with-features = hugeを使用してソースからvimをコンパイルします
crutux 14

はい、+ clientserverがあります。Ubuntuバージョンを持っています。
フォックス14

1

Evan Teitelmanのコメントのおかげで答えを見つけました。私のソリューションは/usr/share/vim/vimcurrent/macros/less.vimからインスピレーションを受けています

独自の機能を作成しましたが、大幅に改善される可能性があります。

function! Tailf()
    e
    normal G
    redraw

    sleep 1
    call Tailf()
endfunction

そして、CTRL + Cを押してTailfを終了します。

Tailfモードでログファイルを開くには: view -M "+call Tailf()" /path/to/logfile.log

私が気に入らないのはsleep、自動更新中にvimで何もできないコールです。バッファが自律的で、別の分割ウィンドウにいても更新できる場合が最善です。とにかく、良いスタートです。:)


2
また、ファイル全体を再読み取りするように見えますが、これはあなたが望んでいたものではありませんか?
ベルンハルト

これにより、ファイル全体がリロードされます。inotifywaitに基づいてプラグインを作成するのはそれほど難しくないでしょう。:readファイルが変更されるまで待機し、ファイルが追加されている場合はファイルの最後の行を読み取ります。

はい、本当です。ファイル全体をリロードするため、これを大幅に改善する必要があります。これが欲しいと言うとき、結果についてもっと話します(画面に表示されるもの:ファイルを単独で更新し、最後の行に留まるvim)。残念ながら、私は...素敵なプラグインを作るのに十分なVimの知識を持っていない
フォックス

@EvanTeitelman OK、inotifywaitの使用方法がわかりました。ファイルが変更されるたびに知ることができます。しかし、それが追加されたかどうか(完全に変更されていない)、および追加された新しい行の数を知る方法は?
フォックス

ファイルが変更されるたびに、ファイルの行数を読み取ります。行数が増えた場合は、変更を読み取ります。

1

同じための非再帰的メソッド:

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

私はそれが短く、多くのハッキングなしで好きです。このonelinerはex(whimin vim)から必要に応じて実行できます(または、ログファイルが開かれたときにvimrcに各コマンドを入力します)。

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

(ファイルの終わりまで(ほぼ)ジャンプしたい場合は、フィードキーで「lh」の代わりに「G」を使用します)

説明:

  • autoread:外部から変更されたときにファイルを読み取ります(ただし、それ自体では機能せず、内部タイマーなどはありません。vimがexのコマンドのようにアクションを実行する場合にのみファイルを読み取ります :!
  • CursorHold * checktime:で指定された時間updatetime(デフォルトでは4000ミリ秒)ユーザーがカーソルを移動しない場合checktime、ファイルの外部からの変更をチェックします
  • call feedkeys("lh"):カーソルは1回、右および左に移動します。そして何も起こりません(...つまり、それCursorHoldがトリガーされ、ループがあることを意味します

を使用してスクロールを停止するにはcall feedkeys("G")、実行し:set noautoreadます。vimは、ファイルが変更されたこと、および変更を読み取りたいかどうかを尋ねます。

screen / tmuxなしでsshセッションで作業しているときなど、vimで(tail -fの代わりに)ログファイルを監視するというアイデアが好きです。さらに、必要に応じてログファイルから直接コピーしたり、出力を直接保存したりできます... vimでできることは何でも:)

*この回答から(PhanHaiQuangによる回答flukusによるコメントを参照


0

編集:あなたがすでにこれを試したことを完全に回避し、謝罪します。

Tail Bundleプラグインを使用してみてください。探しているものを実行する必要があると思います。

インストールするには、vimでtail-3.0.vbaを開き、次を実行します。

:so %

再起動すると、次のようにvim内からファイルをテーリングできるはずです。

:Tail /path/to/file

0

VIM 8.0+のみにタイマーが導入されたため、タイマーを使用してテール機能をシミュレートできます。これは私の経験ではかなり効果的に機能します。

F6キーをマッピングしてテールをオンにし、F7キーをマッピングしてテールをオフにします。以下のコマンドでカスタマイズできます。以下の「注意事項」のセクションも参照してください。

以下を実行します

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>

上記のコマンドをvimrcの一部にして、常に使用できるようにすることもできます。

注意事項:

  • 他のタイマーがないため、timer_stopall()は実際にすべてのタイマーを効果的に停止します。これを少し変更して、timer_start中にIDを取得し、それを保持することなどができますが、それは私には少し手間がかかりそうで、ほとんどの人はタイマーを使用しないと思います。
  • テールモードになっている間は、コマンドを実行しようとしないことを強くお勧めします。通常、vimインスタンスがクラッシュするため、編集モードに戻る前にテール(F7)をオフにしてください。これは厳密にのみです。ログを表示するため。

-1

Vim内から次を実行します。

!tail -f 

これは、分岐した子がtail -f現在のバッファーで実行されている間、Vimを中断します。押すとCtrl-C、Vimのバッファーに戻ります。


1
それはvimではありませんがtail、仕事をするのは明白です。Vimはポータブルです。これではありません。
オリゴフレン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.