在Python字符串文字中突出显示SQL

时间:2015-04-22 07:57:49

标签: vim vim-syntax-highlighting

我有一些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'会突出显示。

你能在我的语法文件中找到错误吗?

1 个答案:

答案 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 )。