1df177f67SBram Moolenaar" SQL filetype plugin file 2071d4279SBram Moolenaar" Language: SQL (Common for Oracle, Microsoft SQL Server, Sybase) 3036986f1SBram Moolenaar" Version: 12.0 4adc2182cSBram Moolenaar" Maintainer: David Fishburn <dfishburn dot vim at gmail dot com> 5036986f1SBram Moolenaar" Last Change: 2017 Mar 07 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" 39036986f1SBram Moolenaar" Version 12.0 (April 2013) 40036986f1SBram Moolenaar" 41036986f1SBram Moolenaar" NF: Added support for "BEGIN TRY ... END TRY ... BEGIN CATCH ... END CATCH 42036986f1SBram Moolenaar" BF: This plugin is designed to be used with other plugins to enable the 43036986f1SBram Moolenaar" SQL completion with Perl, Python, Java, ... The loading mechanism 44036986f1SBram Moolenaar" was not checking if the SQL objects were created, which can lead to 45036986f1SBram Moolenaar" the plugin not loading the SQL support. 46036986f1SBram Moolenaar" 47ad3b366cSBram Moolenaar" Version 11.0 (May 2013) 48ad3b366cSBram Moolenaar" 49ad3b366cSBram Moolenaar" NF: Updated to use SyntaxComplete's new regex support for syntax groups. 50ad3b366cSBram Moolenaar" 5134feacbcSBram Moolenaar" Version 10.0 (Dec 2012) 5234feacbcSBram Moolenaar" 5334feacbcSBram Moolenaar" NF: Changed all maps to use noremap instead of must map 5434feacbcSBram Moolenaar" NF: Changed all visual maps to use xnoremap instead of vnoremap as they 5534feacbcSBram Moolenaar" should only be used in visual mode and not select mode. 5634feacbcSBram Moolenaar" BF: Most of the maps were using doubled up backslashes before they were 5734feacbcSBram Moolenaar" changed to using the search() function, which meant they no longer 5834feacbcSBram Moolenaar" worked. 5934feacbcSBram Moolenaar" 6034feacbcSBram Moolenaar" Version 9.0 6134feacbcSBram Moolenaar" 6234feacbcSBram Moolenaar" NF: Completes 'b:undo_ftplugin' 6334feacbcSBram Moolenaar" BF: Correctly set cpoptions when creating script 6434feacbcSBram Moolenaar" 65adc2182cSBram Moolenaar" Version 8.0 66adc2182cSBram Moolenaar" 67adc2182cSBram Moolenaar" NF: Improved the matchit plugin regex (Talek) 68adc2182cSBram Moolenaar" 69f9d5ca1dSBram Moolenaar" Version 7.0 70f9d5ca1dSBram Moolenaar" 71f9d5ca1dSBram Moolenaar" NF: Calls the sqlcomplete#ResetCacheSyntax() function when calling 72f9d5ca1dSBram Moolenaar" SQLSetType. 73f9d5ca1dSBram Moolenaar" 745c73622aSBram Moolenaar" Version 6.0 755c73622aSBram Moolenaar" 765c73622aSBram Moolenaar" NF: Adds the command SQLGetType 775c73622aSBram Moolenaar" 785c73622aSBram Moolenaar" Version 5.0 795c73622aSBram Moolenaar" 805c73622aSBram Moolenaar" NF: Adds the ability to choose the keys to control SQL completion, just add 815c73622aSBram Moolenaar" the following to your .vimrc: 825c73622aSBram Moolenaar" let g:ftplugin_sql_omni_key = '<C-C>' 835c73622aSBram Moolenaar" let g:ftplugin_sql_omni_key_right = '<Right>' 845c73622aSBram Moolenaar" let g:ftplugin_sql_omni_key_left = '<Left>' 855c73622aSBram Moolenaar" 865c73622aSBram Moolenaar" BF: format-options - Auto-wrap comments using textwidth was turned off 875c73622aSBram Moolenaar" by mistake. 880fd9289dSBram Moolenaar 890fd9289dSBram Moolenaar 90071d4279SBram Moolenaar" Only do this when not done yet for this buffer 91036986f1SBram Moolenaar" This ftplugin can be used with other ftplugins. So ensure loading 92036986f1SBram Moolenaar" happens if all elements of this plugin have not yet loaded. 93036986f1SBram Moolenaarif exists("b:did_ftplugin") && exists("b:current_ftplugin") && b:current_ftplugin == 'sql' 94071d4279SBram Moolenaar finish 95071d4279SBram Moolenaarendif 96071d4279SBram Moolenaar 97df177f67SBram Moolenaarlet s:save_cpo = &cpo 988e52a593SBram Moolenaarset cpo&vim 99df177f67SBram Moolenaar 1003577c6faSBram Moolenaar" Disable autowrapping for code, but enable for comments 1013577c6faSBram Moolenaar" t Auto-wrap text using textwidth 1023577c6faSBram Moolenaar" c Auto-wrap comments using textwidth, inserting the current comment 1033577c6faSBram Moolenaar" leader automatically. 1043577c6faSBram Moolenaarsetlocal formatoptions-=t 1055c73622aSBram Moolenaarsetlocal formatoptions+=c 1063577c6faSBram Moolenaar 1070fd9289dSBram Moolenaar" Functions/Commands to allow the user to change SQL syntax dialects 1080fd9289dSBram Moolenaar" through the use of :SQLSetType <tab> for completion. 1090fd9289dSBram Moolenaar" This works with both Vim 6 and 7. 1100fd9289dSBram Moolenaar 1110fd9289dSBram Moolenaarif !exists("*SQL_SetType") 1120fd9289dSBram Moolenaar " NOTE: You cannot use function! since this file can be 1130fd9289dSBram Moolenaar " sourced from within this function. That will result in 1140fd9289dSBram Moolenaar " an error reported by Vim. 1150fd9289dSBram Moolenaar function SQL_GetList(ArgLead, CmdLine, CursorPos) 1160fd9289dSBram Moolenaar 1170fd9289dSBram Moolenaar if !exists('s:sql_list') 1180fd9289dSBram Moolenaar " Grab a list of files that contain "sql" in their names 1190fd9289dSBram Moolenaar let list_indent = globpath(&runtimepath, 'indent/*sql*') 1200fd9289dSBram Moolenaar let list_syntax = globpath(&runtimepath, 'syntax/*sql*') 1210fd9289dSBram Moolenaar let list_ftplugin = globpath(&runtimepath, 'ftplugin/*sql*') 1220fd9289dSBram Moolenaar 1230fd9289dSBram Moolenaar let sqls = "\n".list_indent."\n".list_syntax."\n".list_ftplugin."\n" 1240fd9289dSBram Moolenaar 1250fd9289dSBram Moolenaar " Strip out everything (path info) but the filename 1260fd9289dSBram Moolenaar " Regex 1270fd9289dSBram Moolenaar " From between two newline characters 1280fd9289dSBram Moolenaar " Non-greedily grab all characters 1290fd9289dSBram Moolenaar " Followed by a valid filename \w\+\.\w\+ (sql.vim) 1300fd9289dSBram Moolenaar " Followed by a newline, but do not include the newline 1310fd9289dSBram Moolenaar " 1320fd9289dSBram Moolenaar " Replace it with just the filename (get rid of PATH) 1330fd9289dSBram Moolenaar " 1340fd9289dSBram Moolenaar " Recursively, since there are many filenames that contain 1350fd9289dSBram Moolenaar " the word SQL in the indent, syntax and ftplugin directory 1360fd9289dSBram Moolenaar let sqls = substitute( sqls, 1370fd9289dSBram Moolenaar \ '[\n]\%(.\{-}\)\(\w\+\.\w\+\)\n\@=', 1380fd9289dSBram Moolenaar \ '\1\n', 1390fd9289dSBram Moolenaar \ 'g' 1400fd9289dSBram Moolenaar \ ) 1410fd9289dSBram Moolenaar 1420fd9289dSBram Moolenaar " Remove duplicates, since sqlanywhere.vim can exist in the 1430fd9289dSBram Moolenaar " sytax, indent and ftplugin directory, yet we only want 1440fd9289dSBram Moolenaar " to display the option once 1450fd9289dSBram Moolenaar let index = match(sqls, '.\{-}\ze\n') 1460fd9289dSBram Moolenaar while index > -1 1470fd9289dSBram Moolenaar " Get the first filename 1480fd9289dSBram Moolenaar let file = matchstr(sqls, '.\{-}\ze\n', index) 1490fd9289dSBram Moolenaar " Recursively replace any *other* occurrence of that 1500fd9289dSBram Moolenaar " filename with nothing (ie remove it) 1510fd9289dSBram Moolenaar let sqls = substitute(sqls, '\%>'.(index+strlen(file)).'c\<'.file.'\>\n', '', 'g') 1520fd9289dSBram Moolenaar " Move on to the next filename 1530fd9289dSBram Moolenaar let index = match(sqls, '.\{-}\ze\n', (index+strlen(file)+1)) 1540fd9289dSBram Moolenaar endwhile 1550fd9289dSBram Moolenaar 1560fd9289dSBram Moolenaar " Sort the list if using version 7 1570fd9289dSBram Moolenaar if v:version >= 700 1580fd9289dSBram Moolenaar let mylist = split(sqls, "\n") 1590fd9289dSBram Moolenaar let mylist = sort(mylist) 1600fd9289dSBram Moolenaar let sqls = join(mylist, "\n") 1610fd9289dSBram Moolenaar endif 1620fd9289dSBram Moolenaar 1630fd9289dSBram Moolenaar let s:sql_list = sqls 1640fd9289dSBram Moolenaar endif 1650fd9289dSBram Moolenaar 1660fd9289dSBram Moolenaar return s:sql_list 1670fd9289dSBram Moolenaar 1680fd9289dSBram Moolenaar endfunction 1690fd9289dSBram Moolenaar 1700fd9289dSBram Moolenaar function SQL_SetType(name) 1710fd9289dSBram Moolenaar 1720fd9289dSBram Moolenaar " User has decided to override default SQL scripts and 1730fd9289dSBram Moolenaar " specify a vendor specific version 1740fd9289dSBram Moolenaar " (ie Oracle, Informix, SQL Anywhere, ...) 1750fd9289dSBram Moolenaar " So check for an remove any settings that prevent the 1760fd9289dSBram Moolenaar " scripts from being executed, and then source the 1770fd9289dSBram Moolenaar " appropriate Vim scripts. 1780fd9289dSBram Moolenaar if exists("b:did_ftplugin") 1790fd9289dSBram Moolenaar unlet b:did_ftplugin 1800fd9289dSBram Moolenaar endif 1810fd9289dSBram Moolenaar if exists("b:current_syntax") 1820fd9289dSBram Moolenaar " echomsg 'SQLSetType - clearing syntax' 1830fd9289dSBram Moolenaar syntax clear 184036986f1SBram Moolenaar if exists("b:current_syntax") 185036986f1SBram Moolenaar unlet b:current_syntax 186036986f1SBram Moolenaar endif 1870fd9289dSBram Moolenaar endif 1880fd9289dSBram Moolenaar if exists("b:did_indent") 1890fd9289dSBram Moolenaar " echomsg 'SQLSetType - clearing indent' 1900fd9289dSBram Moolenaar unlet b:did_indent 1910fd9289dSBram Moolenaar " Set these values to their defaults 1920fd9289dSBram Moolenaar setlocal indentkeys& 1930fd9289dSBram Moolenaar setlocal indentexpr& 1940fd9289dSBram Moolenaar endif 1950fd9289dSBram Moolenaar 1960fd9289dSBram Moolenaar " Ensure the name is in the correct format 1970fd9289dSBram Moolenaar let new_sql_type = substitute(a:name, 1980fd9289dSBram Moolenaar \ '\s*\([^\.]\+\)\(\.\w\+\)\?', '\L\1', '') 1990fd9289dSBram Moolenaar 2000fd9289dSBram Moolenaar " Do not specify a buffer local variable if it is 2010fd9289dSBram Moolenaar " the default value 2020fd9289dSBram Moolenaar if new_sql_type == 'sql' 2030fd9289dSBram Moolenaar let new_sql_type = 'sqloracle' 2040fd9289dSBram Moolenaar endif 2050fd9289dSBram Moolenaar let b:sql_type_override = new_sql_type 2060fd9289dSBram Moolenaar 207f9d5ca1dSBram Moolenaar " Remove any cached SQL since a new sytax will have different 208f9d5ca1dSBram Moolenaar " items and groups 209ad3b366cSBram Moolenaar if !exists('g:loaded_sql_completion') || g:loaded_sql_completion >= 100 210f9d5ca1dSBram Moolenaar call sqlcomplete#ResetCacheSyntax() 211f9d5ca1dSBram Moolenaar endif 212f9d5ca1dSBram Moolenaar 2130fd9289dSBram Moolenaar " Vim will automatically source the correct files if we 2140fd9289dSBram Moolenaar " change the filetype. You cannot do this with setfiletype 2150fd9289dSBram Moolenaar " since that command will only execute if a filetype has 2160fd9289dSBram Moolenaar " not already been set. In this case we want to override 2170fd9289dSBram Moolenaar " the existing filetype. 2180fd9289dSBram Moolenaar let &filetype = 'sql' 219f9d5ca1dSBram Moolenaar 220f9d5ca1dSBram Moolenaar if b:sql_compl_savefunc != "" 221f9d5ca1dSBram Moolenaar " We are changing the filetype to SQL from some other filetype 222f9d5ca1dSBram Moolenaar " which had OMNI completion defined. We need to activate the 223f9d5ca1dSBram Moolenaar " SQL completion plugin in order to cache some of the syntax items 224f9d5ca1dSBram Moolenaar " while the syntax rules for SQL are active. 225f9d5ca1dSBram Moolenaar call sqlcomplete#PreCacheSyntax() 226f9d5ca1dSBram Moolenaar endif 2270fd9289dSBram Moolenaar endfunction 2280fd9289dSBram Moolenaar command! -nargs=* -complete=custom,SQL_GetList SQLSetType :call SQL_SetType(<q-args>) 2290fd9289dSBram Moolenaar 2300fd9289dSBram Moolenaarendif 2310fd9289dSBram Moolenaar 2325c73622aSBram Moolenaar" Functions/Commands to allow the user determine current SQL syntax dialect 2335c73622aSBram Moolenaar" This works with both Vim 6 and 7. 2345c73622aSBram Moolenaar 2355c73622aSBram Moolenaarif !exists("*SQL_GetType") 2365c73622aSBram Moolenaar function SQL_GetType() 2375c73622aSBram Moolenaar if exists('b:sql_type_override') 2385c73622aSBram Moolenaar echomsg "Current SQL dialect in use:".b:sql_type_override 2395c73622aSBram Moolenaar else 2405c73622aSBram Moolenaar echomsg "Current SQL dialect in use:".g:sql_type_default 2415c73622aSBram Moolenaar endif 2425c73622aSBram Moolenaar endfunction 2435c73622aSBram Moolenaar command! -nargs=0 SQLGetType :call SQL_GetType() 2445c73622aSBram Moolenaarendif 2455c73622aSBram Moolenaar 2460fd9289dSBram Moolenaarif exists("b:sql_type_override") 2470fd9289dSBram Moolenaar " echo 'sourcing buffer ftplugin/'.b:sql_type_override.'.vim' 2480fd9289dSBram Moolenaar if globpath(&runtimepath, 'ftplugin/'.b:sql_type_override.'.vim') != '' 2490fd9289dSBram Moolenaar exec 'runtime ftplugin/'.b:sql_type_override.'.vim' 2500fd9289dSBram Moolenaar " else 2510fd9289dSBram Moolenaar " echomsg 'ftplugin/'.b:sql_type_override.' not exist, using default' 2520fd9289dSBram Moolenaar endif 2530fd9289dSBram Moolenaarelseif exists("g:sql_type_default") 2540fd9289dSBram Moolenaar " echo 'sourcing global ftplugin/'.g:sql_type_default.'.vim' 2550fd9289dSBram Moolenaar if globpath(&runtimepath, 'ftplugin/'.g:sql_type_default.'.vim') != '' 2560fd9289dSBram Moolenaar exec 'runtime ftplugin/'.g:sql_type_default.'.vim' 2570fd9289dSBram Moolenaar " else 2580fd9289dSBram Moolenaar " echomsg 'ftplugin/'.g:sql_type_default.'.vim not exist, using default' 2590fd9289dSBram Moolenaar endif 2600fd9289dSBram Moolenaarendif 2610fd9289dSBram Moolenaar 2620fd9289dSBram Moolenaar" If the above runtime command succeeded, do not load the default settings 263036986f1SBram Moolenaar" as they should have already been loaded from a previous run. 264036986f1SBram Moolenaarif exists("b:did_ftplugin") && exists("b:current_ftplugin") && b:current_ftplugin == 'sql' 2650fd9289dSBram Moolenaar finish 2660fd9289dSBram Moolenaarendif 2670fd9289dSBram Moolenaar 26834feacbcSBram Moolenaarlet b:undo_ftplugin = "setl comments< formatoptions< define< omnifunc<" . 26934feacbcSBram Moolenaar \ " | unlet! b:browsefilter b:match_words" 2700fd9289dSBram Moolenaar 271071d4279SBram Moolenaar" Don't load another plugin for this buffer 272071d4279SBram Moolenaarlet b:did_ftplugin = 1 2730fd9289dSBram Moolenaarlet b:current_ftplugin = 'sql' 2740fd9289dSBram Moolenaar 2750fd9289dSBram Moolenaar" Win32 can filter files in the browse dialog 2760fd9289dSBram Moolenaarif has("gui_win32") && !exists("b:browsefilter") 2770fd9289dSBram Moolenaar let b:browsefilter = "SQL Files (*.sql)\t*.sql\n" . 2780fd9289dSBram Moolenaar \ "All Files (*.*)\t*.*\n" 2790fd9289dSBram Moolenaarendif 280071d4279SBram Moolenaar 281df177f67SBram Moolenaar" Some standard expressions for use with the matchit strings 282df177f67SBram Moolenaarlet s:notend = '\%(\<end\s\+\)\@<!' 283df177f67SBram Moolenaarlet s:when_no_matched_or_others = '\%(\<when\>\%(\s\+\%(\%(\<not\>\s\+\)\?<matched\>\)\|\<others\>\)\@!\)' 284df177f67SBram Moolenaarlet s:or_replace = '\%(or\s\+replace\s\+\)\?' 285df177f67SBram Moolenaar 286071d4279SBram Moolenaar" Define patterns for the matchit macro 287071d4279SBram Moolenaarif !exists("b:match_words") 288071d4279SBram Moolenaar " SQL is generally case insensitive 289071d4279SBram Moolenaar let b:match_ignorecase = 1 290df177f67SBram Moolenaar 291df177f67SBram Moolenaar " Handle the following: 292df177f67SBram Moolenaar " if 293df177f67SBram Moolenaar " elseif | elsif 294df177f67SBram Moolenaar " else [if] 295df177f67SBram Moolenaar " end if 296df177f67SBram Moolenaar " 297df177f67SBram Moolenaar " [while condition] loop 298df177f67SBram Moolenaar " leave 299df177f67SBram Moolenaar " break 300df177f67SBram Moolenaar " continue 301df177f67SBram Moolenaar " exit 302df177f67SBram Moolenaar " end loop 303df177f67SBram Moolenaar " 304df177f67SBram Moolenaar " for 305df177f67SBram Moolenaar " leave 306df177f67SBram Moolenaar " break 307df177f67SBram Moolenaar " continue 308df177f67SBram Moolenaar " exit 309df177f67SBram Moolenaar " end loop 310df177f67SBram Moolenaar " 311df177f67SBram Moolenaar " do 312df177f67SBram Moolenaar " statements 313df177f67SBram Moolenaar " doend 314df177f67SBram Moolenaar " 315df177f67SBram Moolenaar " case 316df177f67SBram Moolenaar " when 317df177f67SBram Moolenaar " when 318df177f67SBram Moolenaar " default 319df177f67SBram Moolenaar " end case 320df177f67SBram Moolenaar " 321df177f67SBram Moolenaar " merge 322df177f67SBram Moolenaar " when not matched 323df177f67SBram Moolenaar " when matched 324df177f67SBram Moolenaar " 325df177f67SBram Moolenaar " EXCEPTION 326df177f67SBram Moolenaar " WHEN column_not_found THEN 327df177f67SBram Moolenaar " WHEN OTHERS THEN 328df177f67SBram Moolenaar " 329036986f1SBram Moolenaar " begin try 330036986f1SBram Moolenaar " end try 331036986f1SBram Moolenaar " begin catch 332036986f1SBram Moolenaar " end catch 333036986f1SBram Moolenaar " 334df177f67SBram Moolenaar " create[ or replace] procedure|function|event 335adc2182cSBram Moolenaar " \ '^\s*\<\%(do\|for\|while\|loop\)\>.*:'. 336df177f67SBram Moolenaar 33734feacbcSBram Moolenaar " For ColdFusion support 33834feacbcSBram Moolenaar setlocal matchpairs+=<:> 33934feacbcSBram Moolenaar let b:match_words = &matchpairs . 340036986f1SBram Moolenaar \ ',\%(\<begin\)\%(\s\+\%(try\|catch\)\>\)\@!:\<end\>\W*$,'. 341036986f1SBram Moolenaar \ 342036986f1SBram Moolenaar \ '\<begin\s\+try\>:'. 343036986f1SBram Moolenaar \ '\<end\s\+try\>:'. 344036986f1SBram Moolenaar \ '\<begin\s\+catch\>:'. 345036986f1SBram Moolenaar \ '\<end\s\+catch\>,'. 346df177f67SBram Moolenaar \ 347df177f67SBram Moolenaar \ s:notend . '\<if\>:'. 348df177f67SBram Moolenaar \ '\<elsif\>\|\<elseif\>\|\<else\>:'. 349df177f67SBram Moolenaar \ '\<end\s\+if\>,'. 350df177f67SBram Moolenaar \ 351adc2182cSBram Moolenaar \ '\(^\s*\)\@<=\(\<\%(do\|for\|while\|loop\)\>.*\):'. 352adc2182cSBram Moolenaar \ '\%(\<exit\>\|\<leave\>\|\<break\>\|\<continue\>\):'. 353adc2182cSBram Moolenaar \ '\%(\<doend\>\|\%(\<end\s\+\%(for\|while\|loop\>\)\)\),'. 354df177f67SBram Moolenaar \ 355df177f67SBram Moolenaar \ '\%('. s:notend . '\<case\>\):'. 356df177f67SBram Moolenaar \ '\%('.s:when_no_matched_or_others.'\):'. 357df177f67SBram Moolenaar \ '\%(\<when\s\+others\>\|\<end\s\+case\>\),' . 358df177f67SBram Moolenaar \ 359df177f67SBram Moolenaar \ '\<merge\>:' . 360df177f67SBram Moolenaar \ '\<when\s\+not\s\+matched\>:' . 361df177f67SBram Moolenaar \ '\<when\s\+matched\>,' . 362df177f67SBram Moolenaar \ 363df177f67SBram Moolenaar \ '\%(\<create\s\+' . s:or_replace . '\)\?'. 364df177f67SBram Moolenaar \ '\%(function\|procedure\|event\):'. 365df177f67SBram Moolenaar \ '\<returns\?\>' 366df177f67SBram Moolenaar " \ '\<begin\>\|\<returns\?\>:'. 367df177f67SBram Moolenaar " \ '\<end\>\(;\)\?\s*$' 368df177f67SBram Moolenaar " \ '\<exception\>:'.s:when_no_matched_or_others. 369df177f67SBram Moolenaar " \ ':\<when\s\+others\>,'. 370df177f67SBram Moolenaar " 371df177f67SBram Moolenaar " \ '\%(\<exception\>\|\%('. s:notend . '\<case\>\)\):'. 372df177f67SBram Moolenaar " \ '\%(\<default\>\|'.s:when_no_matched_or_others.'\):'. 373df177f67SBram Moolenaar " \ '\%(\%(\<when\s\+others\>\)\|\<end\s\+case\>\),' . 374071d4279SBram Moolenaarendif 375df177f67SBram Moolenaar 376df177f67SBram Moolenaar" Define how to find the macro definition of a variable using the various 377df177f67SBram Moolenaar" [d, [D, [_CTRL_D and so on features 378df177f67SBram Moolenaar" Match these values ignoring case 379df177f67SBram Moolenaar" ie DECLARE varname INTEGER 3800fd9289dSBram Moolenaarlet &l:define = '\c\<\(VARIABLE\|DECLARE\|IN\|OUT\|INOUT\)\>' 381df177f67SBram Moolenaar 382df177f67SBram Moolenaar 383df177f67SBram Moolenaar" Mappings to move to the next BEGIN ... END block 384df177f67SBram Moolenaar" \W - no characters or digits 38534feacbcSBram Moolenaarnnoremap <buffer> <silent> ]] :call search('\c^\s*begin\>', 'W' )<CR> 38634feacbcSBram Moolenaarnnoremap <buffer> <silent> [[ :call search('\c^\s*begin\>', 'bW' )<CR> 38734feacbcSBram Moolenaarnnoremap <buffer> <silent> ][ :call search('\c^\s*end\W*$', 'W' )<CR> 38834feacbcSBram Moolenaarnnoremap <buffer> <silent> [] :call search('\c^\s*end\W*$', 'bW' )<CR> 38934feacbcSBram Moolenaarxnoremap <buffer> <silent> ]] :<C-U>exec "normal! gv"<Bar>call search('\c^\s*begin\>', 'W' )<CR> 39034feacbcSBram Moolenaarxnoremap <buffer> <silent> [[ :<C-U>exec "normal! gv"<Bar>call search('\c^\s*begin\>', 'bW' )<CR> 39134feacbcSBram Moolenaarxnoremap <buffer> <silent> ][ :<C-U>exec "normal! gv"<Bar>call search('\c^\s*end\W*$', 'W' )<CR> 39234feacbcSBram Moolenaarxnoremap <buffer> <silent> [] :<C-U>exec "normal! gv"<Bar>call search('\c^\s*end\W*$', 'bW' )<CR> 393df177f67SBram Moolenaar 394df177f67SBram Moolenaar 3950fd9289dSBram Moolenaar" By default only look for CREATE statements, but allow 3960fd9289dSBram Moolenaar" the user to override 3970fd9289dSBram Moolenaarif !exists('g:ftplugin_sql_statements') 3980fd9289dSBram Moolenaar let g:ftplugin_sql_statements = 'create' 3990fd9289dSBram Moolenaarendif 4000fd9289dSBram Moolenaar 401df177f67SBram Moolenaar" Predefined SQL objects what are used by the below mappings using 402df177f67SBram Moolenaar" the ]} style maps. 403*a6c27c47SBram Moolenaar" This global variable allows the users to override its value 404df177f67SBram Moolenaar" from within their vimrc. 4050fd9289dSBram Moolenaar" Note, you cannot use \?, since these patterns can be used to search 4060fd9289dSBram Moolenaar" backwards, you must use \{,1} 407df177f67SBram Moolenaarif !exists('g:ftplugin_sql_objects') 408df177f67SBram Moolenaar let g:ftplugin_sql_objects = 'function,procedure,event,' . 40934feacbcSBram Moolenaar \ '\(existing\\|global\s\+temporary\s\+\)\{,1}' . 4100fd9289dSBram Moolenaar \ 'table,trigger' . 411df177f67SBram Moolenaar \ ',schema,service,publication,database,datatype,domain' . 412df177f67SBram Moolenaar \ ',index,subscription,synchronization,view,variable' 413df177f67SBram Moolenaarendif 414df177f67SBram Moolenaar 4155c73622aSBram Moolenaar" Key to trigger SQL completion 4165c73622aSBram Moolenaarif !exists('g:ftplugin_sql_omni_key') 4175c73622aSBram Moolenaar let g:ftplugin_sql_omni_key = '<C-C>' 4185c73622aSBram Moolenaarendif 4195c73622aSBram Moolenaar" Key to trigger drill into column list 4205c73622aSBram Moolenaarif !exists('g:ftplugin_sql_omni_key_right') 4215c73622aSBram Moolenaar let g:ftplugin_sql_omni_key_right = '<Right>' 4225c73622aSBram Moolenaarendif 4235c73622aSBram Moolenaar" Key to trigger drill out of column list 4245c73622aSBram Moolenaarif !exists('g:ftplugin_sql_omni_key_left') 4255c73622aSBram Moolenaar let g:ftplugin_sql_omni_key_left = '<Left>' 4265c73622aSBram Moolenaarendif 4275c73622aSBram Moolenaar 4280fd9289dSBram Moolenaar" Replace all ,'s with bars, except ones with numbers after them. 4290fd9289dSBram Moolenaar" This will most likely be a \{,1} string. 430df177f67SBram Moolenaarlet s:ftplugin_sql_objects = 43134feacbcSBram Moolenaar \ '\c^\s*' . 43234feacbcSBram Moolenaar \ '\(\(' . 43334feacbcSBram Moolenaar \ substitute(g:ftplugin_sql_statements, ',\d\@!', '\\\\|', 'g') . 43434feacbcSBram Moolenaar \ '\)\s\+\(or\s\+replace\s\+\)\{,1}\)\{,1}' . 43534feacbcSBram Moolenaar \ '\<\(' . 43634feacbcSBram Moolenaar \ substitute(g:ftplugin_sql_objects, ',\d\@!', '\\\\|', 'g') . 43734feacbcSBram Moolenaar \ '\)\>' 438df177f67SBram Moolenaar 439df177f67SBram Moolenaar" Mappings to move to the next CREATE ... block 44034feacbcSBram Moolenaarexec "nnoremap <buffer> <silent> ]} :call search('".s:ftplugin_sql_objects."', 'W')<CR>" 44134feacbcSBram Moolenaarexec "nnoremap <buffer> <silent> [{ :call search('".s:ftplugin_sql_objects."', 'bW')<CR>" 442df177f67SBram Moolenaar" Could not figure out how to use a :call search() string in visual mode 443df177f67SBram Moolenaar" without it ending visual mode 4440fd9289dSBram Moolenaar" Unfortunately, this will add a entry to the search history 44534feacbcSBram Moolenaarexec 'xnoremap <buffer> <silent> ]} /'.s:ftplugin_sql_objects.'<CR>' 44634feacbcSBram Moolenaarexec 'xnoremap <buffer> <silent> [{ ?'.s:ftplugin_sql_objects.'<CR>' 447df177f67SBram Moolenaar 448df177f67SBram Moolenaar" Mappings to move to the next COMMENT 449df177f67SBram Moolenaar" 450df177f67SBram Moolenaar" Had to double the \ for the \| separator since this has a special 451df177f67SBram Moolenaar" meaning on maps 45234feacbcSBram Moolenaarlet b:comment_leader = '\(--\\|\/\/\\|\*\\|\/\*\\|\*\/\)' 453df177f67SBram Moolenaar" Find the start of the next comment 45434feacbcSBram Moolenaarlet b:comment_start = '^\(\s*'.b:comment_leader.'.*\n\)\@<!'. 45534feacbcSBram Moolenaar \ '\(\s*'.b:comment_leader.'\)' 456df177f67SBram Moolenaar" Find the end of the previous comment 45734feacbcSBram Moolenaarlet b:comment_end = '\(^\s*'.b:comment_leader.'.*\n\)'. 45834feacbcSBram Moolenaar \ '\(^\s*'.b:comment_leader.'\)\@!' 459df177f67SBram Moolenaar" Skip over the comment 460df177f67SBram Moolenaarlet b:comment_jump_over = "call search('". 46134feacbcSBram Moolenaar \ '^\(\s*'.b:comment_leader.'.*\n\)\@<!'. 462df177f67SBram Moolenaar \ "', 'W')" 463df177f67SBram Moolenaarlet b:comment_skip_back = "call search('". 46434feacbcSBram Moolenaar \ '^\(\s*'.b:comment_leader.'.*\n\)\@<!'. 465df177f67SBram Moolenaar \ "', 'bW')" 466df177f67SBram Moolenaar" Move to the start and end of comments 4673577c6faSBram Moolenaarexec 'nnoremap <silent><buffer> ]" :call search('."'".b:comment_start."'".', "W" )<CR>' 4683577c6faSBram Moolenaarexec 'nnoremap <silent><buffer> [" :call search('."'".b:comment_end."'".', "W" )<CR>' 46934feacbcSBram Moolenaarexec 'xnoremap <silent><buffer> ]" :<C-U>exec "normal! gv"<Bar>call search('."'".b:comment_start."'".', "W" )<CR>' 47034feacbcSBram Moolenaarexec 'xnoremap <silent><buffer> [" :<C-U>exec "normal! gv"<Bar>call search('."'".b:comment_end."'".', "W" )<CR>' 471df177f67SBram Moolenaar 472df177f67SBram Moolenaar" Comments can be of the form: 473df177f67SBram Moolenaar" /* 474df177f67SBram Moolenaar" * 475df177f67SBram Moolenaar" */ 476df177f67SBram Moolenaar" or 477df177f67SBram Moolenaar" -- 4780fd9289dSBram Moolenaar" or 4790fd9289dSBram Moolenaar" // 480df177f67SBram Moolenaarsetlocal comments=s1:/*,mb:*,ex:*/,:--,:// 481df177f67SBram Moolenaar 4820fd9289dSBram Moolenaar" Set completion with CTRL-X CTRL-O to autoloaded function. 4830fd9289dSBram Moolenaarif exists('&omnifunc') 484f193fffdSBram Moolenaar " Since the SQL completion plugin can be used in conjunction 485f193fffdSBram Moolenaar " with other completion filetypes it must record the previous 486f193fffdSBram Moolenaar " OMNI function prior to setting up the SQL OMNI function 487f193fffdSBram Moolenaar let b:sql_compl_savefunc = &omnifunc 488f193fffdSBram Moolenaar 489*a6c27c47SBram Moolenaar " Source it to determine its version 490ad3b366cSBram Moolenaar runtime autoload/sqlcomplete.vim 4910fd9289dSBram Moolenaar " This is used by the sqlcomplete.vim plugin 492*a6c27c47SBram Moolenaar " Source it for its global functions 4930fd9289dSBram Moolenaar runtime autoload/syntaxcomplete.vim 4940fd9289dSBram Moolenaar 4950fd9289dSBram Moolenaar setlocal omnifunc=sqlcomplete#Complete 4960fd9289dSBram Moolenaar " Prevent the intellisense plugin from loading 4970fd9289dSBram Moolenaar let b:sql_vis = 1 498e2f98b95SBram Moolenaar if !exists('g:omni_sql_no_default_maps') 499ad3b366cSBram Moolenaar let regex_extra = '' 500ad3b366cSBram Moolenaar if exists('g:loaded_syntax_completion') && exists('g:loaded_sql_completion') 501ad3b366cSBram Moolenaar if g:loaded_syntax_completion > 120 && g:loaded_sql_completion > 140 502ad3b366cSBram Moolenaar let regex_extra = '\\w*' 503ad3b366cSBram Moolenaar endif 504ad3b366cSBram Moolenaar endif 505e2f98b95SBram Moolenaar " Static maps which use populate the completion list 506e2f98b95SBram Moolenaar " using Vim's syntax highlighting rules 50734feacbcSBram Moolenaar exec 'inoremap <buffer> '.g:ftplugin_sql_omni_key.'a <C-\><C-O>:call sqlcomplete#Map("syntax")<CR><C-X><C-O>' 508ad3b366cSBram Moolenaar exec 'inoremap <buffer> '.g:ftplugin_sql_omni_key.'k <C-\><C-O>:call sqlcomplete#Map("sqlKeyword'.regex_extra.'")<CR><C-X><C-O>' 509ad3b366cSBram Moolenaar exec 'inoremap <buffer> '.g:ftplugin_sql_omni_key.'f <C-\><C-O>:call sqlcomplete#Map("sqlFunction'.regex_extra.'")<CR><C-X><C-O>' 510ad3b366cSBram Moolenaar exec 'inoremap <buffer> '.g:ftplugin_sql_omni_key.'o <C-\><C-O>:call sqlcomplete#Map("sqlOption'.regex_extra.'")<CR><C-X><C-O>' 511ad3b366cSBram Moolenaar exec 'inoremap <buffer> '.g:ftplugin_sql_omni_key.'T <C-\><C-O>:call sqlcomplete#Map("sqlType'.regex_extra.'")<CR><C-X><C-O>' 512ad3b366cSBram Moolenaar exec 'inoremap <buffer> '.g:ftplugin_sql_omni_key.'s <C-\><C-O>:call sqlcomplete#Map("sqlStatement'.regex_extra.'")<CR><C-X><C-O>' 513e2f98b95SBram Moolenaar " Dynamic maps which use populate the completion list 514e2f98b95SBram Moolenaar " using the dbext.vim plugin 51534feacbcSBram Moolenaar exec 'inoremap <buffer> '.g:ftplugin_sql_omni_key.'t <C-\><C-O>:call sqlcomplete#Map("table")<CR><C-X><C-O>' 51634feacbcSBram Moolenaar exec 'inoremap <buffer> '.g:ftplugin_sql_omni_key.'p <C-\><C-O>:call sqlcomplete#Map("procedure")<CR><C-X><C-O>' 51734feacbcSBram Moolenaar exec 'inoremap <buffer> '.g:ftplugin_sql_omni_key.'v <C-\><C-O>:call sqlcomplete#Map("view")<CR><C-X><C-O>' 51834feacbcSBram Moolenaar exec 'inoremap <buffer> '.g:ftplugin_sql_omni_key.'c <C-\><C-O>:call sqlcomplete#Map("column")<CR><C-X><C-O>' 51934feacbcSBram Moolenaar exec 'inoremap <buffer> '.g:ftplugin_sql_omni_key.'l <C-\><C-O>:call sqlcomplete#Map("column_csv")<CR><C-X><C-O>' 520e2f98b95SBram Moolenaar " The next 3 maps are only to be used while the completion window is 521e2f98b95SBram Moolenaar " active due to the <CR> at the beginning of the map 52234feacbcSBram 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>' 523f193fffdSBram Moolenaar " <C-Right> is not recognized on most Unix systems, so only create 524f193fffdSBram Moolenaar " these additional maps on the Windows platform. 525f193fffdSBram Moolenaar " If you would like to use these maps, choose a different key and make 526f193fffdSBram Moolenaar " the same map in your vimrc. 5275c73622aSBram Moolenaar " if has('win32') 52834feacbcSBram Moolenaar exec 'inoremap <buffer> '.g:ftplugin_sql_omni_key_right.' <C-R>=sqlcomplete#DrillIntoTable()<CR>' 52934feacbcSBram Moolenaar exec 'inoremap <buffer> '.g:ftplugin_sql_omni_key_left.' <C-R>=sqlcomplete#DrillOutOfColumns()<CR>' 5305c73622aSBram Moolenaar " endif 531e2f98b95SBram Moolenaar " Remove any cached items useful for schema changes 53234feacbcSBram Moolenaar exec 'inoremap <buffer> '.g:ftplugin_sql_omni_key.'R <C-\><C-O>:call sqlcomplete#Map("resetCache")<CR><C-X><C-O>' 533f193fffdSBram Moolenaar endif 534f193fffdSBram Moolenaar 535f193fffdSBram Moolenaar if b:sql_compl_savefunc != "" 536f193fffdSBram Moolenaar " We are changing the filetype to SQL from some other filetype 537f193fffdSBram Moolenaar " which had OMNI completion defined. We need to activate the 538f193fffdSBram Moolenaar " SQL completion plugin in order to cache some of the syntax items 539f193fffdSBram Moolenaar " while the syntax rules for SQL are active. 540f9d5ca1dSBram Moolenaar call sqlcomplete#ResetCacheSyntax() 541f193fffdSBram Moolenaar call sqlcomplete#PreCacheSyntax() 542e2f98b95SBram Moolenaar endif 5430fd9289dSBram Moolenaarendif 5440fd9289dSBram Moolenaar 545df177f67SBram Moolenaarlet &cpo = s:save_cpo 54684f7235bSBram Moolenaarunlet s:save_cpo 547df177f67SBram Moolenaar 548e2f98b95SBram Moolenaar" vim:sw=4: 549