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


36

我想知道是否有一种方法可以使Vim表现得像tail -f
即使是到目前为止我发现的最好的Vim插件也无法达到我的期望。

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

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


2
为什么必须在里面vim?这有什么错tail -f
2013年

1
因为我在读取日志文件时需要vim的功能。喜欢能够搜索模式,尤其喜欢语法突出显示。我对某些日志文件(绑定,apache等)进行了语法高亮显示。

您可能对自动读取FileChangedShell >:help自动读取>:help FileChangedShell
感兴趣

2
对于仅搜索,您可以less +F代替tail -f。虽然没有给您突出显示语法。
丹尼斯·卡斯玛克

Answers:


28

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

永远转发(跟随)模式

less您可以通过按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来假装它总是被传递-R标志LESS

 export LESS=' -R '

什么时候less还不够

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

您可以通过按在当前正在查看的文件上less调用Vim(假定EDITOR=vimvless甚至可以将光标置于Vim中的正确位置。退出Vim时,您将回到less。如果您在使用Vim时对文件进行了任何更改,它们将反映在中less


5
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进入正常模式的地方,“编辑!” 告诉vim重新加载当前文件(CR模拟按Enter键),G转到文件底部。删除(G)可以使输入输入时更容易独立文件。


我在该人中看到了参数“ --servername”,但是收到以下错误消息:VIM - Vi IMproved 7.3 (2010 Aug 15, compiled Feb 10 2013 02:28:47) Option inconnue: "--servername=toto" Plus d'info avec: "vim -h"
Fox

如果执行vim --version,会看到+ clientserver(不是-clientserver,带有连字符)吗?如果不是这样,许多人使用./configure --with-features = huge
crutux

是的,有+ clientserver。我有Ubuntu版本。
福克斯

1

由于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中执行任何操作。最好的办法是,即使我在另一个拆分窗口中,缓冲区也是自治的并可以更新。无论如何,这是一个好的开始。:)


2
看起来它还重新读取了整个文件,这不是您想要的,对吧?
伯恩哈德

这不会重新加载整个文件。创建一个基于inotifywait的插件可能不会太困难,:read它会等到文件被修改并且如果已添加到文件末尾,读取文件底部的行。

是的,的确如此,它会重新加载整个文件,因此必须进行很多改进。当我说我想要这个时,我更多是在谈论结果(您在屏幕上看到的是:一个vim,它仅更新您的文件并停留在最后一行)。不幸的是,我没有足够的vim知识来制作一个不错的插件……
Fox

@EvanTeitelman好吧,我现在知道如何使用inotifywait。我知道文件何时更改。但是,如何知道是否已附加(未完全修改),以及如何知道有多少新行被附加?
Fox

每次文件更改时,读取文件中的行数。如果行数增加,请读入更改。

1

相同的非递归方法:

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

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

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

(如果您想(几乎)跳到文件末尾,只需在Feed键中使用“ G”而不是“ 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


0

编辑:我很抱歉,完全绕开了您已经尝试过的方法。

您可以尝试使用Tail Bundle插件,我认为它应该可以满足您的需求。

要安装,请用vim打开tail-3.0.vba并执行:

:so %

重新启动,您应该可以像这样从vim中拖尾文件:

:Tail /path/to/file

0

仅对于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),这仅是严格的用于查看日志。

-1

在Vim中,执行:

!tail -f 

当分叉的子进程tail -f在当前缓冲区上执行时,这将挂起Vim 。击中Ctrl-C返回到Vim中的缓冲区。


1
那不是vim,而是简单地tail完成工作。Vim是便携式的。这不是。
oligofren
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.