1*df177f67SBram Moolenaar" SQL filetype plugin file 2071d4279SBram Moolenaar" Language: SQL (Common for Oracle, Microsoft SQL Server, Sybase) 3*df177f67SBram Moolenaar" Version: 0.08 4*df177f67SBram Moolenaar" Maintainer: David Fishburn <fishburn at ianywhere dot com> 5*df177f67SBram Moolenaar" Last Change: Mon Feb 21 2005 7:27:36 AM 6*df177f67SBram Moolenaar" Download: http://vim.sourceforge.net/script.php?script_id=454 7071d4279SBram Moolenaar 8071d4279SBram Moolenaar" This file should only contain values that are common to all SQL languages 9071d4279SBram Moolenaar" Oracle, Microsoft SQL Server, Sybase ASA/ASE, MySQL, and so on 10071d4279SBram Moolenaar" If additional features are required create: 11*df177f67SBram Moolenaar" vimfiles/after/ftplugin/sql.vim (Windows) 12*df177f67SBram Moolenaar" .vim/after/ftplugin/sql.vim (Unix) 13*df177f67SBram Moolenaar" to override and add any of your own settings. 14071d4279SBram Moolenaar 15071d4279SBram Moolenaar" Only do this when not done yet for this buffer 16071d4279SBram Moolenaarif exists("b:did_ftplugin") 17071d4279SBram Moolenaar finish 18071d4279SBram Moolenaarendif 19071d4279SBram Moolenaar 20*df177f67SBram Moolenaarlet s:save_cpo = &cpo 21*df177f67SBram Moolenaarset cpo= 22*df177f67SBram Moolenaar 23071d4279SBram Moolenaar" Don't load another plugin for this buffer 24071d4279SBram Moolenaarlet b:did_ftplugin = 1 25071d4279SBram Moolenaar 26*df177f67SBram Moolenaar" Some standard expressions for use with the matchit strings 27*df177f67SBram Moolenaarlet s:notend = '\%(\<end\s\+\)\@<!' 28*df177f67SBram Moolenaarlet s:when_no_matched_or_others = '\%(\<when\>\%(\s\+\%(\%(\<not\>\s\+\)\?<matched\>\)\|\<others\>\)\@!\)' 29*df177f67SBram Moolenaarlet s:or_replace = '\%(or\s\+replace\s\+\)\?' 30*df177f67SBram Moolenaar 31071d4279SBram Moolenaar" Define patterns for the matchit macro 32071d4279SBram Moolenaarif !exists("b:match_words") 33071d4279SBram Moolenaar " SQL is generally case insensitive 34071d4279SBram Moolenaar let b:match_ignorecase = 1 35*df177f67SBram Moolenaar 36*df177f67SBram Moolenaar " Handle the following: 37*df177f67SBram Moolenaar " if 38*df177f67SBram Moolenaar " elseif | elsif 39*df177f67SBram Moolenaar " else [if] 40*df177f67SBram Moolenaar " end if 41*df177f67SBram Moolenaar " 42*df177f67SBram Moolenaar " [while condition] loop 43*df177f67SBram Moolenaar " leave 44*df177f67SBram Moolenaar " break 45*df177f67SBram Moolenaar " continue 46*df177f67SBram Moolenaar " exit 47*df177f67SBram Moolenaar " end loop 48*df177f67SBram Moolenaar " 49*df177f67SBram Moolenaar " for 50*df177f67SBram Moolenaar " leave 51*df177f67SBram Moolenaar " break 52*df177f67SBram Moolenaar " continue 53*df177f67SBram Moolenaar " exit 54*df177f67SBram Moolenaar " end loop 55*df177f67SBram Moolenaar " 56*df177f67SBram Moolenaar " do 57*df177f67SBram Moolenaar " statements 58*df177f67SBram Moolenaar " doend 59*df177f67SBram Moolenaar " 60*df177f67SBram Moolenaar " case 61*df177f67SBram Moolenaar " when 62*df177f67SBram Moolenaar " when 63*df177f67SBram Moolenaar " default 64*df177f67SBram Moolenaar " end case 65*df177f67SBram Moolenaar " 66*df177f67SBram Moolenaar " merge 67*df177f67SBram Moolenaar " when not matched 68*df177f67SBram Moolenaar " when matched 69*df177f67SBram Moolenaar " 70*df177f67SBram Moolenaar " EXCEPTION 71*df177f67SBram Moolenaar " WHEN column_not_found THEN 72*df177f67SBram Moolenaar " WHEN OTHERS THEN 73*df177f67SBram Moolenaar " 74*df177f67SBram Moolenaar " create[ or replace] procedure|function|event 75*df177f67SBram Moolenaar 76071d4279SBram Moolenaar let b:match_words = 77*df177f67SBram Moolenaar \ '\<begin\>:\<end\>\W*$,'. 78*df177f67SBram Moolenaar \ 79*df177f67SBram Moolenaar \ s:notend . '\<if\>:'. 80*df177f67SBram Moolenaar \ '\<elsif\>\|\<elseif\>\|\<else\>:'. 81*df177f67SBram Moolenaar \ '\<end\s\+if\>,'. 82*df177f67SBram Moolenaar \ 83*df177f67SBram Moolenaar \ '\<do\>\|'. 84*df177f67SBram Moolenaar \ '\<while\>\|'. 85*df177f67SBram Moolenaar \ '\%(' . s:notend . '\<loop\>\)\|'. 86*df177f67SBram Moolenaar \ '\%(' . s:notend . '\<for\>\):'. 87*df177f67SBram Moolenaar \ '\<exit\>\|\<leave\>\|\<break\>\|\<continue\>:'. 88*df177f67SBram Moolenaar \ '\%(\<end\s\+\%(for\|loop\>\)\)\|\<doend\>,'. 89*df177f67SBram Moolenaar \ 90*df177f67SBram Moolenaar \ '\%('. s:notend . '\<case\>\):'. 91*df177f67SBram Moolenaar \ '\%('.s:when_no_matched_or_others.'\):'. 92*df177f67SBram Moolenaar \ '\%(\<when\s\+others\>\|\<end\s\+case\>\),' . 93*df177f67SBram Moolenaar \ 94*df177f67SBram Moolenaar \ '\<merge\>:' . 95*df177f67SBram Moolenaar \ '\<when\s\+not\s\+matched\>:' . 96*df177f67SBram Moolenaar \ '\<when\s\+matched\>,' . 97*df177f67SBram Moolenaar \ 98*df177f67SBram Moolenaar \ '\%(\<create\s\+' . s:or_replace . '\)\?'. 99*df177f67SBram Moolenaar \ '\%(function\|procedure\|event\):'. 100*df177f67SBram Moolenaar \ '\<returns\?\>' 101*df177f67SBram Moolenaar " \ '\<begin\>\|\<returns\?\>:'. 102*df177f67SBram Moolenaar " \ '\<end\>\(;\)\?\s*$' 103*df177f67SBram Moolenaar " \ '\<exception\>:'.s:when_no_matched_or_others. 104*df177f67SBram Moolenaar " \ ':\<when\s\+others\>,'. 105*df177f67SBram Moolenaar " 106*df177f67SBram Moolenaar " \ '\%(\<exception\>\|\%('. s:notend . '\<case\>\)\):'. 107*df177f67SBram Moolenaar " \ '\%(\<default\>\|'.s:when_no_matched_or_others.'\):'. 108*df177f67SBram Moolenaar " \ '\%(\%(\<when\s\+others\>\)\|\<end\s\+case\>\),' . 109071d4279SBram Moolenaarendif 110*df177f67SBram Moolenaar 111*df177f67SBram Moolenaar" Define how to find the macro definition of a variable using the various 112*df177f67SBram Moolenaar" [d, [D, [_CTRL_D and so on features 113*df177f67SBram Moolenaar" Match these values ignoring case 114*df177f67SBram Moolenaar" ie DECLARE varname INTEGER 115*df177f67SBram Moolenaarlet &l:define = '\c\(DECLARE\|IN\|OUT\|INOUT\)\s*' 116*df177f67SBram Moolenaar 117*df177f67SBram Moolenaar 118*df177f67SBram Moolenaar" Mappings to move to the next BEGIN ... END block 119*df177f67SBram Moolenaar" \W - no characters or digits 120*df177f67SBram Moolenaarnmap <buffer> <silent> ]] :call search('\c^\s*begin\>', 'W' )<CR> 121*df177f67SBram Moolenaarnmap <buffer> <silent> [[ :call search('\c^\s*begin\>', 'bW' )<CR> 122*df177f67SBram Moolenaarnmap <buffer> <silent> ][ :call search('\c^\s*end\W*$', 'W' )<CR> 123*df177f67SBram Moolenaarnmap <buffer> <silent> [] :call search('\c^\s*end\W*$', 'bW' )<CR> 124*df177f67SBram Moolenaarvmap <buffer> <silent> ]] /\c^\s*begin\><CR> 125*df177f67SBram Moolenaarvmap <buffer> <silent> [[ ?\c^\s*begin<CR> 126*df177f67SBram Moolenaarvmap <buffer> <silent> ][ /\c^\s*end\W*$<CR> 127*df177f67SBram Moolenaarvmap <buffer> <silent> [] ?\c^\s*end\W*$<CR> 128*df177f67SBram Moolenaar 129*df177f67SBram Moolenaar 130*df177f67SBram Moolenaar" Predefined SQL objects what are used by the below mappings using 131*df177f67SBram Moolenaar" the ]} style maps. 132*df177f67SBram Moolenaar" This global variable allows the users to override it's value 133*df177f67SBram Moolenaar" from within their vimrc. 134*df177f67SBram Moolenaarif !exists('g:ftplugin_sql_objects') 135*df177f67SBram Moolenaar let g:ftplugin_sql_objects = 'function,procedure,event,' . 136*df177f67SBram Moolenaar \ '\(existing\\|global\s\+temporary\s\+\)\?table,trigger' . 137*df177f67SBram Moolenaar \ ',schema,service,publication,database,datatype,domain' . 138*df177f67SBram Moolenaar \ ',index,subscription,synchronization,view,variable' 139*df177f67SBram Moolenaarendif 140*df177f67SBram Moolenaar 141*df177f67SBram Moolenaarlet s:ftplugin_sql_objects = 142*df177f67SBram Moolenaar \ '\c^\s*' . 143*df177f67SBram Moolenaar \ '\(create\s\+\(or\s\+replace\s\+\)\?\)\?' . 144*df177f67SBram Moolenaar \ '\<\(' . 145*df177f67SBram Moolenaar \ substitute(g:ftplugin_sql_objects, ',', '\\\\|', 'g') . 146*df177f67SBram Moolenaar \ '\)\>' 147*df177f67SBram Moolenaar 148*df177f67SBram Moolenaar" Mappings to move to the next CREATE ... block 149*df177f67SBram Moolenaar" map <buffer> <silent> ]} :call search(g:ftplugin_sql_objects, 'W' )<CR> 150*df177f67SBram Moolenaar" nmap <buffer> <silent> [{ :call search('\c^\s*\(create\s\+\(or\s\+replace\s\+\)\?\)\?\<\(function\\|procedure\\|event\\|table\\|trigger\\|schema\)\>', 'bW' )<CR> 151*df177f67SBram Moolenaar" exec 'nmap <buffer> <silent> ]} /'.s:ftplugin_sql_objects.'<CR>' 152*df177f67SBram Moolenaarexec "nmap <buffer> <silent> ]} :call search('".s:ftplugin_sql_objects."', 'W')<CR>" 153*df177f67SBram Moolenaarexec "nmap <buffer> <silent> [{ :call search('".s:ftplugin_sql_objects."', 'bW')<CR>" 154*df177f67SBram Moolenaar" Could not figure out how to use a :call search() string in visual mode 155*df177f67SBram Moolenaar" without it ending visual mode 156*df177f67SBram Moolenaarexec 'vmap <buffer> <silent> ]} /'.s:ftplugin_sql_objects.'<CR>' 157*df177f67SBram Moolenaarexec 'vmap <buffer> <silent> [{ ?'.s:ftplugin_sql_objects.'<CR>' 158*df177f67SBram Moolenaar" vmap <buffer> <silent> ]} /\c^\s*\(create\s\+\(or\s\+replace\s\+\)\?\)\?\<\(function\\|procedure\\|event\\|table\\|trigger\\|schema\)\><CR> 159*df177f67SBram Moolenaar" vmap <buffer> <silent> [{ ?\c^\s*\(create\s\+\(or\s\+replace\s\+\)\?\)\?\<\(function\\|procedure\\|event\\|table\\|trigger\\|schema\)\><CR> 160*df177f67SBram Moolenaar 161*df177f67SBram Moolenaar" Mappings to move to the next COMMENT 162*df177f67SBram Moolenaar" 163*df177f67SBram Moolenaar" Had to double the \ for the \| separator since this has a special 164*df177f67SBram Moolenaar" meaning on maps 165*df177f67SBram Moolenaarlet b:comment_leader = '\(--\\|\/\/\\|\*\\|\/\*\\|\*\/\)' 166*df177f67SBram Moolenaar" Find the start of the next comment 167*df177f67SBram Moolenaarlet b:comment_start = '^\(\s*'.b:comment_leader.'.*\n\)\@<!'. 168*df177f67SBram Moolenaar \ '\(\s*'.b:comment_leader.'\)' 169*df177f67SBram Moolenaar" Find the end of the previous comment 170*df177f67SBram Moolenaarlet b:comment_end = '\(^\s*'.b:comment_leader.'.*\n\)'. 171*df177f67SBram Moolenaar \ '\(^\s*'.b:comment_leader.'\)\@!' 172*df177f67SBram Moolenaar" Skip over the comment 173*df177f67SBram Moolenaarlet b:comment_jump_over = "call search('". 174*df177f67SBram Moolenaar \ '^\(\s*'.b:comment_leader.'.*\n\)\@<!'. 175*df177f67SBram Moolenaar \ "', 'W')" 176*df177f67SBram Moolenaarlet b:comment_skip_back = "call search('". 177*df177f67SBram Moolenaar \ '^\(\s*'.b:comment_leader.'.*\n\)\@<!'. 178*df177f67SBram Moolenaar \ "', 'bW')" 179*df177f67SBram Moolenaar" Move to the start and end of comments 180*df177f67SBram Moolenaarexec 'nnoremap <silent><buffer> ]" /'.b:comment_start.'<CR>' 181*df177f67SBram Moolenaarexec 'nnoremap <silent><buffer> [" /'.b:comment_end.'<CR>' 182*df177f67SBram Moolenaarexec 'vnoremap <silent><buffer> ]" /'.b:comment_start.'<CR>' 183*df177f67SBram Moolenaarexec 'vnoremap <silent><buffer> [" /'.b:comment_end.'<CR>' 184*df177f67SBram Moolenaar 185*df177f67SBram Moolenaar" Comments can be of the form: 186*df177f67SBram Moolenaar" /* 187*df177f67SBram Moolenaar" * 188*df177f67SBram Moolenaar" */ 189*df177f67SBram Moolenaar" or 190*df177f67SBram Moolenaar" // 191*df177f67SBram Moolenaar" or 192*df177f67SBram Moolenaar" -- 193*df177f67SBram Moolenaarsetlocal comments=s1:/*,mb:*,ex:*/,:--,:// 194*df177f67SBram Moolenaar 195*df177f67SBram Moolenaarlet &cpo = s:save_cpo 196*df177f67SBram Moolenaar 197*df177f67SBram Moolenaar" vim:sw=4:ff=unix: 198*df177f67SBram Moolenaar 199