2011-02-02 19 views

回答

10

我從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色墨水墨盒方案中看起來很甜美。

而且相關:Embedded syntax highligting in Vim

+0

好的,綠色很爛,但主意很好 – 2011-02-02 11:43:57

1

你可以試試下面的選項上的文件:
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> 
+0

au contraire,它將sql語法應用於python代碼,並且字符串是純文本的。 – 2011-02-02 10:47:56

1

我知道有一個公認的答案,不過,這裏是這樣做的另一種方式:

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

相關問題