我正在尝试向sqloracle.vim添加一组仅适用于外部表的关键字。有很多关键字,如“big”和“csv”只对外部表有意义,所以我想我可以为它定义一个区域,只在其中突出显示它们。
例如,
syn keyword sqlXTType contained big endian csv date_format little
syn keyword sqlXTKeyword contained access are blanks data default delimited enclosed field[s] location missing newline reject parameters position terminated whitespace
syn region sqlXTParams transparent matchgroup=sqlKeyword start=+\<organization\s\+external\>+ end=+)+ contains=sqlXTType,sqlXTKeyword,Comment
" Some highlighting rules (not my actual colour scheme!)
hi sqlKeyword gui=BOLD guifg=DarkBlue guibg=NONE
hi sqlType gui=BOLD guifg=DarkCyan guibg=NONE
hi sqlXTType gui=BOLD guifg=DarkMagenta guibg=NONE
hi sqlXTKeyword gui=BOLD guifg=DarkRed guibg=NONE
以下是我希望它使用的语法示例。我故意使用像“参数”和“位置”这样的表和列名,它们只在外部表的上下文中是SQL关键字。我想只在“组织外部”条款中突出显示它们。
create table parameters
( position number(4)
, date_format varchar2(20)
, terminated char(1)
, start_date date
, values varchar2(200) )
organization external
( type oracle_loader
default directory nfs_dir
access parameters
( records delimited by newline
missing field values are null
fields terminated by "," optionally enclosed by '"' ldrtrim
all fields override
reject rows with all null fields
( pos, dt, xxx
, start_dt char(21) date_format date mask "dd-mon-yyyy hh24:mi:ss"
, zzz )
)
location ('dummy.dat')
)
parallel 1
reject limit unlimited;
然而,任何开放括号似乎都会触发sqlXTParams区域的开始(除了“组织外部”之外),并且没有任何内容终止它。我怀疑Vim的语法区域实现是期望通常与括号或引号配对的东西,而不仅仅是任何旧的文本,如“组织外部”直到结束括号,在这种情况下,这是无法完成的。
btw我正在使用此提示来识别突出显示组: http://vim.wikia.com/wiki/Identify_the_syntax_highlighting_group_used_at_the_cursor