Vim HereDoc 突出显示

Vim HereDoc Highlighting

我想在 bash heredoc 中突出显示语法。此外,我希望 bash 在 heredoc 中突出显示变量取消引用和命令替换。

使用 these instructions as a starting point, I was able to add variable dereferencing by examining sh.vim。我想您可以用类似的方式完成命令替换。

let s:bcs = b:current_syntax

unlet b:current_syntax
syntax include @YAML syntax/yaml.vim

syntax region hereDocYAML matchgroup=Statement start=/<<-\?\s*\z(YML\)/ end=/^\s*\z1/ contains=@YAML,hereDocDeref,hereDocDerefSimple

syn match  hereDocDerefSimple  "$\%(\h\w*\|\d\)"
syn region hereDocDeref  matchgroup=PreProc start="${" end="}"  contains=@shDerefList,shDerefVarArray

hi def link hereDocDeref PreProc
hi def link hereDocDerefSimple PreProc

我的问题是,这似乎不适用于任何类型的块(iffunctionfor 等)。例如:

我唯一知道的是这不是缩进问题。更改缩进没有效果,在块外使用缩进可以正常工作。

the definition of shIf 上的 contains 似乎将可能的突出显示限制在 shIfList 组中的任何项目。

按如下方式将您的项目添加到组中将使您突出显示该区域:

syn cluster shIfList add=hereDocYAML

同样的原则适用于所有其他块。例如:

syn cluster shFunctionList add=hereDocYAML
syn cluster shLoopList     add=hereDocYAML

请注意,您概述的方法通常用处不大。首先,它要求包含的语法文件使用组作为其 contains 定义。

此外,它适用于 YAML,因为 bash 解引用语法和 YAML 语法不冲突。对于更复杂的语法,如 sed 或 awk,您会遇到冲突,解决这些冲突的规则可能需要完全新的语法。