利用 vim8 的异步特性,将动态增长的日志导入一个 buffer,实现类似 在 shell 执行以下命令的功能:
: tail -f xxxxx.log | grep what?
但是可以动态、实时改变要过滤的字符串(实际按 vim 解析的正则表达式)。
也可以通过选项或配置命令调用其他外部命令,只要是向标准输出即可。比如
用 cat
代替 tail -f
就是分析历史不再增长的旧日志文件。
: PI tailflow
: Tail xxxxx.log
: Tail xxxxx.log --cmd other cmd than tail
: Tail xxxxx.log --and match1 match2 --not nomatch1 nomatch2
在默认情况下,Tail
命令用异步工作的方式调用 tail -f
工具打开
一个(日志)文件,将标准输出显示在一个新开的 buffer 中。
一般假设该文件会持续动态增长,新行会添加到 buffer 末尾。如果光标
在末尾,则在增长的同时光标也顺移,以保持在末尾。但是,你可以像在
普通 buffer 中那样自由移动光标,比如查看之前刷出的日志。所以如果
光标离开末行时,在添加新行时也不会影响光标位置。要恢复自动滚动刷
屏,只要按 G
跳到末行即可。
--cmd
或-c
:可以提供其他命令覆盖tail -f
,比如cat
--and
或-a
:需要匹配的字符串(vim 正则表达式)--not
或-n
:不能匹配的字符串
每个选项之后都可以跟多个参数,以空格分隔,直到遇到另一个选项开关。
-c
之后的参数当成是外部命令及其可选参数,但不支持管道,(也暂
不支持 -
选项,会与 Tail
命令本身冲突)。
对于标准输出的每一行,会根据 --and
与 --not
列表来决定该行是否
被过滤,是否添加到 buffer 末尾。相当于以下且逻辑:
print if /match1/ && /match2/ && !/nomatch1/ && !/nomatch2/;
如果在 Tail
启动命令时没提供选项,--and
列表与 --not
列表
初始为空。
在日志流窗口被打开时,有以下几个命令或快捷键可使用:
:And [op] {item list}
动态修改当前的--and
列表。:Not [op] {item list}
动态修改当前的--not
列表。
可以提供多个参数,每个参数仍当作 vim 的正则表达式。
参数之前有个可选的操作符,默认是 +=
-
=
完全重置对应的列表,用当前命令行参数覆盖 -
+=
将参数添加到列表中,忽略重复已存在的参数 -
'-=' 将参数从列表中删除,忽略原来不存在的参数
-
:Stop
停止外部命令,即调用 vim 的job_stop()
-
:Run
重新启动外部命令,复用当前日志流 buffer 窗口 -
:Status
查看异步工作状态 -
:File {filename}
改变外部命令的文件名参数 -
:Cmd {command}
改变外部命令及可选参数
调用的外部命令实际上是 :Cmd
与 :File
参数的拼接。
需要 :Stop
之后才允许修改外部命令或文件参数,
修改后之后须再 :Run
才重新生效。
每个 :Tail
全局命令将开启一个异步工作,新建一个 buffer,
并以 tail-1
命名,其中序号后缀将递增。但局部命令 :Stop
后
再 :Run
不会新增 buffer ,也不会清空原来 buffer 中的内容。
改变 :And
或 :Not
参数表,也不会影响之前刷出在 buffer 中的内容。
但你可以自由像普通 buffer 那样删除不想看的内容,或用正则删除:
: g/regexp/d
日志流 buffer 最多保存 10000 行,超值时删除前 10% 行。
这是个特殊 buffer ,但虽可编辑,但不会保存文件。即不会影响原本的
日志文件,也不会保存 tail-1
这样的文件。但可以手动保存
或选定部分行,指定文件名参数保存 buffer:
: w another-file-name
在日志流窗口中,另定义了一些快捷键,调用以上命令。
A
当前光标下的单词送给命令:And <word>
执行X
当前光标下的单词送给命令:Not <word>
执行
在选择模式下,就将将定的部分当作 :And
或 :Not
的参数。
命令行处于待执行状态,要求用户再按回车确认,
以提供机会修改参数,或取消执行。
日志中常有压缩的单行 json 字符串,不便查看, 故提供命令重格式化为易读的多行格式。
:JsonBreak
纯 viml 实现的对当前行简单正则替换加回车断行再=
格式化J
普通模式下大 J 在当前行调用:JsonBreak
。选择vJ
可重新合并一行K
大 K 调用!clang-format
过滤重格式化,普通模式下对当前行, 选择模式下对所选行重格式化。
其他设想,有用且有时间就添加。
- 新增一个辅助配置窗口,直接编辑配置,避免单独执行
:And
:Not
以及:File
:Cmd
等命令调控。 - 支持区域正则筛选,类似
/begin-line/,/end-line/
功能 以及更多的过滤规则。