我想知道是否有办法让 Vim 表现得像tail -f
.
即使是最好的Vim 插件到目前为止我发现并没有达到我的预期。
我真的很想看到文件更新即时的。即使我远离键盘,我也希望 Vim 不断重新加载缓冲区并跳转到最后一行。
这个怎么做?
(我不想重新加载整个文件,因为某些日志文件非常大。最好是只加载最后几行,就像tail -f
这样做的那样。)
答案1
你不能让vim
自己表现得像tail -f
.你可以使行为像和less
的组合。vim
tail -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
假装它始终被传递标志。-R
LESS
export LESS=' -R '
什么时候less
还不够
虽然less
有类似 vi 的键绑定,但它与 Vim 不同。有时它感觉很陌生,并且缺乏重要的功能,例如 ctags 集成和编辑文本的能力。
您可以通过按 来less
调用 Vim(假设EDITOR=vim
)当前正在查看的文件v。less
甚至会将光标置于 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