1df177f67SBram Moolenaar" SQL filetype plugin file 2071d4279SBram Moolenaar" Language: SQL (Common for Oracle, Microsoft SQL Server, Sybase) 3*f9d5ca1dSBram Moolenaar" Version: 7.0 4df177f67SBram Moolenaar" Maintainer: David Fishburn <fishburn at ianywhere dot com> 5*f9d5ca1dSBram Moolenaar" Last Change: 2010 Jun 11 6df177f67SBram Moolenaar" Download: http://vim.sourceforge.net/script.php?script_id=454 7071d4279SBram Moolenaar 80fd9289dSBram Moolenaar" For more details please use: 90fd9289dSBram Moolenaar" :h sql.txt 100fd9289dSBram Moolenaar" 11071d4279SBram Moolenaar" This file should only contain values that are common to all SQL languages 12071d4279SBram Moolenaar" Oracle, Microsoft SQL Server, Sybase ASA/ASE, MySQL, and so on 13071d4279SBram Moolenaar" If additional features are required create: 14df177f67SBram Moolenaar" vimfiles/after/ftplugin/sql.vim (Windows) 15df177f67SBram Moolenaar" .vim/after/ftplugin/sql.vim (Unix) 16df177f67SBram Moolenaar" to override and add any of your own settings. 17071d4279SBram Moolenaar 180fd9289dSBram Moolenaar 190fd9289dSBram Moolenaar" This file also creates a command, SQLSetType, which allows you to change 200fd9289dSBram Moolenaar" SQL dialects on the fly. For example, if I open an Oracle SQL file, it 210fd9289dSBram Moolenaar" is color highlighted appropriately. If I open an Informix SQL file, it 220fd9289dSBram Moolenaar" will still be highlighted according to Oracles settings. By running: 230fd9289dSBram Moolenaar" :SQLSetType sqlinformix 240fd9289dSBram Moolenaar" 250fd9289dSBram Moolenaar" All files called sqlinformix.vim will be loaded from the indent and syntax 260fd9289dSBram Moolenaar" directories. This allows you to easily flip SQL dialects on a per file 270fd9289dSBram Moolenaar" basis. NOTE: you can also use completion: 280fd9289dSBram Moolenaar" :SQLSetType <tab> 290fd9289dSBram Moolenaar" 300fd9289dSBram Moolenaar" To change the default dialect, add the following to your vimrc: 310fd9289dSBram Moolenaar" let g:sql_type_default = 'sqlanywhere' 325c73622aSBram Moolenaar" 335c73622aSBram Moolenaar" This file also creates a command, SQLGetType, which allows you to 345c73622aSBram Moolenaar" determine what the current dialect is in use. 355c73622aSBram Moolenaar" :SQLGetType 365c73622aSBram Moolenaar" 375c73622aSBram Moolenaar" History 385c73622aSBram Moolenaar" 39*f9d5ca1dSBram Moolenaar" Version 7.0 40*f9d5ca1dSBram Moolenaar" 41*f9d5ca1dSBram Moolenaar" NF: Calls the sqlcomplete#ResetCacheSyntax() function when calling 42*f9d5ca1dSBram Moolenaar" SQLSetType. 43*f9d5ca1dSBram Moolenaar" 445c73622aSBram Moolenaar" Version 6.0 455c73622aSBram Moolenaar" 465c73622aSBram Moolenaar" NF: Adds the command SQLGetType 475c73622aSBram Moolenaar" 485c73622aSBram Moolenaar" Version 5.0 495c73622aSBram Moolenaar" 505c73622aSBram Moolenaar" NF: Adds the ability to choose the keys to control SQL completion, just add 515c73622aSBram Moolenaar" the following to your .vimrc: 525c73622aSBram Moolenaar" let g:ftplugin_sql_omni_key = '<C-C>' 535c73622aSBram Moolenaar" let g:ftplugin_sql_omni_key_right = '<Right>' 545c73622aSBram Moolenaar" let g:ftplugin_sql_omni_key_left = '<Left>' 555c73622aSBram Moolenaar" 565c73622aSBram Moolenaar" BF: format-options - Auto-wrap comments using textwidth was turned off 575c73622aSBram Moolenaar" by mistake. 580fd9289dSBram Moolenaar 590fd9289dSBram Moolenaar 60071d4279SBram Moolenaar" Only do this when not done yet for this buffer 61071d4279SBram Moolenaarif exists("b:did_ftplugin") 62071d4279SBram Moolenaar finish 63071d4279SBram Moolenaarendif 64071d4279SBram Moolenaar 65df177f67SBram Moolenaarlet s:save_cpo = &cpo 66df177f67SBram Moolenaarset cpo= 67df177f67SBram Moolenaar 683577c6faSBram Moolenaar" Disable autowrapping for code, but enable for comments 693577c6faSBram Moolenaar" t Auto-wrap text using textwidth 703577c6faSBram Moolenaar" c Auto-wrap comments using textwidth, inserting the current comment 713577c6faSBram Moolenaar" leader automatically. 723577c6faSBram Moolenaarsetlocal formatoptions-=t 735c73622aSBram Moolenaarsetlocal formatoptions+=c 743577c6faSBram Moolenaar 750fd9289dSBram Moolenaar" Functions/Commands to allow the user to change SQL syntax dialects 760fd9289dSBram Moolenaar" through the use of :SQLSetType <tab> for completion. 770fd9289dSBram Moolenaar" This works with both Vim 6 and 7. 780fd9289dSBram Moolenaar 790fd9289dSBram Moolenaarif !exists("*SQL_SetType") 800fd9289dSBram Moolenaar " NOTE: You cannot use function! since this file can be 810fd9289dSBram Moolenaar " sourced from within this function. That will result in 820fd9289dSBram Moolenaar " an error reported by Vim. 830fd9289dSBram Moolenaar function SQL_GetList(ArgLead, CmdLine, CursorPos) 840fd9289dSBram Moolenaar 850fd9289dSBram Moolenaar if !exists('s:sql_list') 860fd9289dSBram Moolenaar " Grab a list of files that contain "sql" in their names 870fd9289dSBram Moolenaar let list_indent = globpath(&runtimepath, 'indent/*sql*') 880fd9289dSBram Moolenaar let list_syntax = globpath(&runtimepath, 'syntax/*sql*') 890fd9289dSBram Moolenaar let list_ftplugin = globpath(&runtimepath, 'ftplugin/*sql*') 900fd9289dSBram Moolenaar 910fd9289dSBram Moolenaar let sqls = "\n".list_indent."\n".list_syntax."\n".list_ftplugin."\n" 920fd9289dSBram Moolenaar 930fd9289dSBram Moolenaar " Strip out everything (path info) but the filename 940fd9289dSBram Moolenaar " Regex 950fd9289dSBram Moolenaar " From between two newline characters 960fd9289dSBram Moolenaar " Non-greedily grab all characters 970fd9289dSBram Moolenaar " Followed by a valid filename \w\+\.\w\+ (sql.vim) 980fd9289dSBram Moolenaar " Followed by a newline, but do not include the newline 990fd9289dSBram Moolenaar " 1000fd9289dSBram Moolenaar " Replace it with just the filename (get rid of PATH) 1010fd9289dSBram Moolenaar " 1020fd9289dSBram Moolenaar " Recursively, since there are many filenames that contain 1030fd9289dSBram Moolenaar " the word SQL in the indent, syntax and ftplugin directory 1040fd9289dSBram Moolenaar let sqls = substitute( sqls, 1050fd9289dSBram Moolenaar \ '[\n]\%(.\{-}\)\(\w\+\.\w\+\)\n\@=', 1060fd9289dSBram Moolenaar \ '\1\n', 1070fd9289dSBram Moolenaar \ 'g' 1080fd9289dSBram Moolenaar \ ) 1090fd9289dSBram Moolenaar 1100fd9289dSBram Moolenaar " Remove duplicates, since sqlanywhere.vim can exist in the 1110fd9289dSBram Moolenaar " sytax, indent and ftplugin directory, yet we only want 1120fd9289dSBram Moolenaar " to display the option once 1130fd9289dSBram Moolenaar let index = match(sqls, '.\{-}\ze\n') 1140fd9289dSBram Moolenaar while index > -1 1150fd9289dSBram Moolenaar " Get the first filename 1160fd9289dSBram Moolenaar let file = matchstr(sqls, '.\{-}\ze\n', index) 1170fd9289dSBram Moolenaar " Recursively replace any *other* occurrence of that 1180fd9289dSBram Moolenaar " filename with nothing (ie remove it) 1190fd9289dSBram Moolenaar let sqls = substitute(sqls, '\%>'.(index+strlen(file)).'c\<'.file.'\>\n', '', 'g') 1200fd9289dSBram Moolenaar " Move on to the next filename 1210fd9289dSBram Moolenaar let index = match(sqls, '.\{-}\ze\n', (index+strlen(file)+1)) 1220fd9289dSBram Moolenaar endwhile 1230fd9289dSBram Moolenaar 1240fd9289dSBram Moolenaar " Sort the list if using version 7 1250fd9289dSBram Moolenaar if v:version >= 700 1260fd9289dSBram Moolenaar let mylist = split(sqls, "\n") 1270fd9289dSBram Moolenaar let mylist = sort(mylist) 1280fd9289dSBram Moolenaar let sqls = join(mylist, "\n") 1290fd9289dSBram Moolenaar endif 1300fd9289dSBram Moolenaar 1310fd9289dSBram Moolenaar let s:sql_list = sqls 1320fd9289dSBram Moolenaar endif 1330fd9289dSBram Moolenaar 1340fd9289dSBram Moolenaar return s:sql_list 1350fd9289dSBram Moolenaar 1360fd9289dSBram Moolenaar endfunction 1370fd9289dSBram Moolenaar 1380fd9289dSBram Moolenaar function SQL_SetType(name) 1390fd9289dSBram Moolenaar 1400fd9289dSBram Moolenaar " User has decided to override default SQL scripts and 1410fd9289dSBram Moolenaar " specify a vendor specific version 1420fd9289dSBram Moolenaar " (ie Oracle, Informix, SQL Anywhere, ...) 1430fd9289dSBram Moolenaar " So check for an remove any settings that prevent the 1440fd9289dSBram Moolenaar " scripts from being executed, and then source the 1450fd9289dSBram Moolenaar " appropriate Vim scripts. 1460fd9289dSBram Moolenaar if exists("b:did_ftplugin") 1470fd9289dSBram Moolenaar unlet b:did_ftplugin 1480fd9289dSBram Moolenaar endif 1490fd9289dSBram Moolenaar if exists("b:current_syntax") 1500fd9289dSBram Moolenaar " echomsg 'SQLSetType - clearing syntax' 1510fd9289dSBram Moolenaar syntax clear 1520fd9289dSBram Moolenaar endif 1530fd9289dSBram Moolenaar if exists("b:did_indent") 1540fd9289dSBram Moolenaar " echomsg 'SQLSetType - clearing indent' 1550fd9289dSBram Moolenaar unlet b:did_indent 1560fd9289dSBram Moolenaar " Set these values to their defaults 1570fd9289dSBram Moolenaar setlocal indentkeys& 1580fd9289dSBram Moolenaar setlocal indentexpr& 1590fd9289dSBram Moolenaar endif 1600fd9289dSBram Moolenaar 1610fd9289dSBram Moolenaar " Ensure the name is in the correct format 1620fd9289dSBram Moolenaar let new_sql_type = substitute(a:name, 1630fd9289dSBram Moolenaar \ '\s*\([^\.]\+\)\(\.\w\+\)\?', '\L\1', '') 1640fd9289dSBram Moolenaar 1650fd9289dSBram Moolenaar " Do not specify a buffer local variable if it is 1660fd9289dSBram Moolenaar " the default value 1670fd9289dSBram Moolenaar if new_sql_type == 'sql' 1680fd9289dSBram Moolenaar let new_sql_type = 'sqloracle' 1690fd9289dSBram Moolenaar endif 1700fd9289dSBram Moolenaar let b:sql_type_override = new_sql_type 1710fd9289dSBram Moolenaar 172*f9d5ca1dSBram Moolenaar " Remove any cached SQL since a new sytax will have different 173*f9d5ca1dSBram Moolenaar " items and groups 174*f9d5ca1dSBram Moolenaar if !exists('g:loaded_sql_completion') || 100 == g:loaded_sql_completion 175*f9d5ca1dSBram Moolenaar call sqlcomplete#ResetCacheSyntax() 176*f9d5ca1dSBram Moolenaar endif 177*f9d5ca1dSBram Moolenaar 1780fd9289dSBram Moolenaar " Vim will automatically source the correct files if we 1790fd9289dSBram Moolenaar " change the filetype. You cannot do this with setfiletype 1800fd9289dSBram Moolenaar " since that command will only execute if a filetype has 1810fd9289dSBram Moolenaar " not already been set. In this case we want to override 1820fd9289dSBram Moolenaar " the existing filetype. 1830fd9289dSBram Moolenaar let &filetype = 'sql' 184*f9d5ca1dSBram Moolenaar 185*f9d5ca1dSBram Moolenaar if b:sql_compl_savefunc != "" 186*f9d5ca1dSBram Moolenaar " We are changing the filetype to SQL from some other filetype 187*f9d5ca1dSBram Moolenaar " which had OMNI completion defined. We need to activate the 188*f9d5ca1dSBram Moolenaar " SQL completion plugin in order to cache some of the syntax items 189*f9d5ca1dSBram Moolenaar " while the syntax rules for SQL are active. 190*f9d5ca1dSBram Moolenaar call sqlcomplete#PreCacheSyntax() 191*f9d5ca1dSBram Moolenaar endif 1920fd9289dSBram Moolenaar endfunction 1930fd9289dSBram Moolenaar command! -nargs=* -complete=custom,SQL_GetList SQLSetType :call SQL_SetType(<q-args>) 1940fd9289dSBram Moolenaar 1950fd9289dSBram Moolenaarendif 1960fd9289dSBram Moolenaar 1975c73622aSBram Moolenaar" Functions/Commands to allow the user determine current SQL syntax dialect 1985c73622aSBram Moolenaar" This works with both Vim 6 and 7. 1995c73622aSBram Moolenaar 2005c73622aSBram Moolenaarif !exists("*SQL_GetType") 2015c73622aSBram Moolenaar function SQL_GetType() 2025c73622aSBram Moolenaar if exists('b:sql_type_override') 2035c73622aSBram Moolenaar echomsg "Current SQL dialect in use:".b:sql_type_override 2045c73622aSBram Moolenaar else 2055c73622aSBram Moolenaar echomsg "Current SQL dialect in use:".g:sql_type_default 2065c73622aSBram Moolenaar endif 2075c73622aSBram Moolenaar endfunction 2085c73622aSBram Moolenaar command! -nargs=0 SQLGetType :call SQL_GetType() 2095c73622aSBram Moolenaarendif 2105c73622aSBram Moolenaar 2110fd9289dSBram Moolenaarif exists("b:sql_type_override") 2120fd9289dSBram Moolenaar " echo 'sourcing buffer ftplugin/'.b:sql_type_override.'.vim' 2130fd9289dSBram Moolenaar if globpath(&runtimepath, 'ftplugin/'.b:sql_type_override.'.vim') != '' 2140fd9289dSBram Moolenaar exec 'runtime ftplugin/'.b:sql_type_override.'.vim' 2150fd9289dSBram Moolenaar " else 2160fd9289dSBram Moolenaar " echomsg 'ftplugin/'.b:sql_type_override.' not exist, using default' 2170fd9289dSBram Moolenaar endif 2180fd9289dSBram Moolenaarelseif exists("g:sql_type_default") 2190fd9289dSBram Moolenaar " echo 'sourcing global ftplugin/'.g:sql_type_default.'.vim' 2200fd9289dSBram Moolenaar if globpath(&runtimepath, 'ftplugin/'.g:sql_type_default.'.vim') != '' 2210fd9289dSBram Moolenaar exec 'runtime ftplugin/'.g:sql_type_default.'.vim' 2220fd9289dSBram Moolenaar " else 2230fd9289dSBram Moolenaar " echomsg 'ftplugin/'.g:sql_type_default.'.vim not exist, using default' 2240fd9289dSBram Moolenaar endif 2250fd9289dSBram Moolenaarendif 2260fd9289dSBram Moolenaar 2270fd9289dSBram Moolenaar" If the above runtime command succeeded, do not load the default settings 2280fd9289dSBram Moolenaarif exists("b:did_ftplugin") 2290fd9289dSBram Moolenaar finish 2300fd9289dSBram Moolenaarendif 2310fd9289dSBram Moolenaar 2320fd9289dSBram Moolenaarlet b:undo_ftplugin = "setl comments<" 2330fd9289dSBram Moolenaar 234071d4279SBram Moolenaar" Don't load another plugin for this buffer 235071d4279SBram Moolenaarlet b:did_ftplugin = 1 2360fd9289dSBram Moolenaarlet b:current_ftplugin = 'sql' 2370fd9289dSBram Moolenaar 2380fd9289dSBram Moolenaar" Win32 can filter files in the browse dialog 2390fd9289dSBram Moolenaarif has("gui_win32") && !exists("b:browsefilter") 2400fd9289dSBram Moolenaar let b:browsefilter = "SQL Files (*.sql)\t*.sql\n" . 2410fd9289dSBram Moolenaar \ "All Files (*.*)\t*.*\n" 2420fd9289dSBram Moolenaarendif 243071d4279SBram Moolenaar 244df177f67SBram Moolenaar" Some standard expressions for use with the matchit strings 245df177f67SBram Moolenaarlet s:notend = '\%(\<end\s\+\)\@<!' 246df177f67SBram Moolenaarlet s:when_no_matched_or_others = '\%(\<when\>\%(\s\+\%(\%(\<not\>\s\+\)\?<matched\>\)\|\<others\>\)\@!\)' 247df177f67SBram Moolenaarlet s:or_replace = '\%(or\s\+replace\s\+\)\?' 248df177f67SBram Moolenaar 249071d4279SBram Moolenaar" Define patterns for the matchit macro 250071d4279SBram Moolenaarif !exists("b:match_words") 251071d4279SBram Moolenaar " SQL is generally case insensitive 252071d4279SBram Moolenaar let b:match_ignorecase = 1 253df177f67SBram Moolenaar 254df177f67SBram Moolenaar " Handle the following: 255df177f67SBram Moolenaar " if 256df177f67SBram Moolenaar " elseif | elsif 257df177f67SBram Moolenaar " else [if] 258df177f67SBram Moolenaar " end if 259df177f67SBram Moolenaar " 260df177f67SBram Moolenaar " [while condition] loop 261df177f67SBram Moolenaar " leave 262df177f67SBram Moolenaar " break 263df177f67SBram Moolenaar " continue 264df177f67SBram Moolenaar " exit 265df177f67SBram Moolenaar " end loop 266df177f67SBram Moolenaar " 267df177f67SBram Moolenaar " for 268df177f67SBram Moolenaar " leave 269df177f67SBram Moolenaar " break 270df177f67SBram Moolenaar " continue 271df177f67SBram Moolenaar " exit 272df177f67SBram Moolenaar " end loop 273df177f67SBram Moolenaar " 274df177f67SBram Moolenaar " do 275df177f67SBram Moolenaar " statements 276df177f67SBram Moolenaar " doend 277df177f67SBram Moolenaar " 278df177f67SBram Moolenaar " case 279df177f67SBram Moolenaar " when 280df177f67SBram Moolenaar " when 281df177f67SBram Moolenaar " default 282df177f67SBram Moolenaar " end case 283df177f67SBram Moolenaar " 284df177f67SBram Moolenaar " merge 285df177f67SBram Moolenaar " when not matched 286df177f67SBram Moolenaar " when matched 287df177f67SBram Moolenaar " 288df177f67SBram Moolenaar " EXCEPTION 289df177f67SBram Moolenaar " WHEN column_not_found THEN 290df177f67SBram Moolenaar " WHEN OTHERS THEN 291df177f67SBram Moolenaar " 292df177f67SBram Moolenaar " create[ or replace] procedure|function|event 293df177f67SBram Moolenaar 294071d4279SBram Moolenaar let b:match_words = 295df177f67SBram Moolenaar \ '\<begin\>:\<end\>\W*$,'. 296df177f67SBram Moolenaar \ 297df177f67SBram Moolenaar \ s:notend . '\<if\>:'. 298df177f67SBram Moolenaar \ '\<elsif\>\|\<elseif\>\|\<else\>:'. 299df177f67SBram Moolenaar \ '\<end\s\+if\>,'. 300df177f67SBram Moolenaar \ 301df177f67SBram Moolenaar \ '\<do\>\|'. 302df177f67SBram Moolenaar \ '\<while\>\|'. 303df177f67SBram Moolenaar \ '\%(' . s:notend . '\<loop\>\)\|'. 304df177f67SBram Moolenaar \ '\%(' . s:notend . '\<for\>\):'. 305df177f67SBram Moolenaar \ '\<exit\>\|\<leave\>\|\<break\>\|\<continue\>:'. 306df177f67SBram Moolenaar \ '\%(\<end\s\+\%(for\|loop\>\)\)\|\<doend\>,'. 307df177f67SBram Moolenaar \ 308df177f67SBram Moolenaar \ '\%('. s:notend . '\<case\>\):'. 309df177f67SBram Moolenaar \ '\%('.s:when_no_matched_or_others.'\):'. 310df177f67SBram Moolenaar \ '\%(\<when\s\+others\>\|\<end\s\+case\>\),' . 311df177f67SBram Moolenaar \ 312df177f67SBram Moolenaar \ '\<merge\>:' . 313df177f67SBram Moolenaar \ '\<when\s\+not\s\+matched\>:' . 314df177f67SBram Moolenaar \ '\<when\s\+matched\>,' . 315df177f67SBram Moolenaar \ 316df177f67SBram Moolenaar \ '\%(\<create\s\+' . s:or_replace . '\)\?'. 317df177f67SBram Moolenaar \ '\%(function\|procedure\|event\):'. 318df177f67SBram Moolenaar \ '\<returns\?\>' 319df177f67SBram Moolenaar " \ '\<begin\>\|\<returns\?\>:'. 320df177f67SBram Moolenaar " \ '\<end\>\(;\)\?\s*$' 321df177f67SBram Moolenaar " \ '\<exception\>:'.s:when_no_matched_or_others. 322df177f67SBram Moolenaar " \ ':\<when\s\+others\>,'. 323df177f67SBram Moolenaar " 324df177f67SBram Moolenaar " \ '\%(\<exception\>\|\%('. s:notend . '\<case\>\)\):'. 325df177f67SBram Moolenaar " \ '\%(\<default\>\|'.s:when_no_matched_or_others.'\):'. 326df177f67SBram Moolenaar " \ '\%(\%(\<when\s\+others\>\)\|\<end\s\+case\>\),' . 327071d4279SBram Moolenaarendif 328df177f67SBram Moolenaar 329df177f67SBram Moolenaar" Define how to find the macro definition of a variable using the various 330df177f67SBram Moolenaar" [d, [D, [_CTRL_D and so on features 331df177f67SBram Moolenaar" Match these values ignoring case 332df177f67SBram Moolenaar" ie DECLARE varname INTEGER 3330fd9289dSBram Moolenaarlet &l:define = '\c\<\(VARIABLE\|DECLARE\|IN\|OUT\|INOUT\)\>' 334df177f67SBram Moolenaar 335df177f67SBram Moolenaar 336df177f67SBram Moolenaar" Mappings to move to the next BEGIN ... END block 337df177f67SBram Moolenaar" \W - no characters or digits 3380fd9289dSBram Moolenaarnmap <buffer> <silent> ]] :call search('\\c^\\s*begin\\>', 'W' )<CR> 3390fd9289dSBram Moolenaarnmap <buffer> <silent> [[ :call search('\\c^\\s*begin\\>', 'bW' )<CR> 3400fd9289dSBram Moolenaarnmap <buffer> <silent> ][ :call search('\\c^\\s*end\\W*$', 'W' )<CR> 3410fd9289dSBram Moolenaarnmap <buffer> <silent> [] :call search('\\c^\\s*end\\W*$', 'bW' )<CR> 3423577c6faSBram Moolenaarvmap <buffer> <silent> ]] :<C-U>exec "normal! gv"<Bar>call search('\\c^\\s*begin\\>', 'W' )<CR> 3433577c6faSBram Moolenaarvmap <buffer> <silent> [[ :<C-U>exec "normal! gv"<Bar>call search('\\c^\\s*begin\\>', 'bW' )<CR> 3443577c6faSBram Moolenaarvmap <buffer> <silent> ][ :<C-U>exec "normal! gv"<Bar>call search('\\c^\\s*end\\W*$', 'W' )<CR> 3453577c6faSBram Moolenaarvmap <buffer> <silent> [] :<C-U>exec "normal! gv"<Bar>call search('\\c^\\s*end\\W*$', 'bW' )<CR> 346df177f67SBram Moolenaar 347df177f67SBram Moolenaar 3480fd9289dSBram Moolenaar" By default only look for CREATE statements, but allow 3490fd9289dSBram Moolenaar" the user to override 3500fd9289dSBram Moolenaarif !exists('g:ftplugin_sql_statements') 3510fd9289dSBram Moolenaar let g:ftplugin_sql_statements = 'create' 3520fd9289dSBram Moolenaarendif 3530fd9289dSBram Moolenaar 354df177f67SBram Moolenaar" Predefined SQL objects what are used by the below mappings using 355df177f67SBram Moolenaar" the ]} style maps. 356df177f67SBram Moolenaar" This global variable allows the users to override it's value 357df177f67SBram Moolenaar" from within their vimrc. 3580fd9289dSBram Moolenaar" Note, you cannot use \?, since these patterns can be used to search 3590fd9289dSBram Moolenaar" backwards, you must use \{,1} 360df177f67SBram Moolenaarif !exists('g:ftplugin_sql_objects') 361df177f67SBram Moolenaar let g:ftplugin_sql_objects = 'function,procedure,event,' . 3620fd9289dSBram Moolenaar \ '\\(existing\\\\|global\\s\\+temporary\\s\\+\\)\\\{,1}' . 3630fd9289dSBram Moolenaar \ 'table,trigger' . 364df177f67SBram Moolenaar \ ',schema,service,publication,database,datatype,domain' . 365df177f67SBram Moolenaar \ ',index,subscription,synchronization,view,variable' 366df177f67SBram Moolenaarendif 367df177f67SBram Moolenaar 3685c73622aSBram Moolenaar" Key to trigger SQL completion 3695c73622aSBram Moolenaarif !exists('g:ftplugin_sql_omni_key') 3705c73622aSBram Moolenaar let g:ftplugin_sql_omni_key = '<C-C>' 3715c73622aSBram Moolenaarendif 3725c73622aSBram Moolenaar" Key to trigger drill into column list 3735c73622aSBram Moolenaarif !exists('g:ftplugin_sql_omni_key_right') 3745c73622aSBram Moolenaar let g:ftplugin_sql_omni_key_right = '<Right>' 3755c73622aSBram Moolenaarendif 3765c73622aSBram Moolenaar" Key to trigger drill out of column list 3775c73622aSBram Moolenaarif !exists('g:ftplugin_sql_omni_key_left') 3785c73622aSBram Moolenaar let g:ftplugin_sql_omni_key_left = '<Left>' 3795c73622aSBram Moolenaarendif 3805c73622aSBram Moolenaar 3810fd9289dSBram Moolenaar" Replace all ,'s with bars, except ones with numbers after them. 3820fd9289dSBram Moolenaar" This will most likely be a \{,1} string. 383df177f67SBram Moolenaarlet s:ftplugin_sql_objects = 3840fd9289dSBram Moolenaar \ '\\c^\\s*' . 3850fd9289dSBram Moolenaar \ '\\(\\(' . 3860fd9289dSBram Moolenaar \ substitute(g:ftplugin_sql_statements, ',\d\@!', '\\\\\\|', 'g') . 3870fd9289dSBram Moolenaar \ '\\)\\s\\+\\(or\\s\\+replace\\\s\+\\)\\{,1}\\)\\{,1}' . 3880fd9289dSBram Moolenaar \ '\\<\\(' . 3890fd9289dSBram Moolenaar \ substitute(g:ftplugin_sql_objects, ',\d\@!', '\\\\\\|', 'g') . 3900fd9289dSBram Moolenaar \ '\\)\\>' 391df177f67SBram Moolenaar 392df177f67SBram Moolenaar" Mappings to move to the next CREATE ... block 393df177f67SBram Moolenaarexec "nmap <buffer> <silent> ]} :call search('".s:ftplugin_sql_objects."', 'W')<CR>" 394df177f67SBram Moolenaarexec "nmap <buffer> <silent> [{ :call search('".s:ftplugin_sql_objects."', 'bW')<CR>" 395df177f67SBram Moolenaar" Could not figure out how to use a :call search() string in visual mode 396df177f67SBram Moolenaar" without it ending visual mode 3970fd9289dSBram Moolenaar" Unfortunately, this will add a entry to the search history 398df177f67SBram Moolenaarexec 'vmap <buffer> <silent> ]} /'.s:ftplugin_sql_objects.'<CR>' 399df177f67SBram Moolenaarexec 'vmap <buffer> <silent> [{ ?'.s:ftplugin_sql_objects.'<CR>' 400df177f67SBram Moolenaar 401df177f67SBram Moolenaar" Mappings to move to the next COMMENT 402df177f67SBram Moolenaar" 403df177f67SBram Moolenaar" Had to double the \ for the \| separator since this has a special 404df177f67SBram Moolenaar" meaning on maps 4050fd9289dSBram Moolenaarlet b:comment_leader = '\\(--\\\|\\/\\/\\\|\\*\\\|\\/\\*\\\|\\*\\/\\)' 406df177f67SBram Moolenaar" Find the start of the next comment 4070fd9289dSBram Moolenaarlet b:comment_start = '^\\(\\s*'.b:comment_leader.'.*\\n\\)\\@<!'. 4080fd9289dSBram Moolenaar \ '\\(\\s*'.b:comment_leader.'\\)' 409df177f67SBram Moolenaar" Find the end of the previous comment 4100fd9289dSBram Moolenaarlet b:comment_end = '\\(^\\s*'.b:comment_leader.'.*\\n\\)'. 4110fd9289dSBram Moolenaar \ '\\(^\\s*'.b:comment_leader.'\\)\\@!' 412df177f67SBram Moolenaar" Skip over the comment 413df177f67SBram Moolenaarlet b:comment_jump_over = "call search('". 4140fd9289dSBram Moolenaar \ '^\\(\\s*'.b:comment_leader.'.*\\n\\)\\@<!'. 415df177f67SBram Moolenaar \ "', 'W')" 416df177f67SBram Moolenaarlet b:comment_skip_back = "call search('". 4170fd9289dSBram Moolenaar \ '^\\(\\s*'.b:comment_leader.'.*\\n\\)\\@<!'. 418df177f67SBram Moolenaar \ "', 'bW')" 419df177f67SBram Moolenaar" Move to the start and end of comments 4203577c6faSBram Moolenaarexec 'nnoremap <silent><buffer> ]" :call search('."'".b:comment_start."'".', "W" )<CR>' 4213577c6faSBram Moolenaarexec 'nnoremap <silent><buffer> [" :call search('."'".b:comment_end."'".', "W" )<CR>' 4223577c6faSBram Moolenaarexec 'vnoremap <silent><buffer> ]" :<C-U>exec "normal! gv"<Bar>call search('."'".b:comment_start."'".', "W" )<CR>' 4233577c6faSBram Moolenaarexec 'vnoremap <silent><buffer> [" :<C-U>exec "normal! gv"<Bar>call search('."'".b:comment_end."'".', "W" )<CR>' 424df177f67SBram Moolenaar 425df177f67SBram Moolenaar" Comments can be of the form: 426df177f67SBram Moolenaar" /* 427df177f67SBram Moolenaar" * 428df177f67SBram Moolenaar" */ 429df177f67SBram Moolenaar" or 430df177f67SBram Moolenaar" -- 4310fd9289dSBram Moolenaar" or 4320fd9289dSBram Moolenaar" // 433df177f67SBram Moolenaarsetlocal comments=s1:/*,mb:*,ex:*/,:--,:// 434df177f67SBram Moolenaar 4350fd9289dSBram Moolenaar" Set completion with CTRL-X CTRL-O to autoloaded function. 4360fd9289dSBram Moolenaarif exists('&omnifunc') 437f193fffdSBram Moolenaar " Since the SQL completion plugin can be used in conjunction 438f193fffdSBram Moolenaar " with other completion filetypes it must record the previous 439f193fffdSBram Moolenaar " OMNI function prior to setting up the SQL OMNI function 440f193fffdSBram Moolenaar let b:sql_compl_savefunc = &omnifunc 441f193fffdSBram Moolenaar 4420fd9289dSBram Moolenaar " This is used by the sqlcomplete.vim plugin 4430fd9289dSBram Moolenaar " Source it for it's global functions 4440fd9289dSBram Moolenaar runtime autoload/syntaxcomplete.vim 4450fd9289dSBram Moolenaar 4460fd9289dSBram Moolenaar setlocal omnifunc=sqlcomplete#Complete 4470fd9289dSBram Moolenaar " Prevent the intellisense plugin from loading 4480fd9289dSBram Moolenaar let b:sql_vis = 1 449e2f98b95SBram Moolenaar if !exists('g:omni_sql_no_default_maps') 450e2f98b95SBram Moolenaar " Static maps which use populate the completion list 451e2f98b95SBram Moolenaar " using Vim's syntax highlighting rules 4525c73622aSBram Moolenaar exec 'imap <buffer> '.g:ftplugin_sql_omni_key.'a <C-\><C-O>:call sqlcomplete#Map("syntax")<CR><C-X><C-O>' 4535c73622aSBram Moolenaar exec 'imap <buffer> '.g:ftplugin_sql_omni_key.'k <C-\><C-O>:call sqlcomplete#Map("sqlKeyword")<CR><C-X><C-O>' 4545c73622aSBram Moolenaar exec 'imap <buffer> '.g:ftplugin_sql_omni_key.'f <C-\><C-O>:call sqlcomplete#Map("sqlFunction")<CR><C-X><C-O>' 4555c73622aSBram Moolenaar exec 'imap <buffer> '.g:ftplugin_sql_omni_key.'o <C-\><C-O>:call sqlcomplete#Map("sqlOption")<CR><C-X><C-O>' 4565c73622aSBram Moolenaar exec 'imap <buffer> '.g:ftplugin_sql_omni_key.'T <C-\><C-O>:call sqlcomplete#Map("sqlType")<CR><C-X><C-O>' 4575c73622aSBram Moolenaar exec 'imap <buffer> '.g:ftplugin_sql_omni_key.'s <C-\><C-O>:call sqlcomplete#Map("sqlStatement")<CR><C-X><C-O>' 458e2f98b95SBram Moolenaar " Dynamic maps which use populate the completion list 459e2f98b95SBram Moolenaar " using the dbext.vim plugin 4605c73622aSBram Moolenaar exec 'imap <buffer> '.g:ftplugin_sql_omni_key.'t <C-\><C-O>:call sqlcomplete#Map("table")<CR><C-X><C-O>' 4615c73622aSBram Moolenaar exec 'imap <buffer> '.g:ftplugin_sql_omni_key.'p <C-\><C-O>:call sqlcomplete#Map("procedure")<CR><C-X><C-O>' 4625c73622aSBram Moolenaar exec 'imap <buffer> '.g:ftplugin_sql_omni_key.'v <C-\><C-O>:call sqlcomplete#Map("view")<CR><C-X><C-O>' 4635c73622aSBram Moolenaar exec 'imap <buffer> '.g:ftplugin_sql_omni_key.'c <C-\><C-O>:call sqlcomplete#Map("column")<CR><C-X><C-O>' 4645c73622aSBram Moolenaar exec 'imap <buffer> '.g:ftplugin_sql_omni_key.'l <C-\><C-O>:call sqlcomplete#Map("column_csv")<CR><C-X><C-O>' 465e2f98b95SBram Moolenaar " The next 3 maps are only to be used while the completion window is 466e2f98b95SBram Moolenaar " active due to the <CR> at the beginning of the map 4675c73622aSBram Moolenaar exec 'imap <buffer> '.g:ftplugin_sql_omni_key.'L <C-Y><C-\><C-O>:call sqlcomplete#Map("column_csv")<CR><C-X><C-O>' 468f193fffdSBram Moolenaar " <C-Right> is not recognized on most Unix systems, so only create 469f193fffdSBram Moolenaar " these additional maps on the Windows platform. 470f193fffdSBram Moolenaar " If you would like to use these maps, choose a different key and make 471f193fffdSBram Moolenaar " the same map in your vimrc. 4725c73622aSBram Moolenaar " if has('win32') 4735c73622aSBram Moolenaar exec 'imap <buffer> '.g:ftplugin_sql_omni_key_right.' <C-R>=sqlcomplete#DrillIntoTable()<CR>' 4745c73622aSBram Moolenaar exec 'imap <buffer> '.g:ftplugin_sql_omni_key_left.' <C-R>=sqlcomplete#DrillOutOfColumns()<CR>' 4755c73622aSBram Moolenaar " endif 476e2f98b95SBram Moolenaar " Remove any cached items useful for schema changes 4775c73622aSBram Moolenaar exec 'imap <buffer> '.g:ftplugin_sql_omni_key.'R <C-\><C-O>:call sqlcomplete#Map("resetCache")<CR><C-X><C-O>' 478f193fffdSBram Moolenaar endif 479f193fffdSBram Moolenaar 480f193fffdSBram Moolenaar if b:sql_compl_savefunc != "" 481f193fffdSBram Moolenaar " We are changing the filetype to SQL from some other filetype 482f193fffdSBram Moolenaar " which had OMNI completion defined. We need to activate the 483f193fffdSBram Moolenaar " SQL completion plugin in order to cache some of the syntax items 484f193fffdSBram Moolenaar " while the syntax rules for SQL are active. 485*f9d5ca1dSBram Moolenaar call sqlcomplete#ResetCacheSyntax() 486f193fffdSBram Moolenaar call sqlcomplete#PreCacheSyntax() 487e2f98b95SBram Moolenaar endif 4880fd9289dSBram Moolenaarendif 4890fd9289dSBram Moolenaar 490df177f67SBram Moolenaarlet &cpo = s:save_cpo 491df177f67SBram Moolenaar 492e2f98b95SBram Moolenaar" vim:sw=4: 493df177f67SBram Moolenaar 494