如何让 Vim 表现得像“tail -f”?

如何让 Vim 表现得像“tail -f”?

我想知道是否有办法让 Vim 表现得像tail -f.
即使是最好的Vim 插件到目前为止我发现并没有达到我的预期。

我真的很想看到文件更新即时的。即使我远离键盘,我也希望 Vim 不断重新加载缓冲区并跳转到最后一行。

这个怎么做?
(我不想重新加载整个文件,因为某些日志文件非常大。最好是只加载最后几行,就像tail -f这样做的那样。)

答案1

你不能让vim自己表现得像tail -f.你可以使行为像和less的组合。vimtail -f

永远前进(跟随)模式

less有一个永远前进模式,您可以通过按F或将+F其作为参数传递来进入。

$ less +F

在此模式下,less其行为类似于tail -f当到达文件末尾时不会停止读取。它不断刷新文件中的新数据。要退出此模式,请按Ctrlc

语法高亮

less支持自动过滤读取的数据。有一个程序叫来源突出显示可以执行基本的源代码突出显示。它附带了一个可以很好地与less.要使用它,只需LESSOPEN适当设置环境变量即可。

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

您还必须less通过传递标志来告诉您传递原始终端转义序列(这些序列告诉您的终端如何为文本着色)-R。您可以通过设置环境变量less假装它始终被传递标志。-RLESS

 export LESS=' -R '

什么时候less还不够

虽然less有类似 vi 的键绑定,但它与 Vim 不同。有时它感觉很陌生,并且缺乏重要的功能,例如 ctags 集成和编辑文本的能力。

您可以通过按 来less调用 Vim(假设EDITOR=vim)当前正在查看的文件vless甚至会将光标置于 Vim 中的正确位置。当你退出 Vim 时,你会发现自己回到了less。如果您在使用 Vim 时对文件进行了任何更改,它们将反映在less.

答案2

我喜欢它简短且没有太多的黑客攻击。您可以在需要时从 ex(在 vim 中)运行此 oneliner(或将每个命令放入 vimrc 中,以便在打开日志文件时使用。)

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

(如果您想跳(几乎)​​到文件末尾,只需使用“G”而不是带有 feedkey 的“lh”)

解释:

  • autoread:从外部更改时读取文件(但它本身不能工作,没有内部计时器或类似的东西。它只会在 vim 执行操作时读取文件,例如 ex 中的命令:!
  • CursorHold * checktime:当用户在指定的时间内updatetime(默认为 4000 毫秒)没有移动光标checktime时执行,检查来自文件外部的更改
  • call feedkeys("lh"):光标向右移动一次,然后向左移动一次。然后什么也没有发生(...这意味着,它CursorHold被触发了,这意味着我们有一个环形

要在使用时停止滚动call feedkeys("G"),请执行:set noautoread- 现在 vim 会告诉您文件已更改并询问是否要读取更改)

我喜欢在 vim 中查看日志文件(而不是 tail -f),例如,当您在没有 screen/tmux 的 ssh 会话中工作时。此外,如果需要,您可以直接从日志文件中复制,或者直接保存输出,或者...您可以使用 vim 执行的任何操作:)

*由此回答(参考一个答案潘海光和评论福禄克斯

答案3

vim --servername TAIL_VIM /tmp/somefile

现在,在另一个 shell(如 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 进入正常模式时,“edit!”告诉 vim 重新加载当前文件(CR 模拟按 Enter 键),G 转到文件底部。删除 (G) 可以在输入进入时更轻松地检查文件。

答案4

相同的非递归方法:

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

相关内容