1df177f67SBram Moolenaar" SQL filetype plugin file 2071d4279SBram Moolenaar" Language: SQL (Common for Oracle, Microsoft SQL Server, Sybase) 3*ad3b366cSBram Moolenaar" Version: 11.0 4adc2182cSBram Moolenaar" Maintainer: David Fishburn <dfishburn dot vim at gmail dot com> 5*ad3b366cSBram Moolenaar" Last Change: 2013 May 13 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*ad3b366cSBram Moolenaar" Version 11.0 (May 2013) 40*ad3b366cSBram Moolenaar" 41*ad3b366cSBram Moolenaar" NF: Updated to use SyntaxComplete's new regex support for syntax groups. 42*ad3b366cSBram Moolenaar" 4334feacbcSBram Moolenaar" Version 10.0 (Dec 2012) 4434feacbcSBram Moolenaar" 4534feacbcSBram Moolenaar" NF: Changed all maps to use noremap instead of must map 4634feacbcSBram Moolenaar" NF: Changed all visual maps to use xnoremap instead of vnoremap as they 4734feacbcSBram Moolenaar" should only be used in visual mode and not select mode. 4834feacbcSBram Moolenaar" BF: Most of the maps were using doubled up backslashes before they were 4934feacbcSBram Moolenaar" changed to using the search() function, which meant they no longer 5034feacbcSBram Moolenaar" worked. 5134feacbcSBram Moolenaar" 5234feacbcSBram Moolenaar" Version 9.0 5334feacbcSBram Moolenaar" 5434feacbcSBram Moolenaar" NF: Completes 'b:undo_ftplugin' 5534feacbcSBram Moolenaar" BF: Correctly set cpoptions when creating script 5634feacbcSBram Moolenaar" 57adc2182cSBram Moolenaar" Version 8.0 58adc2182cSBram Moolenaar" 59adc2182cSBram Moolenaar" NF: Improved the matchit plugin regex (Talek) 60adc2182cSBram Moolenaar" 61f9d5ca1dSBram Moolenaar" Version 7.0 62f9d5ca1dSBram Moolenaar" 63f9d5ca1dSBram Moolenaar" NF: Calls the sqlcomplete#ResetCacheSyntax() function when calling 64f9d5ca1dSBram Moolenaar" SQLSetType. 65f9d5ca1dSBram Moolenaar" 665c73622aSBram Moolenaar" Version 6.0 675c73622aSBram Moolenaar" 685c73622aSBram Moolenaar" NF: Adds the command SQLGetType 695c73622aSBram Moolenaar" 705c73622aSBram Moolenaar" Version 5.0 715c73622aSBram Moolenaar" 725c73622aSBram Moolenaar" NF: Adds the ability to choose the keys to control SQL completion, just add 735c73622aSBram Moolenaar" the following to your .vimrc: 745c73622aSBram Moolenaar" let g:ftplugin_sql_omni_key = '<C-C>' 755c73622aSBram Moolenaar" let g:ftplugin_sql_omni_key_right = '<Right>' 765c73622aSBram Moolenaar" let g:ftplugin_sql_omni_key_left = '<Left>' 775c73622aSBram Moolenaar" 785c73622aSBram Moolenaar" BF: format-options - Auto-wrap comments using textwidth was turned off 795c73622aSBram Moolenaar" by mistake. 800fd9289dSBram Moolenaar 810fd9289dSBram Moolenaar 82071d4279SBram Moolenaar" Only do this when not done yet for this buffer 83071d4279SBram Moolenaarif exists("b:did_ftplugin") 84071d4279SBram Moolenaar finish 85071d4279SBram Moolenaarendif 86071d4279SBram Moolenaar 87df177f67SBram Moolenaarlet s:save_cpo = &cpo 888e52a593SBram Moolenaarset cpo&vim 89df177f67SBram Moolenaar 903577c6faSBram Moolenaar" Disable autowrapping for code, but enable for comments 913577c6faSBram Moolenaar" t Auto-wrap text using textwidth 923577c6faSBram Moolenaar" c Auto-wrap comments using textwidth, inserting the current comment 933577c6faSBram Moolenaar" leader automatically. 943577c6faSBram Moolenaarsetlocal formatoptions-=t 955c73622aSBram Moolenaarsetlocal formatoptions+=c 963577c6faSBram Moolenaar 970fd9289dSBram Moolenaar" Functions/Commands to allow the user to change SQL syntax dialects 980fd9289dSBram Moolenaar" through the use of :SQLSetType <tab> for completion. 990fd9289dSBram Moolenaar" This works with both Vim 6 and 7. 1000fd9289dSBram Moolenaar 1010fd9289dSBram Moolenaarif !exists("*SQL_SetType") 1020fd9289dSBram Moolenaar " NOTE: You cannot use function! since this file can be 1030fd9289dSBram Moolenaar " sourced from within this function. That will result in 1040fd9289dSBram Moolenaar " an error reported by Vim. 1050fd9289dSBram Moolenaar function SQL_GetList(ArgLead, CmdLine, CursorPos) 1060fd9289dSBram Moolenaar 1070fd9289dSBram Moolenaar if !exists('s:sql_list') 1080fd9289dSBram Moolenaar " Grab a list of files that contain "sql" in their names 1090fd9289dSBram Moolenaar let list_indent = globpath(&runtimepath, 'indent/*sql*') 1100fd9289dSBram Moolenaar let list_syntax = globpath(&runtimepath, 'syntax/*sql*') 1110fd9289dSBram Moolenaar let list_ftplugin = globpath(&runtimepath, 'ftplugin/*sql*') 1120fd9289dSBram Moolenaar 1130fd9289dSBram Moolenaar let sqls = "\n".list_indent."\n".list_syntax."\n".list_ftplugin."\n" 1140fd9289dSBram Moolenaar 1150fd9289dSBram Moolenaar " Strip out everything (path info) but the filename 1160fd9289dSBram Moolenaar " Regex 1170fd9289dSBram Moolenaar " From between two newline characters 1180fd9289dSBram Moolenaar " Non-greedily grab all characters 1190fd9289dSBram Moolenaar " Followed by a valid filename \w\+\.\w\+ (sql.vim) 1200fd9289dSBram Moolenaar " Followed by a newline, but do not include the newline 1210fd9289dSBram Moolenaar " 1220fd9289dSBram Moolenaar " Replace it with just the filename (get rid of PATH) 1230fd9289dSBram Moolenaar " 1240fd9289dSBram Moolenaar " Recursively, since there are many filenames that contain 1250fd9289dSBram Moolenaar " the word SQL in the indent, syntax and ftplugin directory 1260fd9289dSBram Moolenaar let sqls = substitute( sqls, 1270fd9289dSBram Moolenaar \ '[\n]\%(.\{-}\)\(\w\+\.\w\+\)\n\@=', 1280fd9289dSBram Moolenaar \ '\1\n', 1290fd9289dSBram Moolenaar \ 'g' 1300fd9289dSBram Moolenaar \ ) 1310fd9289dSBram Moolenaar 1320fd9289dSBram Moolenaar " Remove duplicates, since sqlanywhere.vim can exist in the 1330fd9289dSBram Moolenaar " sytax, indent and ftplugin directory, yet we only want 1340fd9289dSBram Moolenaar " to display the option once 1350fd9289dSBram Moolenaar let index = match(sqls, '.\{-}\ze\n') 1360fd9289dSBram Moolenaar while index > -1 1370fd9289dSBram Moolenaar " Get the first filename 1380fd9289dSBram Moolenaar let file = matchstr(sqls, '.\{-}\ze\n', index) 1390fd9289dSBram Moolenaar " Recursively replace any *other* occurrence of that 1400fd9289dSBram Moolenaar " filename with nothing (ie remove it) 1410fd9289dSBram Moolenaar let sqls = substitute(sqls, '\%>'.(index+strlen(file)).'c\<'.file.'\>\n', '', 'g') 1420fd9289dSBram Moolenaar " Move on to the next filename 1430fd9289dSBram Moolenaar let index = match(sqls, '.\{-}\ze\n', (index+strlen(file)+1)) 1440fd9289dSBram Moolenaar endwhile 1450fd9289dSBram Moolenaar 1460fd9289dSBram Moolenaar " Sort the list if using version 7 1470fd9289dSBram Moolenaar if v:version >= 700 1480fd9289dSBram Moolenaar let mylist = split(sqls, "\n") 1490fd9289dSBram Moolenaar let mylist = sort(mylist) 1500fd9289dSBram Moolenaar let sqls = join(mylist, "\n") 1510fd9289dSBram Moolenaar endif 1520fd9289dSBram Moolenaar 1530fd9289dSBram Moolenaar let s:sql_list = sqls 1540fd9289dSBram Moolenaar endif 1550fd9289dSBram Moolenaar 1560fd9289dSBram Moolenaar return s:sql_list 1570fd9289dSBram Moolenaar 1580fd9289dSBram Moolenaar endfunction 1590fd9289dSBram Moolenaar 1600fd9289dSBram Moolenaar function SQL_SetType(name) 1610fd9289dSBram Moolenaar 1620fd9289dSBram Moolenaar " User has decided to override default SQL scripts and 1630fd9289dSBram Moolenaar " specify a vendor specific version 1640fd9289dSBram Moolenaar " (ie Oracle, Informix, SQL Anywhere, ...) 1650fd9289dSBram Moolenaar " So check for an remove any settings that prevent the 1660fd9289dSBram Moolenaar " scripts from being executed, and then source the 1670fd9289dSBram Moolenaar " appropriate Vim scripts. 1680fd9289dSBram Moolenaar if exists("b:did_ftplugin") 1690fd9289dSBram Moolenaar unlet b:did_ftplugin 1700fd9289dSBram Moolenaar endif 1710fd9289dSBram Moolenaar if exists("b:current_syntax") 1720fd9289dSBram Moolenaar " echomsg 'SQLSetType - clearing syntax' 1730fd9289dSBram Moolenaar syntax clear 1740fd9289dSBram Moolenaar endif 1750fd9289dSBram Moolenaar if exists("b:did_indent") 1760fd9289dSBram Moolenaar " echomsg 'SQLSetType - clearing indent' 1770fd9289dSBram Moolenaar unlet b:did_indent 1780fd9289dSBram Moolenaar " Set these values to their defaults 1790fd9289dSBram Moolenaar setlocal indentkeys& 1800fd9289dSBram Moolenaar setlocal indentexpr& 1810fd9289dSBram Moolenaar endif 1820fd9289dSBram Moolenaar 1830fd9289dSBram Moolenaar " Ensure the name is in the correct format 1840fd9289dSBram Moolenaar let new_sql_type = substitute(a:name, 1850fd9289dSBram Moolenaar \ '\s*\([^\.]\+\)\(\.\w\+\)\?', '\L\1', '') 1860fd9289dSBram Moolenaar 1870fd9289dSBram Moolenaar " Do not specify a buffer local variable if it is 1880fd9289dSBram Moolenaar " the default value 1890fd9289dSBram Moolenaar if new_sql_type == 'sql' 1900fd9289dSBram Moolenaar let new_sql_type = 'sqloracle' 1910fd9289dSBram Moolenaar endif 1920fd9289dSBram Moolenaar let b:sql_type_override = new_sql_type 1930fd9289dSBram Moolenaar 194f9d5ca1dSBram Moolenaar " Remove any cached SQL since a new sytax will have different 195f9d5ca1dSBram Moolenaar " items and groups 196*ad3b366cSBram Moolenaar if !exists('g:loaded_sql_completion') || g:loaded_sql_completion >= 100 197f9d5ca1dSBram Moolenaar call sqlcomplete#ResetCacheSyntax() 198f9d5ca1dSBram Moolenaar endif 199f9d5ca1dSBram Moolenaar 2000fd9289dSBram Moolenaar " Vim will automatically source the correct files if we 2010fd9289dSBram Moolenaar " change the filetype. You cannot do this with setfiletype 2020fd9289dSBram Moolenaar " since that command will only execute if a filetype has 2030fd9289dSBram Moolenaar " not already been set. In this case we want to override 2040fd9289dSBram Moolenaar " the existing filetype. 2050fd9289dSBram Moolenaar let &filetype = 'sql' 206f9d5ca1dSBram Moolenaar 207f9d5ca1dSBram Moolenaar if b:sql_compl_savefunc != "" 208f9d5ca1dSBram Moolenaar " We are changing the filetype to SQL from some other filetype 209f9d5ca1dSBram Moolenaar " which had OMNI completion defined. We need to activate the 210f9d5ca1dSBram Moolenaar " SQL completion plugin in order to cache some of the syntax items 211f9d5ca1dSBram Moolenaar " while the syntax rules for SQL are active. 212f9d5ca1dSBram Moolenaar call sqlcomplete#PreCacheSyntax() 213f9d5ca1dSBram Moolenaar endif 2140fd9289dSBram Moolenaar endfunction 2150fd9289dSBram Moolenaar command! -nargs=* -complete=custom,SQL_GetList SQLSetType :call SQL_SetType(<q-args>) 2160fd9289dSBram Moolenaar 2170fd9289dSBram Moolenaarendif 2180fd9289dSBram Moolenaar 2195c73622aSBram Moolenaar" Functions/Commands to allow the user determine current SQL syntax dialect 2205c73622aSBram Moolenaar" This works with both Vim 6 and 7. 2215c73622aSBram Moolenaar 2225c73622aSBram Moolenaarif !exists("*SQL_GetType") 2235c73622aSBram Moolenaar function SQL_GetType() 2245c73622aSBram Moolenaar if exists('b:sql_type_override') 2255c73622aSBram Moolenaar echomsg "Current SQL dialect in use:".b:sql_type_override 2265c73622aSBram Moolenaar else 2275c73622aSBram Moolenaar echomsg "Current SQL dialect in use:".g:sql_type_default 2285c73622aSBram Moolenaar endif 2295c73622aSBram Moolenaar endfunction 2305c73622aSBram Moolenaar command! -nargs=0 SQLGetType :call SQL_GetType() 2315c73622aSBram Moolenaarendif 2325c73622aSBram Moolenaar 2330fd9289dSBram Moolenaarif exists("b:sql_type_override") 2340fd9289dSBram Moolenaar " echo 'sourcing buffer ftplugin/'.b:sql_type_override.'.vim' 2350fd9289dSBram Moolenaar if globpath(&runtimepath, 'ftplugin/'.b:sql_type_override.'.vim') != '' 2360fd9289dSBram Moolenaar exec 'runtime ftplugin/'.b:sql_type_override.'.vim' 2370fd9289dSBram Moolenaar " else 2380fd9289dSBram Moolenaar " echomsg 'ftplugin/'.b:sql_type_override.' not exist, using default' 2390fd9289dSBram Moolenaar endif 2400fd9289dSBram Moolenaarelseif exists("g:sql_type_default") 2410fd9289dSBram Moolenaar " echo 'sourcing global ftplugin/'.g:sql_type_default.'.vim' 2420fd9289dSBram Moolenaar if globpath(&runtimepath, 'ftplugin/'.g:sql_type_default.'.vim') != '' 2430fd9289dSBram Moolenaar exec 'runtime ftplugin/'.g:sql_type_default.'.vim' 2440fd9289dSBram Moolenaar " else 2450fd9289dSBram Moolenaar " echomsg 'ftplugin/'.g:sql_type_default.'.vim not exist, using default' 2460fd9289dSBram Moolenaar endif 2470fd9289dSBram Moolenaarendif 2480fd9289dSBram Moolenaar 2490fd9289dSBram Moolenaar" If the above runtime command succeeded, do not load the default settings 2500fd9289dSBram Moolenaarif exists("b:did_ftplugin") 2510fd9289dSBram Moolenaar finish 2520fd9289dSBram Moolenaarendif 2530fd9289dSBram Moolenaar 25434feacbcSBram Moolenaarlet b:undo_ftplugin = "setl comments< formatoptions< define< omnifunc<" . 25534feacbcSBram Moolenaar \ " | unlet! b:browsefilter b:match_words" 2560fd9289dSBram Moolenaar 257071d4279SBram Moolenaar" Don't load another plugin for this buffer 258071d4279SBram Moolenaarlet b:did_ftplugin = 1 2590fd9289dSBram Moolenaarlet b:current_ftplugin = 'sql' 2600fd9289dSBram Moolenaar 2610fd9289dSBram Moolenaar" Win32 can filter files in the browse dialog 2620fd9289dSBram Moolenaarif has("gui_win32") && !exists("b:browsefilter") 2630fd9289dSBram Moolenaar let b:browsefilter = "SQL Files (*.sql)\t*.sql\n" . 2640fd9289dSBram Moolenaar \ "All Files (*.*)\t*.*\n" 2650fd9289dSBram Moolenaarendif 266071d4279SBram Moolenaar 267df177f67SBram Moolenaar" Some standard expressions for use with the matchit strings 268df177f67SBram Moolenaarlet s:notend = '\%(\<end\s\+\)\@<!' 269df177f67SBram Moolenaarlet s:when_no_matched_or_others = '\%(\<when\>\%(\s\+\%(\%(\<not\>\s\+\)\?<matched\>\)\|\<others\>\)\@!\)' 270df177f67SBram Moolenaarlet s:or_replace = '\%(or\s\+replace\s\+\)\?' 271df177f67SBram Moolenaar 272071d4279SBram Moolenaar" Define patterns for the matchit macro 273071d4279SBram Moolenaarif !exists("b:match_words") 274071d4279SBram Moolenaar " SQL is generally case insensitive 275071d4279SBram Moolenaar let b:match_ignorecase = 1 276df177f67SBram Moolenaar 277df177f67SBram Moolenaar " Handle the following: 278df177f67SBram Moolenaar " if 279df177f67SBram Moolenaar " elseif | elsif 280df177f67SBram Moolenaar " else [if] 281df177f67SBram Moolenaar " end if 282df177f67SBram Moolenaar " 283df177f67SBram Moolenaar " [while condition] loop 284df177f67SBram Moolenaar " leave 285df177f67SBram Moolenaar " break 286df177f67SBram Moolenaar " continue 287df177f67SBram Moolenaar " exit 288df177f67SBram Moolenaar " end loop 289df177f67SBram Moolenaar " 290df177f67SBram Moolenaar " for 291df177f67SBram Moolenaar " leave 292df177f67SBram Moolenaar " break 293df177f67SBram Moolenaar " continue 294df177f67SBram Moolenaar " exit 295df177f67SBram Moolenaar " end loop 296df177f67SBram Moolenaar " 297df177f67SBram Moolenaar " do 298df177f67SBram Moolenaar " statements 299df177f67SBram Moolenaar " doend 300df177f67SBram Moolenaar " 301df177f67SBram Moolenaar " case 302df177f67SBram Moolenaar " when 303df177f67SBram Moolenaar " when 304df177f67SBram Moolenaar " default 305df177f67SBram Moolenaar " end case 306df177f67SBram Moolenaar " 307df177f67SBram Moolenaar " merge 308df177f67SBram Moolenaar " when not matched 309df177f67SBram Moolenaar " when matched 310df177f67SBram Moolenaar " 311df177f67SBram Moolenaar " EXCEPTION 312df177f67SBram Moolenaar " WHEN column_not_found THEN 313df177f67SBram Moolenaar " WHEN OTHERS THEN 314df177f67SBram Moolenaar " 315df177f67SBram Moolenaar " create[ or replace] procedure|function|event 316adc2182cSBram Moolenaar " \ '^\s*\<\%(do\|for\|while\|loop\)\>.*:'. 317df177f67SBram Moolenaar 31834feacbcSBram Moolenaar " For ColdFusion support 31934feacbcSBram Moolenaar setlocal matchpairs+=<:> 32034feacbcSBram Moolenaar let b:match_words = &matchpairs . 32134feacbcSBram Moolenaar \ ',\<begin\>:\<end\>\W*$,'. 322df177f67SBram Moolenaar \ 323df177f67SBram Moolenaar \ s:notend . '\<if\>:'. 324df177f67SBram Moolenaar \ '\<elsif\>\|\<elseif\>\|\<else\>:'. 325df177f67SBram Moolenaar \ '\<end\s\+if\>,'. 326df177f67SBram Moolenaar \ 327adc2182cSBram Moolenaar \ '\(^\s*\)\@<=\(\<\%(do\|for\|while\|loop\)\>.*\):'. 328adc2182cSBram Moolenaar \ '\%(\<exit\>\|\<leave\>\|\<break\>\|\<continue\>\):'. 329adc2182cSBram Moolenaar \ '\%(\<doend\>\|\%(\<end\s\+\%(for\|while\|loop\>\)\)\),'. 330df177f67SBram Moolenaar \ 331df177f67SBram Moolenaar \ '\%('. s:notend . '\<case\>\):'. 332df177f67SBram Moolenaar \ '\%('.s:when_no_matched_or_others.'\):'. 333df177f67SBram Moolenaar \ '\%(\<when\s\+others\>\|\<end\s\+case\>\),' . 334df177f67SBram Moolenaar \ 335df177f67SBram Moolenaar \ '\<merge\>:' . 336df177f67SBram Moolenaar \ '\<when\s\+not\s\+matched\>:' . 337df177f67SBram Moolenaar \ '\<when\s\+matched\>,' . 338df177f67SBram Moolenaar \ 339df177f67SBram Moolenaar \ '\%(\<create\s\+' . s:or_replace . '\)\?'. 340df177f67SBram Moolenaar \ '\%(function\|procedure\|event\):'. 341df177f67SBram Moolenaar \ '\<returns\?\>' 342df177f67SBram Moolenaar " \ '\<begin\>\|\<returns\?\>:'. 343df177f67SBram Moolenaar " \ '\<end\>\(;\)\?\s*$' 344df177f67SBram Moolenaar " \ '\<exception\>:'.s:when_no_matched_or_others. 345df177f67SBram Moolenaar " \ ':\<when\s\+others\>,'. 346df177f67SBram Moolenaar " 347df177f67SBram Moolenaar " \ '\%(\<exception\>\|\%('. s:notend . '\<case\>\)\):'. 348df177f67SBram Moolenaar " \ '\%(\<default\>\|'.s:when_no_matched_or_others.'\):'. 349df177f67SBram Moolenaar " \ '\%(\%(\<when\s\+others\>\)\|\<end\s\+case\>\),' . 350071d4279SBram Moolenaarendif 351df177f67SBram Moolenaar 352df177f67SBram Moolenaar" Define how to find the macro definition of a variable using the various 353df177f67SBram Moolenaar" [d, [D, [_CTRL_D and so on features 354df177f67SBram Moolenaar" Match these values ignoring case 355df177f67SBram Moolenaar" ie DECLARE varname INTEGER 3560fd9289dSBram Moolenaarlet &l:define = '\c\<\(VARIABLE\|DECLARE\|IN\|OUT\|INOUT\)\>' 357df177f67SBram Moolenaar 358df177f67SBram Moolenaar 359df177f67SBram Moolenaar" Mappings to move to the next BEGIN ... END block 360df177f67SBram Moolenaar" \W - no characters or digits 36134feacbcSBram Moolenaarnnoremap <buffer> <silent> ]] :call search('\c^\s*begin\>', 'W' )<CR> 36234feacbcSBram Moolenaarnnoremap <buffer> <silent> [[ :call search('\c^\s*begin\>', 'bW' )<CR> 36334feacbcSBram Moolenaarnnoremap <buffer> <silent> ][ :call search('\c^\s*end\W*$', 'W' )<CR> 36434feacbcSBram Moolenaarnnoremap <buffer> <silent> [] :call search('\c^\s*end\W*$', 'bW' )<CR> 36534feacbcSBram Moolenaarxnoremap <buffer> <silent> ]] :<C-U>exec "normal! gv"<Bar>call search('\c^\s*begin\>', 'W' )<CR> 36634feacbcSBram Moolenaarxnoremap <buffer> <silent> [[ :<C-U>exec "normal! gv"<Bar>call search('\c^\s*begin\>', 'bW' )<CR> 36734feacbcSBram Moolenaarxnoremap <buffer> <silent> ][ :<C-U>exec "normal! gv"<Bar>call search('\c^\s*end\W*$', 'W' )<CR> 36834feacbcSBram Moolenaarxnoremap <buffer> <silent> [] :<C-U>exec "normal! gv"<Bar>call search('\c^\s*end\W*$', 'bW' )<CR> 369df177f67SBram Moolenaar 370df177f67SBram Moolenaar 3710fd9289dSBram Moolenaar" By default only look for CREATE statements, but allow 3720fd9289dSBram Moolenaar" the user to override 3730fd9289dSBram Moolenaarif !exists('g:ftplugin_sql_statements') 3740fd9289dSBram Moolenaar let g:ftplugin_sql_statements = 'create' 3750fd9289dSBram Moolenaarendif 3760fd9289dSBram Moolenaar 377df177f67SBram Moolenaar" Predefined SQL objects what are used by the below mappings using 378df177f67SBram Moolenaar" the ]} style maps. 379df177f67SBram Moolenaar" This global variable allows the users to override it's value 380df177f67SBram Moolenaar" from within their vimrc. 3810fd9289dSBram Moolenaar" Note, you cannot use \?, since these patterns can be used to search 3820fd9289dSBram Moolenaar" backwards, you must use \{,1} 383df177f67SBram Moolenaarif !exists('g:ftplugin_sql_objects') 384df177f67SBram Moolenaar let g:ftplugin_sql_objects = 'function,procedure,event,' . 38534feacbcSBram Moolenaar \ '\(existing\\|global\s\+temporary\s\+\)\{,1}' . 3860fd9289dSBram Moolenaar \ 'table,trigger' . 387df177f67SBram Moolenaar \ ',schema,service,publication,database,datatype,domain' . 388df177f67SBram Moolenaar \ ',index,subscription,synchronization,view,variable' 389df177f67SBram Moolenaarendif 390df177f67SBram Moolenaar 3915c73622aSBram Moolenaar" Key to trigger SQL completion 3925c73622aSBram Moolenaarif !exists('g:ftplugin_sql_omni_key') 3935c73622aSBram Moolenaar let g:ftplugin_sql_omni_key = '<C-C>' 3945c73622aSBram Moolenaarendif 3955c73622aSBram Moolenaar" Key to trigger drill into column list 3965c73622aSBram Moolenaarif !exists('g:ftplugin_sql_omni_key_right') 3975c73622aSBram Moolenaar let g:ftplugin_sql_omni_key_right = '<Right>' 3985c73622aSBram Moolenaarendif 3995c73622aSBram Moolenaar" Key to trigger drill out of column list 4005c73622aSBram Moolenaarif !exists('g:ftplugin_sql_omni_key_left') 4015c73622aSBram Moolenaar let g:ftplugin_sql_omni_key_left = '<Left>' 4025c73622aSBram Moolenaarendif 4035c73622aSBram Moolenaar 4040fd9289dSBram Moolenaar" Replace all ,'s with bars, except ones with numbers after them. 4050fd9289dSBram Moolenaar" This will most likely be a \{,1} string. 406df177f67SBram Moolenaarlet s:ftplugin_sql_objects = 40734feacbcSBram Moolenaar \ '\c^\s*' . 40834feacbcSBram Moolenaar \ '\(\(' . 40934feacbcSBram Moolenaar \ substitute(g:ftplugin_sql_statements, ',\d\@!', '\\\\|', 'g') . 41034feacbcSBram Moolenaar \ '\)\s\+\(or\s\+replace\s\+\)\{,1}\)\{,1}' . 41134feacbcSBram Moolenaar \ '\<\(' . 41234feacbcSBram Moolenaar \ substitute(g:ftplugin_sql_objects, ',\d\@!', '\\\\|', 'g') . 41334feacbcSBram Moolenaar \ '\)\>' 414df177f67SBram Moolenaar 415df177f67SBram Moolenaar" Mappings to move to the next CREATE ... block 41634feacbcSBram Moolenaarexec "nnoremap <buffer> <silent> ]} :call search('".s:ftplugin_sql_objects."', 'W')<CR>" 41734feacbcSBram Moolenaarexec "nnoremap <buffer> <silent> [{ :call search('".s:ftplugin_sql_objects."', 'bW')<CR>" 418df177f67SBram Moolenaar" Could not figure out how to use a :call search() string in visual mode 419df177f67SBram Moolenaar" without it ending visual mode 4200fd9289dSBram Moolenaar" Unfortunately, this will add a entry to the search history 42134feacbcSBram Moolenaarexec 'xnoremap <buffer> <silent> ]} /'.s:ftplugin_sql_objects.'<CR>' 42234feacbcSBram Moolenaarexec 'xnoremap <buffer> <silent> [{ ?'.s:ftplugin_sql_objects.'<CR>' 423df177f67SBram Moolenaar 424df177f67SBram Moolenaar" Mappings to move to the next COMMENT 425df177f67SBram Moolenaar" 426df177f67SBram Moolenaar" Had to double the \ for the \| separator since this has a special 427df177f67SBram Moolenaar" meaning on maps 42834feacbcSBram Moolenaarlet b:comment_leader = '\(--\\|\/\/\\|\*\\|\/\*\\|\*\/\)' 429df177f67SBram Moolenaar" Find the start of the next comment 43034feacbcSBram Moolenaarlet b:comment_start = '^\(\s*'.b:comment_leader.'.*\n\)\@<!'. 43134feacbcSBram Moolenaar \ '\(\s*'.b:comment_leader.'\)' 432df177f67SBram Moolenaar" Find the end of the previous comment 43334feacbcSBram Moolenaarlet b:comment_end = '\(^\s*'.b:comment_leader.'.*\n\)'. 43434feacbcSBram Moolenaar \ '\(^\s*'.b:comment_leader.'\)\@!' 435df177f67SBram Moolenaar" Skip over the comment 436df177f67SBram Moolenaarlet b:comment_jump_over = "call search('". 43734feacbcSBram Moolenaar \ '^\(\s*'.b:comment_leader.'.*\n\)\@<!'. 438df177f67SBram Moolenaar \ "', 'W')" 439df177f67SBram Moolenaarlet b:comment_skip_back = "call search('". 44034feacbcSBram Moolenaar \ '^\(\s*'.b:comment_leader.'.*\n\)\@<!'. 441df177f67SBram Moolenaar \ "', 'bW')" 442df177f67SBram Moolenaar" Move to the start and end of comments 4433577c6faSBram Moolenaarexec 'nnoremap <silent><buffer> ]" :call search('."'".b:comment_start."'".', "W" )<CR>' 4443577c6faSBram Moolenaarexec 'nnoremap <silent><buffer> [" :call search('."'".b:comment_end."'".', "W" )<CR>' 44534feacbcSBram Moolenaarexec 'xnoremap <silent><buffer> ]" :<C-U>exec "normal! gv"<Bar>call search('."'".b:comment_start."'".', "W" )<CR>' 44634feacbcSBram Moolenaarexec 'xnoremap <silent><buffer> [" :<C-U>exec "normal! gv"<Bar>call search('."'".b:comment_end."'".', "W" )<CR>' 447df177f67SBram Moolenaar 448df177f67SBram Moolenaar" Comments can be of the form: 449df177f67SBram Moolenaar" /* 450df177f67SBram Moolenaar" * 451df177f67SBram Moolenaar" */ 452df177f67SBram Moolenaar" or 453df177f67SBram Moolenaar" -- 4540fd9289dSBram Moolenaar" or 4550fd9289dSBram Moolenaar" // 456df177f67SBram Moolenaarsetlocal comments=s1:/*,mb:*,ex:*/,:--,:// 457df177f67SBram Moolenaar 4580fd9289dSBram Moolenaar" Set completion with CTRL-X CTRL-O to autoloaded function. 4590fd9289dSBram Moolenaarif exists('&omnifunc') 460f193fffdSBram Moolenaar " Since the SQL completion plugin can be used in conjunction 461f193fffdSBram Moolenaar " with other completion filetypes it must record the previous 462f193fffdSBram Moolenaar " OMNI function prior to setting up the SQL OMNI function 463f193fffdSBram Moolenaar let b:sql_compl_savefunc = &omnifunc 464f193fffdSBram Moolenaar 465*ad3b366cSBram Moolenaar " Source it to determine it's version 466*ad3b366cSBram Moolenaar runtime autoload/sqlcomplete.vim 4670fd9289dSBram Moolenaar " This is used by the sqlcomplete.vim plugin 4680fd9289dSBram Moolenaar " Source it for it's global functions 4690fd9289dSBram Moolenaar runtime autoload/syntaxcomplete.vim 4700fd9289dSBram Moolenaar 4710fd9289dSBram Moolenaar setlocal omnifunc=sqlcomplete#Complete 4720fd9289dSBram Moolenaar " Prevent the intellisense plugin from loading 4730fd9289dSBram Moolenaar let b:sql_vis = 1 474e2f98b95SBram Moolenaar if !exists('g:omni_sql_no_default_maps') 475*ad3b366cSBram Moolenaar let regex_extra = '' 476*ad3b366cSBram Moolenaar if exists('g:loaded_syntax_completion') && exists('g:loaded_sql_completion') 477*ad3b366cSBram Moolenaar if g:loaded_syntax_completion > 120 && g:loaded_sql_completion > 140 478*ad3b366cSBram Moolenaar let regex_extra = '\\w*' 479*ad3b366cSBram Moolenaar endif 480*ad3b366cSBram Moolenaar endif 481e2f98b95SBram Moolenaar " Static maps which use populate the completion list 482e2f98b95SBram Moolenaar " using Vim's syntax highlighting rules 48334feacbcSBram Moolenaar exec 'inoremap <buffer> '.g:ftplugin_sql_omni_key.'a <C-\><C-O>:call sqlcomplete#Map("syntax")<CR><C-X><C-O>' 484*ad3b366cSBram Moolenaar exec 'inoremap <buffer> '.g:ftplugin_sql_omni_key.'k <C-\><C-O>:call sqlcomplete#Map("sqlKeyword'.regex_extra.'")<CR><C-X><C-O>' 485*ad3b366cSBram Moolenaar exec 'inoremap <buffer> '.g:ftplugin_sql_omni_key.'f <C-\><C-O>:call sqlcomplete#Map("sqlFunction'.regex_extra.'")<CR><C-X><C-O>' 486*ad3b366cSBram Moolenaar exec 'inoremap <buffer> '.g:ftplugin_sql_omni_key.'o <C-\><C-O>:call sqlcomplete#Map("sqlOption'.regex_extra.'")<CR><C-X><C-O>' 487*ad3b366cSBram Moolenaar exec 'inoremap <buffer> '.g:ftplugin_sql_omni_key.'T <C-\><C-O>:call sqlcomplete#Map("sqlType'.regex_extra.'")<CR><C-X><C-O>' 488*ad3b366cSBram Moolenaar exec 'inoremap <buffer> '.g:ftplugin_sql_omni_key.'s <C-\><C-O>:call sqlcomplete#Map("sqlStatement'.regex_extra.'")<CR><C-X><C-O>' 489e2f98b95SBram Moolenaar " Dynamic maps which use populate the completion list 490e2f98b95SBram Moolenaar " using the dbext.vim plugin 49134feacbcSBram Moolenaar exec 'inoremap <buffer> '.g:ftplugin_sql_omni_key.'t <C-\><C-O>:call sqlcomplete#Map("table")<CR><C-X><C-O>' 49234feacbcSBram Moolenaar exec 'inoremap <buffer> '.g:ftplugin_sql_omni_key.'p <C-\><C-O>:call sqlcomplete#Map("procedure")<CR><C-X><C-O>' 49334feacbcSBram Moolenaar exec 'inoremap <buffer> '.g:ftplugin_sql_omni_key.'v <C-\><C-O>:call sqlcomplete#Map("view")<CR><C-X><C-O>' 49434feacbcSBram Moolenaar exec 'inoremap <buffer> '.g:ftplugin_sql_omni_key.'c <C-\><C-O>:call sqlcomplete#Map("column")<CR><C-X><C-O>' 49534feacbcSBram Moolenaar exec 'inoremap <buffer> '.g:ftplugin_sql_omni_key.'l <C-\><C-O>:call sqlcomplete#Map("column_csv")<CR><C-X><C-O>' 496e2f98b95SBram Moolenaar " The next 3 maps are only to be used while the completion window is 497e2f98b95SBram Moolenaar " active due to the <CR> at the beginning of the map 49834feacbcSBram Moolenaar exec 'inoremap <buffer> '.g:ftplugin_sql_omni_key.'L <C-Y><C-\><C-O>:call sqlcomplete#Map("column_csv")<CR><C-X><C-O>' 499f193fffdSBram Moolenaar " <C-Right> is not recognized on most Unix systems, so only create 500f193fffdSBram Moolenaar " these additional maps on the Windows platform. 501f193fffdSBram Moolenaar " If you would like to use these maps, choose a different key and make 502f193fffdSBram Moolenaar " the same map in your vimrc. 5035c73622aSBram Moolenaar " if has('win32') 50434feacbcSBram Moolenaar exec 'inoremap <buffer> '.g:ftplugin_sql_omni_key_right.' <C-R>=sqlcomplete#DrillIntoTable()<CR>' 50534feacbcSBram Moolenaar exec 'inoremap <buffer> '.g:ftplugin_sql_omni_key_left.' <C-R>=sqlcomplete#DrillOutOfColumns()<CR>' 5065c73622aSBram Moolenaar " endif 507e2f98b95SBram Moolenaar " Remove any cached items useful for schema changes 50834feacbcSBram Moolenaar exec 'inoremap <buffer> '.g:ftplugin_sql_omni_key.'R <C-\><C-O>:call sqlcomplete#Map("resetCache")<CR><C-X><C-O>' 509f193fffdSBram Moolenaar endif 510f193fffdSBram Moolenaar 511f193fffdSBram Moolenaar if b:sql_compl_savefunc != "" 512f193fffdSBram Moolenaar " We are changing the filetype to SQL from some other filetype 513f193fffdSBram Moolenaar " which had OMNI completion defined. We need to activate the 514f193fffdSBram Moolenaar " SQL completion plugin in order to cache some of the syntax items 515f193fffdSBram Moolenaar " while the syntax rules for SQL are active. 516f9d5ca1dSBram Moolenaar call sqlcomplete#ResetCacheSyntax() 517f193fffdSBram Moolenaar call sqlcomplete#PreCacheSyntax() 518e2f98b95SBram Moolenaar endif 5190fd9289dSBram Moolenaarendif 5200fd9289dSBram Moolenaar 521df177f67SBram Moolenaarlet &cpo = s:save_cpo 52284f7235bSBram Moolenaarunlet s:save_cpo 523df177f67SBram Moolenaar 524e2f98b95SBram Moolenaar" vim:sw=4: 525