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)
我的问题是,这似乎并没有工作,任何类型的块(if,function,for等)。例如:
我唯一知道的是,这不是缩进问题。更改缩进没有效果,在块外使用缩进可以正常工作。
的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 等更复杂的语法,您将遇到冲突,并且解决这些冲突的规则可能需要完全新的语法。