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

2024-04-24 16:03:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我想为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 "\\$"

我希望函数名末尾的引号不要突出显示(普通文本)。我怎样才能做到这一点?你知道吗

供参考:


Tags: matchdisplay语法startregionenddgbb
1条回答
网友
1楼 · 发布于 2024-04-24 16:03:24

在默认的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语法文件似乎突出显示函数定义,而不是用法。(更准确地说,函数名前面是defclass@。)

另一种方法是修改字符串的定义,方法是在可选的[bB]或类似字符之前插入单词atom的零宽度开头,或者坚持字符串前面不带单词字符。只处理字符串的单引号版本(示例的第一行),这将是

:syn region dgString start=+\%(\w\@<!\|\<[bB]\)'+ skip=+\\\\\|\\'\|\\$+ excludenl end=+'+ end=+$+ keepend contains=dgEscape,dgEscapeError

相关问题 更多 >