我正在尝试为dg编程语言编写语法文件。它不是很复杂,它是从Python派生的,所以我从Python语法文件中复制了。
问题是函数名称最后可以有一个引号:
a = list' 1 2 3 # [1, 2, 3]
显然,从引用开始,该行突出显示为字符串。 我从Python语法文件中获取的字符串定义是:
syn region dgString start=+[bB]\='+ skip=+\\\\\|\\'\|\\$+ excludenl end=+'+ end=+$+ keepend contains=dgEscape,dgEscapeError
syn region dgString start=+[bB]\="+ skip=+\\\\\|\\"\|\\$+ excludenl end=+"+ end=+$+ keepend contains=dgEscape,dgEscapeError
syn region dgString start=+[bB]\="""+ end=+"""+ keepend contains=dgEscape,dgEscapeError
syn region dgString start=+[bB]\='''+ end=+'''+ keepend contains=dgEscape,dgEscapeError
syn match dgEscape +\\[abfnrtv'"\\]+ display contained
syn match dgEscape "\\\o\o\=\o\=" display contained
syn match dgEscapeError "\\\o\{,2}[89]" display contained
syn match dgEscape "\\x\x\{2}" display contained
syn match dgEscapeError "\\x\x\=\X" display contained
syn match dgEscape "\\$"
我希望功能名称末尾的引号不会突出显示(普通文本)。我怎么能做到这一点?
供参考:
答案 0 :(得分:1)
在默认的python语法高亮显示中,好像list
是pythonBuiltin
语法组的一部分。 (请参阅:help synID()
下的示例了解如何检查。)所以我尝试了
:syn keyword pythonBuiltin issubclass iter len list locals map max nextgroup=pythonFoo
:syn match pythonFoo /'/ contained
然后是示例文本
a = list' 1 2 3 # [1, 2, 3]
b = list 'a' 'b' 'c'
正确突出显示:list'
被识别为内置后跟Foo,而'a'
被识别为字符串。
我的想法是,在vim处理完一个列出的关键字后,我的新创建的语法项被赋予优先级,因此'
被新组吞噬并且不能作为字符串的开头
原则上,您可以使用用户定义的函数执行相同的操作。问题出现了一个只匹配函数的语法定义。默认的python语法文件似乎突出显示了函数定义,但没有使用。 (更准确地说,函数名称前面有def
或class
或@
。)
另一种方法是通过在可选的[bB]
或类似字符之前插入零宽度的字首字母来修改字符串的定义,或者坚持字符串不以字符开头。仅处理字符串的单引号版本(示例的第一行)
:syn region dgString start=+\%(\w\@<!\|\<[bB]\)'+ skip=+\\\\\|\\'\|\\$+ excludenl end=+'+ end=+$+ keepend contains=dgEscape,dgEscapeError