Vim语法文件 - 在函数名末尾引用[dg编程语言]

时间:2014-02-26 19:01:00

标签: python vim

我正在尝试为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 "\\$"

我希望功能名称末尾的引号不会突出显示(普通文本)。我怎么能做到这一点?

供参考:

1 个答案:

答案 0 :(得分:1)

在默认的python语法高亮显示中,好像listpythonBuiltin语法组的一部分。 (请参阅: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]或类似字符之前插入零宽度的字首字母来修改字符串的定义,或者坚持字符串不以字符开头。仅处理字符串的单引号版本(示例的第一行)

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