【发布时间】:2026-01-24 17:15:02
【问题描述】:
我有一种类型的文本文件,其中包含一堆以井号 (#) 开头的关键字。示例:
#foobar
#fizz bizz
我想调整 vim 语法文件以仅突出显示关键字后的单词;在这个例子中,它会很有趣。
【问题讨论】:
我有一种类型的文本文件,其中包含一堆以井号 (#) 开头的关键字。示例:
#foobar
#fizz bizz
我想调整 vim 语法文件以仅突出显示关键字后的单词;在这个例子中,它会很有趣。
【问题讨论】:
即使您不想突出显示关键字本身(您的意见可能稍后会改变),将两者解析为单独的语法组会更容易,因为 Vim 的语法突出显示是针对文档的完整解析量身定制的。
因此,定义关键字和单词的语法组,并指定它们之间的关系:
syntax match myKeywords "#\w\+\>" skipwhite nextgroup=myKeywords,myWords
syntax match myWords "\<\w\+\>" contained skipwhite nextgroup=myKeywords,myWords
(模式将您稀缺的描述作为输入;根据您的需要进行调整。)要突出显示这些词,您可以将 myWords 链接到现有的突出显示组(推荐),或者定义您的自己的属性:
highlight link myWords Statement
myKeywords 已解析,但未突出显示,因为没有 :highlight 命令。
如果有需要“调整”的(第三方)语法脚本,最好将这些扩展单独保存在 after 目录中(例如~/.vim/after/syntax/<filetype>.vim)。此外,根据现有的语法组,如果现有的语法组已经匹配(可以使用containedin=... 修复),可能会出现额外的复杂情况。
如果这是新语法,最好写一个对应的文件类型检测;在语法脚本中,将 my 前缀替换为所选的文件类型名称。您可以在:help 44.11 找到有关语法脚本的更多信息。
【讨论】:
突出显示#fizz之后的文本:
syntax match HashWord /\v(#fizz>)@<=.*/hs=s+1
highlight HashWord ctermbg=60
这将创建一个语法组 HashWord,它与模式 \v(#fizz>)@<=.* 匹配。 h在模式的 start (s+1) 之后突出显示 start (hs) 一个字符。
可以使用ctermbg 和ctermfg 更改背景和前景突出显示颜色。对于 GUI vim,请改用 guibg 和 guifg。
【讨论】: