我在Python程序內部使用多行字符串進行SQL查詢。我可以在Vim的同一個文件中同時使用Python和SQL語法高亮顯示嗎?
有沒有辦法告訴Vim在其中應用不同的高亮規則,可能是使用--SQL
標記?
我在Python程序內部使用多行字符串進行SQL查詢。我可以在Vim的同一個文件中同時使用Python和SQL語法高亮顯示嗎?
有沒有辦法告訴Vim在其中應用不同的高亮規則,可能是使用--SQL
標記?
我從here複製粘貼,更改:
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.'"
\ [email protected]'.group
endfunction
au FileType python call TextEnableCodeSnip('sqlpostgres', "'''", "'''", 'SpecialComment')
現在每多三單引號字符串獲取sql語法。三雙引號字符串仍然很簡單。我已經改變了sqlpostgres.vim以提供SQL的細微差別來區分這兩種語言,並且它在256色墨水墨盒方案中看起來很甜美。
你可以試試下面的選項上的文件:
setfiletype=python.sql
它使兩個文件類型到您的文件,並應適用於語法高亮。
它是否適合你,你可以將下面一行添加到您的.vimrc
將其應用到每次Python文件編輯:
autocmd BufRead,BufNewFile *.py setfiletype=python.sql
但是,它並沒有真正處理之間的衝突兩個亮點小組...所以它可以或不可以在你的情況下工作。
你也可以創建一個函數來快速切換打開的緩衝區的文件類型:
function! ToggleFiletype()
if &filetype=="sql"
set filetype=python
endif
if &filetype=="python"
set filetype=sql
endif
endfunction
map <F11> <Esc>:call ToggleFiletype()<cr>
au contraire,它將sql語法應用於python代碼,並且字符串是純文本的。 – 2011-02-02 10:47:56
我知道有一個公認的答案,不過,這裏是這樣做的另一種方式:
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"
\ [email protected] keepend
syn region SQLEmbedded [email protected] 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
)。
好的,綠色很爛,但主意很好 – 2011-02-02 11:43:57