如何在Vim中为同一关键字获取上下文相关的语法着色?

如何在Vim中为同一关键字获取上下文相关的语法着色?,vim,syntax,Vim,Syntax,我正在为一种还没有语法文件的利基语言创建一个vim语法文件。设置简单函数时,该语言具有以下语法 foo(parameter) if parameter then print("yes") else print("no") end end 我希望与if配对的end具有条件语句的语法着色,与函数声明配对的“end”具有函数语法着色。我如何做到这一点?我目前已将结束设置为关键字。这确保它是彩色的,但它与函数名的颜色匹配(如果仅匹配),而不是函数名

我正在为一种还没有语法文件的利基语言创建一个vim语法文件。设置简单函数时,该语言具有以下语法

foo(parameter)
    if parameter then
       print("yes")
    else
       print("no")
    end
 end
我希望与if配对的end具有条件语句的语法着色,与函数声明配对的“end”具有函数语法着色。我如何做到这一点?我目前已将结束设置为关键字。这确保它是彩色的,但它与函数名的颜色匹配(如果仅匹配),而不是函数名


谢谢你的帮助

您需要定义一些语法区域,以if开头,以end结尾,另一个以函数声明开头,以end结尾。您可以使用'contains'/'containedin'选项来允许区域嵌套等。这绝非小事,但在
:help syn region
中有许多有用的指南。彻底阅读整个帮助文件并进行实验。要开始,您可以尝试以下方法:

syn keyword MyLanguageElse else containedin=MyLanguageIfBlock

syn region MyLanguageIfBlock matchgroup=MyLanguageIf start="^\s*if\>" end="^\s*end\>" containedin=MyLanguageFuncBlock contains=MyLanguageIfBlock
syn region MyLanguageFuncBlock matchgroup=MyLanguageFunc start="^\s*\k*\ze(" end="^\s*end\>"

hi link MyLanguageIf Keyword
hi link MyLanguageElse Keyword
hi link MyLanguageFunc Comment

祝你好运

您需要定义一些语法区域,以if开头,以end结尾,另一个以函数声明开头,以end结尾。您可以使用'contains'/'containedin'选项来允许区域嵌套等。这绝非小事,但在
:help syn region
中有许多有用的指南。彻底阅读整个帮助文件并进行实验。要开始,您可以尝试以下方法:

syn keyword MyLanguageElse else containedin=MyLanguageIfBlock

syn region MyLanguageIfBlock matchgroup=MyLanguageIf start="^\s*if\>" end="^\s*end\>" containedin=MyLanguageFuncBlock contains=MyLanguageIfBlock
syn region MyLanguageFuncBlock matchgroup=MyLanguageFunc start="^\s*\k*\ze(" end="^\s*end\>"

hi link MyLanguageIf Keyword
hi link MyLanguageElse Keyword
hi link MyLanguageFunc Comment
祝你好运