Vimをtail -f
のように動作させる方法があるかどうか知りたいのですが。
最高のものでも Vimプラグイン これまでのところ、私が期待したことをしていないことがわかりました。
real-timeでファイルの更新を確認したい。キーボードから離れていても、Vimが常にバッファをリロードして最後の行にジャンプするようにします。
これを行う方法?
(一部のログファイルは非常に大きいため、ファイル全体を再ロードしたくありません。tail -f
のように、最後の行のみをロードすることをお勧めします。)
vim
をtail -f
のように動作させることはできません。ただし、less
をvim
とtail -f
の組み合わせのように動作させることができます。
Forward forever(follow)モード
less
には、Forward foreverモードがあり、を押すとこのモードに入ることができます F または、+F
を引数として渡します。
$ less +F
このモードでは、less
はtail -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
を想定)。 v。 less
を指定すると、カーソルがVim内の正しい場所に置かれます。 Vimを終了すると、less
に戻ります。 Vimでファイルに変更を加えた場合、それらはless
に反映されます。
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)を削除すると、入力が入っているときにファイルを挿入するのが簡単になります。
同じための非再帰的な方法:
cmap tailf<CR> call Tailf()<CR>
function! Tailf()
"Press C-c to stop tailing
while 1
e
normal G
redraw
sleep 1
endwhile
endfunction
私はそれが短くて、多くのハッキングなしで好きです。この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でできることは何でも:)
*これから answer ( PhanHaiQuang による回答と flukus によるコメントを参照)
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で何も実行できません。バッファが自律的で、別のスプリットウィンドウにいる場合でも更新されるのが最適です。とにかく、それは良いスタートです。 :)
編集:申し訳ありませんが、あなたがすでにこれを試したことを完全にバイパスしました。
Tail Bundle プラグインを使用してみることができます。探していることを実行できるはずです。
インストールするには、vimでtail-3.0.vbaを開いて実行します。
:so %
再起動すると、vim内から次のようにファイルをテールできるはずです。
:Tail /path/to/file
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の一部にすることで、常にそれらを使用することもできます。
注意点:
Vim内から、次のコマンドを実行します。
!tail -f
これは、フォークされた子が現在のバッファでtail -f
を実行している間、Vimを一時停止します。ヒッティング Ctrl-C Vimのバッファに戻ります。