适用于MySQL的Vim BNF语法高亮显示

时间:2014-04-29 10:48:09

标签: mysql vim syntax-highlighting bnf

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

(也没有=)。知道为什么吗?

1 个答案:

答案 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插件在开发语法脚本时非常有用。