我正在为一种DSL编写vim语法高亮,其中函数遵循以下格式:
因为即使用于匹配名称和参数列表的正则表达式不可怕,这也会破坏我的语法高亮嵌套函数的能力。
我想要的是像nextgroup一样用于语法区域开始的东西,但我找不到一个。
这个可能吗?我该如何在vimscript中实现?
# A function with no arguments
<function>
# A function with arguments
<function(arg1, arg2)>
# A function with text
<function block of normal text>
# A function with args and text
<function(arg1,arg2) text>
# Line breaks are allowed pretty much everywhere.
<function(
arg1,
arg2)
a block of text>
# As is nesting
<function(<subfunc>) Some text with <another(subfunction) etc.>>
# Backslash escape
<function(single arg with a comma: "\,") contained bracket between quotes: "\>">
这是一种文本处理语言(类似于增强版的Markdown),因此文本块必须是非限制性的。
我在为此编写vim语法文件时遇到了很多麻烦。
我可以做到:
syn region myFunction start='<' end='>' skip='\\>'
syn region myArgs start='(' end=')' skip='\\)'
但是myFunction
不能包含myArgs
,因为这样在下面的例子中圆括号会被错误地突出显示:
<function(arg) some text (with parenthesis) that aren't arguments>
具体来说,我希望函数名和参数列表只在区域的最开始处突出显示。然而,我无法实现。
syn region myFunction start='<(regex to match name and arg list)' ...
因为即使用于匹配名称和参数列表的正则表达式不可怕,这也会破坏我的语法高亮嵌套函数的能力。
我想要的是像nextgroup一样用于语法区域开始的东西,但我找不到一个。
这个可能吗?我该如何在vimscript中实现?
start='\<'
吗?\<
匹配单词的开头;要匹配字面意义上的<
,请使用<
。 - Ingo Karkat