我有一些Python文件,我想在其中突出显示字符串文字中的SQL查询。假设这些文件中的所有字符串文字都包含SQL查询。
我将以下语法文件保存为pysql.vim:
if exists("b:current_syntax")
finish
endif
" Include Python syntax
runtime! syntax/python.vim
unlet b:current_syntax
syn include @SQL syntax/sql.vim
syn region SQLEmbedded start=+'+ end=+'+ contains=@SQL
syn region SQLEmbedded start=+%+ end=+%+ contains=@SQL
let b:current_syntax = "pysql"
我添加了百分号的语法来检查它是否有效。
加载以下python文件(忽略第一行在Python中无效的事实):
a = %select * from mytab%
b = 'select * from mytab'
运行vim命令set syntax=pysql
。它适用于百分号内的SQL查询,但不适用于引号。奇怪的是,字符串文字后面的任何单词都会突出显示为SQL。例如,select * from mytab
中的'1' select * from mytab '2'
会突出显示。
你能在我的语法文件中找到错误吗?
答案 0 :(得分:0)
使用以下版本的vim,您的回答对我不起作用:
VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Dec 18 2015 21:31:31)
Included patches: 1-882
Modified by pkg-vim-maintainers@lists.alioth.debian.org
我修改了一下你回答。
if exists("b:current_syntax")
finish
endif
" Load Python syntax at the top level
runtime! syntax/python.vim
" Needed to make syntax/sql.vim do something
unlet b:current_syntax
" Load SQL syntax
syntax include @SQL syntax/sql.vim
" Copied from syntax/python.vim to add the keepend
syn region pythonString matchgroup=pythonQuotes
\ start=+[uU]\=\z(['"]\)+ end="\z1" skip="\\\\\|\\\z1"
\ contains=pythonEscape,@Spell keepend
syn region pythonRawString matchgroup=pythonQuotes
\ start=+[uU]\=[rR]\z(['"]\)+ end="\z1" skip="\\\\\|\\\z1"
\ contains=@Spell keepend
syn region SQLEmbedded contains=@SQL containedin=pythonString,pythonRawString contained
\ start=+\v(ALTER|BEGIN|CALL|COMMENT|COMMIT|CONNECT|CREATE|DELETE|DROP|END|EXPLAIN|EXPORT|GRANT|IMPORT|INSERT|LOAD|LOCK|MERGE|REFRESH|RENAME|REPLACE|REVOKE|ROLLBACK|SELECT|SET|TRUNCATE|UNLOAD|UNSET|UPDATE|UPSERT)+
\ end=+;+
let b:current_syntax = "pysql"
使用它,突出显示从给定的SQL关键字之一开始,并在第一个;
处停止,并且可以在下一个SQL关键字上重新启动,或者在python字符串的末尾停止(请参阅keepend
)。