Python Vim语法文件-函数名末尾的引号[dg编程语言]

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

我正试图为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 "\\$"
我希望函数名末尾的引号不要突出显示(普通文本)。我怎样才能做到这一点

供参考:

  • dg lang主页:
  • dg教程:

在默认的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]
或类似字符之前插入单词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
)是无效的。