Vim HereDoc 高亮

Tim*_*ote 5 vim bash syntax-highlighting heredoc vim-syntax-highlighting

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

使用这些说明作为起点,我能够通过检查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
Run Code Online (Sandbox Code Playgroud)

我的问题是,这似乎并没有工作,任何类型的块(iffunctionfor等)。例如:

突出例子

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

Tim*_*ote 2

contains定义似乎将可能的亮点限制为组中的任何项目shIfshIfList

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

syn cluster shIfList add=hereDocYAML
Run Code Online (Sandbox Code Playgroud)

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

syn cluster shFunctionList add=hereDocYAML
syn cluster shLoopList     add=hereDocYAML
Run Code Online (Sandbox Code Playgroud)

应该指出的是,您概述的方法通常并不有用。首先,它要求包含的语法文件使用组进行contains定义。

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