我正在为DSL编写
vim语法高亮,其中函数遵循以下格式:
# 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: "\>">
它是一种文本处理语言(想想类固醇的降价),因此文本块必须是非限制性的.
我在为此编写vim语法文件时遇到了很多麻烦.
我可以
syn region myFunction start='<' end='>' skip='\\>' syn region myArgs start='(' end=')' skip='\\)'
但myFunction不能包含myArgs,因为在下面的示例中错误地突出显示了parens:
<function(arg) some text (with parenthesis) that aren't arguments>
具体来说,我希望功能名称和参数列表仅在区域的紧邻开头突出显示.但是,我不能这样做
syn region myFunction start='<(regex to match name and arg list)' ...
因为,即使匹配名称和arg列表的正则表达式并不可怕,这也会破坏我对语法突出显示嵌套函数的能力.
我想要的是类似于nextgroup的语法区域的开头,但我找不到一个.
这可能吗?我如何在vimscript中执行此操作?
解决方法
定义与前导<重叠的函数名称的包含语法匹配myFunction区域的字符,然后使用nextgroup直接尝试与myArgs匹配,而不是后续出现.
:syn region myFunction start='<' end='>' contains=myFunctionName :syn match myFunctionName '<\i\+' contained nextgroup=myArgs :syn region myArgs start='(' end=')' contained
编辑:这是< ...>上匹配组的变体要素; matchgroup不能用于start元素,因为这会阻止myFunctionName的锚定:
:syn region myFunction start='<' matchgroup=myMarker end='>' contains=myFunctionName :syn match myFunctionName '<\i\+' contained nextgroup=myArgs contains=myMarker :syn match myMarker '<' contained :syn region myArgs start='(' end=')' contained
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。