如何语法高亮 vim 中多个 space 分隔的字段?

How to syntax highlight multiple-space-separated fields in vim?

我有一个跟踪格式,其中包含 space 分隔的字段,但它们之间的 space 数量未知,例如:

  0.0430   22.0  83012/84348 mt-client * | |        clearing session cache
  0.0430    0.0  83012/84348 mt-client * | |        moving 1 sessions into watched list
  0.0430    0.0  83012/84348 mt-client * | |        session 8 added to watched list
  0.0430    0.0  83012/84348 conncache - | --27.0 ConnectionCache::ResetEverything

我想根据字段编号在 vim 中突出显示语法 - 例如,awk 会调用 $1、$2 等。

要获得灵感,请将此文本放入缓冲区并键入 /^\s*\zs[^ ]\+。此模式 select 是第一个字段。要 select 第二个使用此:^\s*[^ ]\+ \+\zs[^ ]\+。对于 select 第三个使用此:^\s*[^ ]\+ \+[^ ]\+ \+\zs[^ ]\+ 等等。 \zs 不突出前面的原子。要对此使用语法:

syntax match {group} /{pattern}/

例如:

syntax match Keyword /^\s*\zs[^ ]\+/

以下模式将匹配第一个非空白组,awk 调用 $1:

:syn match Keyword /\v(^\s*(\S+\s+){0})@<=\S+/

您可以将 {0} 更改为 {1} 以匹配第二组,并将 {i-1} 更改为 $i 组。

在高亮之前,您可以自定义自己的高亮组。

例如:

:highlight Group0 guifg=blue
:highlight Group1 ctermfg=black ctermbg=white

第一个用于 gui 模式,第二个用于 cli 模式。或者您可以同时设置两者。


将突出显示规则保存到文件

您可以将您自定义的规则保存到一个文件中,以便您以后可以轻松地突出显示此类字符串。

将以下内容保存到my_highlight.vim

"customize highlight groups
highlight Group0 guifg=blue
highlight Group1 guifg=green
highlight Group2 guifg=yellow
highlight Group3 guifg=orange
highlight Group4 guifg=purple

"highlight groups
syn match Group0 /\v(^\s*(\S+\s+){0})@<=\S+/
syn match Group1 /\v(^\s*(\S+\s+){1})@<=\S+/
syn match Group2 /\v(^\s*(\S+\s+){2})@<=\S+/
syn match Group3 /\v(^\s*(\S+\s+){3})@<=\S+/
syn match Group4 /\v(^\s*(\S+\s+){4})@<=\S+/

需要高亮时执行如下命令即可:

:source my_highlight.vim