2011-02-02 12 views
8

मैं पाइथन प्रोग्राम के अंदर SQL क्वेरी के लिए मल्टीलाइन स्ट्रिंग का उपयोग करता हूं।क्या मैं विम में एक ही फाइल में पाइथन और एसक्यूएल सिंटैक्स दोनों हाइलाइटिंग का उपयोग कर सकता हूं?

क्या विम को --SQL मार्कर का उपयोग करके संभवतः उनके अंदर विभिन्न हाइलाइटिंग नियम लागू करने का कोई तरीका है?

उत्तर

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.'" 
    \ co[email protected]'.group 
endfunction 

au FileType python call TextEnableCodeSnip('sqlpostgres', "'''", "'''", 'SpecialComment') 
अब हर बहु ​​ट्रिपल एकल

उद्धरण स्ट्रिंग एसक्यूएल वाक्यविन्यास हो जाता है। ट्रिपल-डबल-उद्धृत तार अभी भी सादे हैं। मैंने sqlpostgres.vim को दो भाषाओं को अलग करने के लिए हरे रंग की एसक्यूएल बारीकियों को बदलने के लिए बदल दिया है, और यह 256 रंग इंकपॉट योजना में मीठा दिखता है।

भी संबंधित हैं: Embedded syntax highligting in Vim

+0

ठीक है, हरा बेकार है, लेकिन विचार ध्वनि है –

+0

मैं इसका उपयोग कैसे करूं? – skyler

1

आप अपनी फ़ाइल पर निम्नलिखित विकल्प का प्रयास कर सकते हैं:
setfiletype=python.sql

यह अपने फाइल करने के लिए दोनों फ़ाइल प्रकार देता है, और दोनों वाक्य रचना हाइलाइटिंग लागू करना चाहिए।

यह आप के लिए काम करता है, तो आप अपने .vimrc के लिए निम्न पंक्ति जोड़ सकते हैं हर यह अजगर फाइल करने के लिए इसे लागू करने के लिए आप संपादित:

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

हालांकि, यह वास्तव में के बीच संघर्ष से निपटने के नहीं है दो हाइलाइट समूह ... तो यह आपके मामले में काम कर सकता है या नहीं कर सका।

आप तेज़ी से अपना खुला बफर के filetype टॉगल करने के लिए एक समारोह बना सकते हैं:

function! ToggleFiletype() 
    if &filetype=="sql" 
    set filetype=python 
    endif 

    if &filetype=="python" 
    set filetype=sql 
    endif 
endfunction 

map <F11> <Esc>:call ToggleFiletype()<cr> 
+0

एयू contraire, यह पायथन कोड के लिए एसक्यूएल वाक्यविन्यास लागू होता है, और तार सादे हैं। –

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 कीवर्ड पर पुनरारंभ कर सकता है, या पायथन स्ट्रिंग के अंत में बंद हो जाता है (keepend देखें)।

संबंधित मुद्दे

 संबंधित मुद्दे