Могу ли я использовать подсветку синтаксиса 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