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

2023-12-29

我有一些 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 in '1' select * from mytab '2'被突出显示。

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


我发现了一个提示https://github.com/krisajenkins/vim-java-sql/blob/master/after/syntax/java.vim https://github.com/krisajenkins/vim-java-sql/blob/master/after/syntax/java.vim。我的语法不起作用的原因是它干扰了 sql.vim 中的 sqlString 组。我按如下方式更改了语法,现在效果很好:

if exists("b:current_syntax")
  finish
endif

" Load Python syntax at the top level
runtime! syntax/python.vim
unlet b:current_syntax

" Load SQL syntax
syn include @SQL syntax/sql.vim

" Reference: https://github.com/krisajenkins/vim-java-sql/blob/master/after/syntax/java.vim
" Take care not to consume the double-quotes (\zs & \ze)
" Case-insensitive (no \C)
syn region SQLEmbedded start=+\z(['"]\)\zs[\s\n]*\v(ALTER|CALL|COMMENT|COMMIT|CONNECT|CREATE|DELETE|DROP|EXPLAIN|EXPORT|GRANT|IMPORT|INSERT|LOAD|LOCK|MERGE|REFRESH|RENAME|REPLACE|REVOKE|ROLLBACK|SELECT|SET|TRUNCATE|UNLOAD|UNSET|UPDATE|UPSERT)+ skip=+\\\z1+ end=+\ze\z1+ contains=@SQL containedin=pythonString

let b:current_syntax = "pysql"
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

突出显示 Python 字符串文字中的 SQL 的相关文章

随机推荐