Могу ли я использовать подсветку синтаксиса Python и SQL в одном файле в Vim?
Я использую многострочные строки для SQL-запросов внутри программ Python.
есть ли способ сказать Vim применять различные правила подсветки внутри них, возможно, используя --SQL
маркер?
3 ответов
Я скопировал-вставил-изменен с здесь:
function! TextEnableCodeSnip(filetype,start,end,textSnipHl) abort
let ft=toupper(a:filetype)
let group='textGroup'.ft
if exists('b:current_syntax')
let s:current_syntax=b:current_syntax
" Remove current syntax definition, as some syntax files (e.g. cpp.vim)
" do nothing if b:current_syntax is defined.
unlet b:current_syntax
endif
execute 'syntax include @'.group.' syntax/'.a:filetype.'.vim'
try
execute 'syntax include @'.group.' after/syntax/'.a:filetype.'.vim'
catch
endtry
if exists('s:current_syntax')
let b:current_syntax=s:current_syntax
else
unlet b:current_syntax
endif
execute 'syntax region textSnip'.ft.'
\ matchgroup='.a:textSnipHl.'
\ start="'.a:start.'" end="'.a:end.'"
\ contains=@'.group
endfunction
au FileType python call TextEnableCodeSnip('sqlpostgres', "'''", "'''", 'SpecialComment')
теперь каждая строка многострочной тройной одинарной кавычки получает синтаксис sql. Трипл-дабл-в кавычках по-прежнему простой. Я изменил sqlpostgres.vim, чтобы дать SQL нюансы зеленого цвета, чтобы дифференцировать два языка, и это выглядит сладко в схеме чернильницы 256 цветов.
также по теме: встроенный синтаксис highligting в Vim
Я знаю, что есть принятый ответ, но все равно, вот еще один способ сделать это:
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
" Need to add the keepend here
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
).
вы можете попробовать следующую опцию в своем файле:setfiletype=python.sql
Он дает оба типа файлов для вашего файла и должен применять подсветку синтаксиса.
если это работает для вас, вы можете добавить следующую строку .vimrc
чтобы применить его к каждому файлу python, который вы редактируете:
autocmd BufRead,BufNewFile *.py setfiletype=python.sql
однако на самом деле он не имеет дело с конфликтом между двумя группами подсветки...поэтому он может или не может работать в вашем случае.
вы также можно создать функцию для быстрого переключения типа файла открытого буфера:
function! ToggleFiletype()
if &filetype=="sql"
set filetype=python
endif