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

Fox*_*Fox 40 vim tail

我想知道是否有办法让 Vim 表现得像tail -f.
即使是迄今为止我发现的最好的Vim 插件也不能达到我的预期。

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

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

小智 32

你不能vimtail -f. 你可以less表现得象的组合vimtail -f虽然。

永远前进(跟随)模式

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

$ less +F
Run Code Online (Sandbox Code Playgroud)

在这种模式下,less行为就像tail -f在当它到达文件末尾不停止阅读。它不断刷新文件中的新数据。要退出此模式,请按Ctrlc

语法高亮

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

 export LESSOPEN="| /path/to/src-hilite-lesspipe.sh %s"
Run Code Online (Sandbox Code Playgroud)

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

 export LESS=' -R '
Run Code Online (Sandbox Code Playgroud)

什么时候less不够

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

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


eli*_*eli 9

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

:set autoread | au CursorHold * checktime | call feedkeys("lh")
Run Code Online (Sandbox Code Playgroud)

(如果您想跳(几乎)​​到文件末尾,只需使用“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 执行的任何操作:)

*来自这个答案(参考PhanHaiQuang的答案和flukus的评论)


小智 6

vim --servername TAIL_VIM /tmp/somefile
Run Code Online (Sandbox Code Playgroud)

现在,在另一个 shell(如 bash)中,您可以执行以下操作:

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

<C-><CN> 强制 vim 进入普通模式,“编辑!” 告诉 vim 重新加载当前文件(CR 模拟按 Enter),然后 G 转到文件底部。删除 (G) 可以在输入进入时更轻松地检查文件。