Python Vim语法文件-函数名末尾的引号[dg编程语言]
我正试图为dg编程语言编写一个语法文件。它不是很复杂,并且是从Python派生的,所以我从Python语法文件中复制了它 问题是函数名的末尾可能有一个引号:Python Vim语法文件-函数名末尾的引号[dg编程语言],python,vim,Python,Vim,我正试图为dg编程语言编写一个语法文件。它不是很复杂,并且是从Python派生的,所以我从Python语法文件中复制了它 问题是函数名的末尾可能有一个引号: a = list' 1 2 3 # [1, 2, 3] 显然,从引号开始,该行将突出显示为字符串。 我从Python语法文件中获取的字符串定义如下: syn region dgString start=+[bB]\='+ skip=+\\\\\|\\'\|\\$+ excludenl end=+'+ end=+$+ keepend co
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 "\\$"
我希望函数名末尾的引号不要突出显示(普通文本)。我怎样才能做到这一点
供参考:
- dg lang主页:
- dg教程:
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]
或类似字符之前插入单词atom的零宽度开头,或者坚持字符串前面不带单词字符。只处理字符串的单引号版本(示例的第一行),这将是
:syn region dgString start=+\%(\w\@<!\|\<[bB]\)'+ skip=+\\\\\|\\'\|\\$+ excludenl end=+'+ end=+$+ keepend contains=dgEscape,dgEscapeError
:同步区域dgString start=+\%(\w\@在文档中的什么地方说函数名可以包含引号字符?我如何知道rb'
是原始二进制字符串的开头,而不是函数名?我认为重要的是确保单个引号是描述函数名的语法元素的一部分;然后您就不必修改了字符串的定义。实际上它没有说。但是如果你快速搜索教程,你可以看到使用了tuple'
,list'
和dict'
。我还试图在repl中定义一个带引号的函数,它是有效的。至于你的第二个问题,可以验证rb'
是否t是一个有效的函数名(并且不是b'
或r'
),而其他组合(例如rib'=->2
)是无效的。