web-dev-qa-db-ja.com

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

Vimをtail -fのように動作させる方法があるかどうか知りたいのですが。
最高のものでも Vimプラグイン これまでのところ、私が期待したことをしていないことがわかりました。

real-timeでファイルの更新を確認したい。キーボードから離れていても、Vimが常にバッファをリロードして最後の行にジャンプするようにします。

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

38
Fox

vimtail -fのように動作させることはできません。ただし、lessvimtail -fの組み合わせのように動作させることができます。

Forward forever(follow)モード

lessには、Forward foreverモードがあり、を押すとこのモードに入ることができます F または、+Fを引数として渡します。

$ less +F

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

構文の強調表示

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

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

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

 export LESS=' -R '

lessでは不十分な場合

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

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

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

5
crutux

同じための非再帰的な方法:

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
Ritesh Agarwal

私はそれが短くて、多くのハッキングなしで好きです。この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がトリガーされることを意味します。つまり、loopがあることを意味します)

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

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

*これから answerPhanHaiQuang による回答と flukus によるコメントを参照)

1
eli

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で何も実行できません。バッファが自律的で、別のスプリットウィンドウにいる場合でも更新されるのが最適です。とにかく、それは良いスタートです。 :)

1
Fox

編集:申し訳ありませんが、あなたがすでにこれを試したことを完全にバイパスしました。

Tail Bundle プラグインを使用してみることができます。探していることを実行できるはずです。

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

:so %

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

:Tail /path/to/file
0
Sean Schoonover

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)をオフにしてください。これは厳密にのみです。ログを表示するため。
0
Jolly1234

Vim内から、次のコマンドを実行します。

!tail -f 

これは、フォークされた子が現在のバッファでtail -fを実行している間、Vimを一時停止します。ヒッティング Ctrl-C Vimのバッファに戻ります。

0
user65446