2011-02-02 30 views

Trả lời

10

sao chép-dán-thay đổi từ 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') 

Bây giờ mỗi multiline triple-đơn chuỗi trích dẫn nhận cú pháp sql. Các chuỗi được trích dẫn gấp đôi vẫn còn đơn giản. Tôi đã thay đổi sqlpostgres.vim để cung cấp cho SQL sắc thái của màu xanh lá cây để phân biệt hai ngôn ngữ, và nó trông ngọt ngào trong chương trình mực in 256 màu.

Cũng liên quan: Embedded syntax highligting in Vim

+0

ok, màu xanh lá cây hút, nhưng ý tưởng là âm thanh –

+0

Làm cách nào để sử dụng? – skyler

1

Bạn có thể thử các tùy chọn sau đây trong hồ sơ của bạn:
setfiletype=python.sql

Nó cung cấp cho cả hai loại tập tin vào tập tin của bạn, và nên áp dụng cả hai làm nổi bật cú pháp.

Nếu nó làm việc cho bạn, bạn có thể thêm các dòng sau vào .vimrc của bạn để áp dụng nó vào mỗi nó file python bạn chỉnh sửa:

autocmd BufRead,BufNewFile *.py setfiletype=python.sql

Tuy nhiên, nó không thực sự đối phó với xung đột giữa hai nhóm nổi bật ... Vì vậy, nó có thể hoặc không thể làm việc trong trường hợp của bạn.

Bạn cũng có thể tạo ra một chức năng để nhanh chóng chuyển đổi các filetype của bộ đệm mở của bạn:

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, nó áp dụng cú pháp sql cho mã python và các chuỗi là đồng bằng. –

1

Tôi biết có một câu trả lời được chấp nhận, nhưng vẫn còn, đây là một cách khác để làm việc đó:

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" 

Cùng với đó, làm nổi bật bắt đầu tại một trong các từ khóa SQL nhất định và dừng lại ở số ; đầu tiên và có thể khởi động lại từ khóa SQL tiếp theo hoặc dừng ở cuối chuỗi python (xem keepend).

Các vấn đề liên quan