Vim HereDoc语法高亮

6
我希望在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

我的问题是,这似乎在任何块(iffunctionfor等)中都不起作用。例如:

highlighting example

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

2
就我而言,我无法理解为什么有人会投票关闭这个问题。这是一个关于使用支持广泛使用的编程工具的编程问题的问题。 - Tim Pote
2
有些人认为所有关于vi/vim的问题都应该在vi.SE上提问,而另一些人似乎盲目地认为所有“文本编辑器”问题都应该去SU。我不同意... - Dan Lowe
1个回答

2

contains定义shIf时,似乎限制了可能的高亮显示项为shIfList组中的任何项。

按照以下方式将您的项目添加到该组中,即可在该区域内进行突出显示:

syn cluster shIfList add=hereDocYAML

所有其他块都遵循同样的原则。例如:
syn cluster shFunctionList add=hereDocYAML
syn cluster shLoopList     add=hereDocYAML

需要注意的是,您提出的方法并不普遍适用。首先,它要求所包含的语法文件使用组来定义它们的contains

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


我觉得这个问答很令人困惑。提问者和回答者都是@tim-pote,但是却出现了奇怪的第三人称,例如“你所概述的方法通常并不实用”。能否请给一个简明扼要的答案?我无法推断应该保留问题的哪一部分以及哪些部分应该由答案中的内容替换。 - Bruno Bronosky
1
我会在一年后巧合地发现这个答案,并在意识到它是我自己的评论之前阅读整个上面的评论,这种可能性有多大呢?(嗯,如果你认识我,后面那部分不会让人感到惊讶。) - Bruno Bronosky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接