我正在尝试为vim
定义新的MySQL
语法高亮显示,主要用于学习目的。首先,我从MySQL manual获取了ALTER DATABASE
BNF
,并尝试将其转换为syn
命令。这是我的结果:
syn case ignore
" 13 SQL Statement Syntax
" 13.1 Data Definition Statements
" 13.1.1 ALTER DATABASE Syntax
syn match mysqlAlterDB "\<alter\>" skipwhite display nextgroup=mysqAlterSpec
syn match mysqlAlterDB "\<alter\>" skipwhite display nextgroup=mysqlDBAlterSpec
syn match mysqlAlterSpec "(default )? collate (= )?" skipwhite display nextgroup=mysqlCollationName
syn match mysqlAlterSpec "(default )? character set (= )?" skipwhite display nextgroup=mysqlCharsetName
syn match mysqlDBAlterSpec "[_a-zA-Z0-9]" skipwhite display nextgroup=mysqlAlterSpec
hi link mysqlAlterDB Statement
" Misc.
syn match mysqlCollationName "[_a-z0-9]*"
syn match mysqlCharsetName "[_a-z0-9]*"
但是,这未突出显示以下声明:
alter default collate = test
(也没有=
)。知道为什么吗?
答案 0 :(得分:2)
对于初学者,您需要使用正确的非魔术正则表达式语法:捕获组为\(...\)
,(我更喜欢使用\%(...\)
进行非捕获分组),以及0或1多个是\?
:
syn match mysqlAlterSpec "\%(default \)\? collate \%(= \)\?" skipwhite display nextgroup=mysqlCollationName
请参阅:help :syn-pattern
。
要在关键字之间允许(任意)空格,您可能希望使用\s
而不是普通的空格。
而不是
syn match mysqlAlterDB "\<alter\>"
你可以使用
syn keyword mysqlAlterDB alter
这是规范的方式,也可能稍快一些。
SyntaxAttr.vim - Show syntax highlighting attributes of character under cursor插件在开发语法脚本时非常有用。