1df177f67SBram Moolenaar" SQL filetype plugin file 2071d4279SBram Moolenaar" Language: SQL (Common for Oracle, Microsoft SQL Server, Sybase) 3*adc2182cSBram Moolenaar" Version: 8.0 4*adc2182cSBram Moolenaar" Maintainer: David Fishburn <dfishburn dot vim at gmail dot com> 5*adc2182cSBram Moolenaar" Last Change: 2011 Apr 01 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*adc2182cSBram Moolenaar" Version 8.0 40*adc2182cSBram Moolenaar" 41*adc2182cSBram Moolenaar" NF: Improved the matchit plugin regex (Talek) 42*adc2182cSBram Moolenaar" 43f9d5ca1dSBram Moolenaar" Version 7.0 44f9d5ca1dSBram Moolenaar" 45f9d5ca1dSBram Moolenaar" NF: Calls the sqlcomplete#ResetCacheSyntax() function when calling 46f9d5ca1dSBram Moolenaar" SQLSetType. 47f9d5ca1dSBram Moolenaar" 485c73622aSBram Moolenaar" Version 6.0 495c73622aSBram Moolenaar" 505c73622aSBram Moolenaar" NF: Adds the command SQLGetType 515c73622aSBram Moolenaar" 525c73622aSBram Moolenaar" Version 5.0 535c73622aSBram Moolenaar" 545c73622aSBram Moolenaar" NF: Adds the ability to choose the keys to control SQL completion, just add 555c73622aSBram Moolenaar" the following to your .vimrc: 565c73622aSBram Moolenaar" let g:ftplugin_sql_omni_key = '<C-C>' 575c73622aSBram Moolenaar" let g:ftplugin_sql_omni_key_right = '<Right>' 585c73622aSBram Moolenaar" let g:ftplugin_sql_omni_key_left = '<Left>' 595c73622aSBram Moolenaar" 605c73622aSBram Moolenaar" BF: format-options - Auto-wrap comments using textwidth was turned off 615c73622aSBram Moolenaar" by mistake. 620fd9289dSBram Moolenaar 630fd9289dSBram Moolenaar 64071d4279SBram Moolenaar" Only do this when not done yet for this buffer 65071d4279SBram Moolenaarif exists("b:did_ftplugin") 66071d4279SBram Moolenaar finish 67071d4279SBram Moolenaarendif 68071d4279SBram Moolenaar 69df177f67SBram Moolenaarlet s:save_cpo = &cpo 70df177f67SBram Moolenaarset cpo= 71df177f67SBram Moolenaar 723577c6faSBram Moolenaar" Disable autowrapping for code, but enable for comments 733577c6faSBram Moolenaar" t Auto-wrap text using textwidth 743577c6faSBram Moolenaar" c Auto-wrap comments using textwidth, inserting the current comment 753577c6faSBram Moolenaar" leader automatically. 763577c6faSBram Moolenaarsetlocal formatoptions-=t 775c73622aSBram Moolenaarsetlocal formatoptions+=c 783577c6faSBram Moolenaar 790fd9289dSBram Moolenaar" Functions/Commands to allow the user to change SQL syntax dialects 800fd9289dSBram Moolenaar" through the use of :SQLSetType <tab> for completion. 810fd9289dSBram Moolenaar" This works with both Vim 6 and 7. 820fd9289dSBram Moolenaar 830fd9289dSBram Moolenaarif !exists("*SQL_SetType") 840fd9289dSBram Moolenaar " NOTE: You cannot use function! since this file can be 850fd9289dSBram Moolenaar " sourced from within this function. That will result in 860fd9289dSBram Moolenaar " an error reported by Vim. 870fd9289dSBram Moolenaar function SQL_GetList(ArgLead, CmdLine, CursorPos) 880fd9289dSBram Moolenaar 890fd9289dSBram Moolenaar if !exists('s:sql_list') 900fd9289dSBram Moolenaar " Grab a list of files that contain "sql" in their names 910fd9289dSBram Moolenaar let list_indent = globpath(&runtimepath, 'indent/*sql*') 920fd9289dSBram Moolenaar let list_syntax = globpath(&runtimepath, 'syntax/*sql*') 930fd9289dSBram Moolenaar let list_ftplugin = globpath(&runtimepath, 'ftplugin/*sql*') 940fd9289dSBram Moolenaar 950fd9289dSBram Moolenaar let sqls = "\n".list_indent."\n".list_syntax."\n".list_ftplugin."\n" 960fd9289dSBram Moolenaar 970fd9289dSBram Moolenaar " Strip out everything (path info) but the filename 980fd9289dSBram Moolenaar " Regex 990fd9289dSBram Moolenaar " From between two newline characters 1000fd9289dSBram Moolenaar " Non-greedily grab all characters 1010fd9289dSBram Moolenaar " Followed by a valid filename \w\+\.\w\+ (sql.vim) 1020fd9289dSBram Moolenaar " Followed by a newline, but do not include the newline 1030fd9289dSBram Moolenaar " 1040fd9289dSBram Moolenaar " Replace it with just the filename (get rid of PATH) 1050fd9289dSBram Moolenaar " 1060fd9289dSBram Moolenaar " Recursively, since there are many filenames that contain 1070fd9289dSBram Moolenaar " the word SQL in the indent, syntax and ftplugin directory 1080fd9289dSBram Moolenaar let sqls = substitute( sqls, 1090fd9289dSBram Moolenaar \ '[\n]\%(.\{-}\)\(\w\+\.\w\+\)\n\@=', 1100fd9289dSBram Moolenaar \ '\1\n', 1110fd9289dSBram Moolenaar \ 'g' 1120fd9289dSBram Moolenaar \ ) 1130fd9289dSBram Moolenaar 1140fd9289dSBram Moolenaar " Remove duplicates, since sqlanywhere.vim can exist in the 1150fd9289dSBram Moolenaar " sytax, indent and ftplugin directory, yet we only want 1160fd9289dSBram Moolenaar " to display the option once 1170fd9289dSBram Moolenaar let index = match(sqls, '.\{-}\ze\n') 1180fd9289dSBram Moolenaar while index > -1 1190fd9289dSBram Moolenaar " Get the first filename 1200fd9289dSBram Moolenaar let file = matchstr(sqls, '.\{-}\ze\n', index) 1210fd9289dSBram Moolenaar " Recursively replace any *other* occurrence of that 1220fd9289dSBram Moolenaar " filename with nothing (ie remove it) 1230fd9289dSBram Moolenaar let sqls = substitute(sqls, '\%>'.(index+strlen(file)).'c\<'.file.'\>\n', '', 'g') 1240fd9289dSBram Moolenaar " Move on to the next filename 1250fd9289dSBram Moolenaar let index = match(sqls, '.\{-}\ze\n', (index+strlen(file)+1)) 1260fd9289dSBram Moolenaar endwhile 1270fd9289dSBram Moolenaar 1280fd9289dSBram Moolenaar " Sort the list if using version 7 1290fd9289dSBram Moolenaar if v:version >= 700 1300fd9289dSBram Moolenaar let mylist = split(sqls, "\n") 1310fd9289dSBram Moolenaar let mylist = sort(mylist) 1320fd9289dSBram Moolenaar let sqls = join(mylist, "\n") 1330fd9289dSBram Moolenaar endif 1340fd9289dSBram Moolenaar 1350fd9289dSBram Moolenaar let s:sql_list = sqls 1360fd9289dSBram Moolenaar endif 1370fd9289dSBram Moolenaar 1380fd9289dSBram Moolenaar return s:sql_list 1390fd9289dSBram Moolenaar 1400fd9289dSBram Moolenaar endfunction 1410fd9289dSBram Moolenaar 1420fd9289dSBram Moolenaar function SQL_SetType(name) 1430fd9289dSBram Moolenaar 1440fd9289dSBram Moolenaar " User has decided to override default SQL scripts and 1450fd9289dSBram Moolenaar " specify a vendor specific version 1460fd9289dSBram Moolenaar " (ie Oracle, Informix, SQL Anywhere, ...) 1470fd9289dSBram Moolenaar " So check for an remove any settings that prevent the 1480fd9289dSBram Moolenaar " scripts from being executed, and then source the 1490fd9289dSBram Moolenaar " appropriate Vim scripts. 1500fd9289dSBram Moolenaar if exists("b:did_ftplugin") 1510fd9289dSBram Moolenaar unlet b:did_ftplugin 1520fd9289dSBram Moolenaar endif 1530fd9289dSBram Moolenaar if exists("b:current_syntax") 1540fd9289dSBram Moolenaar " echomsg 'SQLSetType - clearing syntax' 1550fd9289dSBram Moolenaar syntax clear 1560fd9289dSBram Moolenaar endif 1570fd9289dSBram Moolenaar if exists("b:did_indent") 1580fd9289dSBram Moolenaar " echomsg 'SQLSetType - clearing indent' 1590fd9289dSBram Moolenaar unlet b:did_indent 1600fd9289dSBram Moolenaar " Set these values to their defaults 1610fd9289dSBram Moolenaar setlocal indentkeys& 1620fd9289dSBram Moolenaar setlocal indentexpr& 1630fd9289dSBram Moolenaar endif 1640fd9289dSBram Moolenaar 1650fd9289dSBram Moolenaar " Ensure the name is in the correct format 1660fd9289dSBram Moolenaar let new_sql_type = substitute(a:name, 1670fd9289dSBram Moolenaar \ '\s*\([^\.]\+\)\(\.\w\+\)\?', '\L\1', '') 1680fd9289dSBram Moolenaar 1690fd9289dSBram Moolenaar " Do not specify a buffer local variable if it is 1700fd9289dSBram Moolenaar " the default value 1710fd9289dSBram Moolenaar if new_sql_type == 'sql' 1720fd9289dSBram Moolenaar let new_sql_type = 'sqloracle' 1730fd9289dSBram Moolenaar endif 1740fd9289dSBram Moolenaar let b:sql_type_override = new_sql_type 1750fd9289dSBram Moolenaar 176f9d5ca1dSBram Moolenaar " Remove any cached SQL since a new sytax will have different 177f9d5ca1dSBram Moolenaar " items and groups 178f9d5ca1dSBram Moolenaar if !exists('g:loaded_sql_completion') || 100 == g:loaded_sql_completion 179f9d5ca1dSBram Moolenaar call sqlcomplete#ResetCacheSyntax() 180f9d5ca1dSBram Moolenaar endif 181f9d5ca1dSBram Moolenaar 1820fd9289dSBram Moolenaar " Vim will automatically source the correct files if we 1830fd9289dSBram Moolenaar " change the filetype. You cannot do this with setfiletype 1840fd9289dSBram Moolenaar " since that command will only execute if a filetype has 1850fd9289dSBram Moolenaar " not already been set. In this case we want to override 1860fd9289dSBram Moolenaar " the existing filetype. 1870fd9289dSBram Moolenaar let &filetype = 'sql' 188f9d5ca1dSBram Moolenaar 189f9d5ca1dSBram Moolenaar if b:sql_compl_savefunc != "" 190f9d5ca1dSBram Moolenaar " We are changing the filetype to SQL from some other filetype 191f9d5ca1dSBram Moolenaar " which had OMNI completion defined. We need to activate the 192f9d5ca1dSBram Moolenaar " SQL completion plugin in order to cache some of the syntax items 193f9d5ca1dSBram Moolenaar " while the syntax rules for SQL are active. 194f9d5ca1dSBram Moolenaar call sqlcomplete#PreCacheSyntax() 195f9d5ca1dSBram Moolenaar endif 1960fd9289dSBram Moolenaar endfunction 1970fd9289dSBram Moolenaar command! -nargs=* -complete=custom,SQL_GetList SQLSetType :call SQL_SetType(<q-args>) 1980fd9289dSBram Moolenaar 1990fd9289dSBram Moolenaarendif 2000fd9289dSBram Moolenaar 2015c73622aSBram Moolenaar" Functions/Commands to allow the user determine current SQL syntax dialect 2025c73622aSBram Moolenaar" This works with both Vim 6 and 7. 2035c73622aSBram Moolenaar 2045c73622aSBram Moolenaarif !exists("*SQL_GetType") 2055c73622aSBram Moolenaar function SQL_GetType() 2065c73622aSBram Moolenaar if exists('b:sql_type_override') 2075c73622aSBram Moolenaar echomsg "Current SQL dialect in use:".b:sql_type_override 2085c73622aSBram Moolenaar else 2095c73622aSBram Moolenaar echomsg "Current SQL dialect in use:".g:sql_type_default 2105c73622aSBram Moolenaar endif 2115c73622aSBram Moolenaar endfunction 2125c73622aSBram Moolenaar command! -nargs=0 SQLGetType :call SQL_GetType() 2135c73622aSBram Moolenaarendif 2145c73622aSBram Moolenaar 2150fd9289dSBram Moolenaarif exists("b:sql_type_override") 2160fd9289dSBram Moolenaar " echo 'sourcing buffer ftplugin/'.b:sql_type_override.'.vim' 2170fd9289dSBram Moolenaar if globpath(&runtimepath, 'ftplugin/'.b:sql_type_override.'.vim') != '' 2180fd9289dSBram Moolenaar exec 'runtime ftplugin/'.b:sql_type_override.'.vim' 2190fd9289dSBram Moolenaar " else 2200fd9289dSBram Moolenaar " echomsg 'ftplugin/'.b:sql_type_override.' not exist, using default' 2210fd9289dSBram Moolenaar endif 2220fd9289dSBram Moolenaarelseif exists("g:sql_type_default") 2230fd9289dSBram Moolenaar " echo 'sourcing global ftplugin/'.g:sql_type_default.'.vim' 2240fd9289dSBram Moolenaar if globpath(&runtimepath, 'ftplugin/'.g:sql_type_default.'.vim') != '' 2250fd9289dSBram Moolenaar exec 'runtime ftplugin/'.g:sql_type_default.'.vim' 2260fd9289dSBram Moolenaar " else 2270fd9289dSBram Moolenaar " echomsg 'ftplugin/'.g:sql_type_default.'.vim not exist, using default' 2280fd9289dSBram Moolenaar endif 2290fd9289dSBram Moolenaarendif 2300fd9289dSBram Moolenaar 2310fd9289dSBram Moolenaar" If the above runtime command succeeded, do not load the default settings 2320fd9289dSBram Moolenaarif exists("b:did_ftplugin") 2330fd9289dSBram Moolenaar finish 2340fd9289dSBram Moolenaarendif 2350fd9289dSBram Moolenaar 2360fd9289dSBram Moolenaarlet b:undo_ftplugin = "setl comments<" 2370fd9289dSBram Moolenaar 238071d4279SBram Moolenaar" Don't load another plugin for this buffer 239071d4279SBram Moolenaarlet b:did_ftplugin = 1 2400fd9289dSBram Moolenaarlet b:current_ftplugin = 'sql' 2410fd9289dSBram Moolenaar 2420fd9289dSBram Moolenaar" Win32 can filter files in the browse dialog 2430fd9289dSBram Moolenaarif has("gui_win32") && !exists("b:browsefilter") 2440fd9289dSBram Moolenaar let b:browsefilter = "SQL Files (*.sql)\t*.sql\n" . 2450fd9289dSBram Moolenaar \ "All Files (*.*)\t*.*\n" 2460fd9289dSBram Moolenaarendif 247071d4279SBram Moolenaar 248df177f67SBram Moolenaar" Some standard expressions for use with the matchit strings 249df177f67SBram Moolenaarlet s:notend = '\%(\<end\s\+\)\@<!' 250df177f67SBram Moolenaarlet s:when_no_matched_or_others = '\%(\<when\>\%(\s\+\%(\%(\<not\>\s\+\)\?<matched\>\)\|\<others\>\)\@!\)' 251df177f67SBram Moolenaarlet s:or_replace = '\%(or\s\+replace\s\+\)\?' 252df177f67SBram Moolenaar 253071d4279SBram Moolenaar" Define patterns for the matchit macro 254071d4279SBram Moolenaarif !exists("b:match_words") 255071d4279SBram Moolenaar " SQL is generally case insensitive 256071d4279SBram Moolenaar let b:match_ignorecase = 1 257df177f67SBram Moolenaar 258df177f67SBram Moolenaar " Handle the following: 259df177f67SBram Moolenaar " if 260df177f67SBram Moolenaar " elseif | elsif 261df177f67SBram Moolenaar " else [if] 262df177f67SBram Moolenaar " end if 263df177f67SBram Moolenaar " 264df177f67SBram Moolenaar " [while condition] loop 265df177f67SBram Moolenaar " leave 266df177f67SBram Moolenaar " break 267df177f67SBram Moolenaar " continue 268df177f67SBram Moolenaar " exit 269df177f67SBram Moolenaar " end loop 270df177f67SBram Moolenaar " 271df177f67SBram Moolenaar " for 272df177f67SBram Moolenaar " leave 273df177f67SBram Moolenaar " break 274df177f67SBram Moolenaar " continue 275df177f67SBram Moolenaar " exit 276df177f67SBram Moolenaar " end loop 277df177f67SBram Moolenaar " 278df177f67SBram Moolenaar " do 279df177f67SBram Moolenaar " statements 280df177f67SBram Moolenaar " doend 281df177f67SBram Moolenaar " 282df177f67SBram Moolenaar " case 283df177f67SBram Moolenaar " when 284df177f67SBram Moolenaar " when 285df177f67SBram Moolenaar " default 286df177f67SBram Moolenaar " end case 287df177f67SBram Moolenaar " 288df177f67SBram Moolenaar " merge 289df177f67SBram Moolenaar " when not matched 290df177f67SBram Moolenaar " when matched 291df177f67SBram Moolenaar " 292df177f67SBram Moolenaar " EXCEPTION 293df177f67SBram Moolenaar " WHEN column_not_found THEN 294df177f67SBram Moolenaar " WHEN OTHERS THEN 295df177f67SBram Moolenaar " 296df177f67SBram Moolenaar " create[ or replace] procedure|function|event 297*adc2182cSBram Moolenaar " \ '^\s*\<\%(do\|for\|while\|loop\)\>.*:'. 298df177f67SBram Moolenaar 299071d4279SBram Moolenaar let b:match_words = 300df177f67SBram Moolenaar \ '\<begin\>:\<end\>\W*$,'. 301df177f67SBram Moolenaar \ 302df177f67SBram Moolenaar \ s:notend . '\<if\>:'. 303df177f67SBram Moolenaar \ '\<elsif\>\|\<elseif\>\|\<else\>:'. 304df177f67SBram Moolenaar \ '\<end\s\+if\>,'. 305df177f67SBram Moolenaar \ 306*adc2182cSBram Moolenaar \ '\(^\s*\)\@<=\(\<\%(do\|for\|while\|loop\)\>.*\):'. 307*adc2182cSBram Moolenaar \ '\%(\<exit\>\|\<leave\>\|\<break\>\|\<continue\>\):'. 308*adc2182cSBram Moolenaar \ '\%(\<doend\>\|\%(\<end\s\+\%(for\|while\|loop\>\)\)\),'. 309df177f67SBram Moolenaar \ 310df177f67SBram Moolenaar \ '\%('. s:notend . '\<case\>\):'. 311df177f67SBram Moolenaar \ '\%('.s:when_no_matched_or_others.'\):'. 312df177f67SBram Moolenaar \ '\%(\<when\s\+others\>\|\<end\s\+case\>\),' . 313df177f67SBram Moolenaar \ 314df177f67SBram Moolenaar \ '\<merge\>:' . 315df177f67SBram Moolenaar \ '\<when\s\+not\s\+matched\>:' . 316df177f67SBram Moolenaar \ '\<when\s\+matched\>,' . 317df177f67SBram Moolenaar \ 318df177f67SBram Moolenaar \ '\%(\<create\s\+' . s:or_replace . '\)\?'. 319df177f67SBram Moolenaar \ '\%(function\|procedure\|event\):'. 320df177f67SBram Moolenaar \ '\<returns\?\>' 321df177f67SBram Moolenaar " \ '\<begin\>\|\<returns\?\>:'. 322df177f67SBram Moolenaar " \ '\<end\>\(;\)\?\s*$' 323df177f67SBram Moolenaar " \ '\<exception\>:'.s:when_no_matched_or_others. 324df177f67SBram Moolenaar " \ ':\<when\s\+others\>,'. 325df177f67SBram Moolenaar " 326df177f67SBram Moolenaar " \ '\%(\<exception\>\|\%('. s:notend . '\<case\>\)\):'. 327df177f67SBram Moolenaar " \ '\%(\<default\>\|'.s:when_no_matched_or_others.'\):'. 328df177f67SBram Moolenaar " \ '\%(\%(\<when\s\+others\>\)\|\<end\s\+case\>\),' . 329071d4279SBram Moolenaarendif 330df177f67SBram Moolenaar 331df177f67SBram Moolenaar" Define how to find the macro definition of a variable using the various 332df177f67SBram Moolenaar" [d, [D, [_CTRL_D and so on features 333df177f67SBram Moolenaar" Match these values ignoring case 334df177f67SBram Moolenaar" ie DECLARE varname INTEGER 3350fd9289dSBram Moolenaarlet &l:define = '\c\<\(VARIABLE\|DECLARE\|IN\|OUT\|INOUT\)\>' 336df177f67SBram Moolenaar 337df177f67SBram Moolenaar 338df177f67SBram Moolenaar" Mappings to move to the next BEGIN ... END block 339df177f67SBram Moolenaar" \W - no characters or digits 3400fd9289dSBram Moolenaarnmap <buffer> <silent> ]] :call search('\\c^\\s*begin\\>', 'W' )<CR> 3410fd9289dSBram Moolenaarnmap <buffer> <silent> [[ :call search('\\c^\\s*begin\\>', 'bW' )<CR> 3420fd9289dSBram Moolenaarnmap <buffer> <silent> ][ :call search('\\c^\\s*end\\W*$', 'W' )<CR> 3430fd9289dSBram Moolenaarnmap <buffer> <silent> [] :call search('\\c^\\s*end\\W*$', 'bW' )<CR> 3443577c6faSBram Moolenaarvmap <buffer> <silent> ]] :<C-U>exec "normal! gv"<Bar>call search('\\c^\\s*begin\\>', 'W' )<CR> 3453577c6faSBram Moolenaarvmap <buffer> <silent> [[ :<C-U>exec "normal! gv"<Bar>call search('\\c^\\s*begin\\>', 'bW' )<CR> 3463577c6faSBram Moolenaarvmap <buffer> <silent> ][ :<C-U>exec "normal! gv"<Bar>call search('\\c^\\s*end\\W*$', 'W' )<CR> 3473577c6faSBram Moolenaarvmap <buffer> <silent> [] :<C-U>exec "normal! gv"<Bar>call search('\\c^\\s*end\\W*$', 'bW' )<CR> 348df177f67SBram Moolenaar 349df177f67SBram Moolenaar 3500fd9289dSBram Moolenaar" By default only look for CREATE statements, but allow 3510fd9289dSBram Moolenaar" the user to override 3520fd9289dSBram Moolenaarif !exists('g:ftplugin_sql_statements') 3530fd9289dSBram Moolenaar let g:ftplugin_sql_statements = 'create' 3540fd9289dSBram Moolenaarendif 3550fd9289dSBram Moolenaar 356df177f67SBram Moolenaar" Predefined SQL objects what are used by the below mappings using 357df177f67SBram Moolenaar" the ]} style maps. 358df177f67SBram Moolenaar" This global variable allows the users to override it's value 359df177f67SBram Moolenaar" from within their vimrc. 3600fd9289dSBram Moolenaar" Note, you cannot use \?, since these patterns can be used to search 3610fd9289dSBram Moolenaar" backwards, you must use \{,1} 362df177f67SBram Moolenaarif !exists('g:ftplugin_sql_objects') 363df177f67SBram Moolenaar let g:ftplugin_sql_objects = 'function,procedure,event,' . 3640fd9289dSBram Moolenaar \ '\\(existing\\\\|global\\s\\+temporary\\s\\+\\)\\\{,1}' . 3650fd9289dSBram Moolenaar \ 'table,trigger' . 366df177f67SBram Moolenaar \ ',schema,service,publication,database,datatype,domain' . 367df177f67SBram Moolenaar \ ',index,subscription,synchronization,view,variable' 368df177f67SBram Moolenaarendif 369df177f67SBram Moolenaar 3705c73622aSBram Moolenaar" Key to trigger SQL completion 3715c73622aSBram Moolenaarif !exists('g:ftplugin_sql_omni_key') 3725c73622aSBram Moolenaar let g:ftplugin_sql_omni_key = '<C-C>' 3735c73622aSBram Moolenaarendif 3745c73622aSBram Moolenaar" Key to trigger drill into column list 3755c73622aSBram Moolenaarif !exists('g:ftplugin_sql_omni_key_right') 3765c73622aSBram Moolenaar let g:ftplugin_sql_omni_key_right = '<Right>' 3775c73622aSBram Moolenaarendif 3785c73622aSBram Moolenaar" Key to trigger drill out of column list 3795c73622aSBram Moolenaarif !exists('g:ftplugin_sql_omni_key_left') 3805c73622aSBram Moolenaar let g:ftplugin_sql_omni_key_left = '<Left>' 3815c73622aSBram Moolenaarendif 3825c73622aSBram Moolenaar 3830fd9289dSBram Moolenaar" Replace all ,'s with bars, except ones with numbers after them. 3840fd9289dSBram Moolenaar" This will most likely be a \{,1} string. 385df177f67SBram Moolenaarlet s:ftplugin_sql_objects = 3860fd9289dSBram Moolenaar \ '\\c^\\s*' . 3870fd9289dSBram Moolenaar \ '\\(\\(' . 3880fd9289dSBram Moolenaar \ substitute(g:ftplugin_sql_statements, ',\d\@!', '\\\\\\|', 'g') . 3890fd9289dSBram Moolenaar \ '\\)\\s\\+\\(or\\s\\+replace\\\s\+\\)\\{,1}\\)\\{,1}' . 3900fd9289dSBram Moolenaar \ '\\<\\(' . 3910fd9289dSBram Moolenaar \ substitute(g:ftplugin_sql_objects, ',\d\@!', '\\\\\\|', 'g') . 3920fd9289dSBram Moolenaar \ '\\)\\>' 393df177f67SBram Moolenaar 394df177f67SBram Moolenaar" Mappings to move to the next CREATE ... block 395df177f67SBram Moolenaarexec "nmap <buffer> <silent> ]} :call search('".s:ftplugin_sql_objects."', 'W')<CR>" 396df177f67SBram Moolenaarexec "nmap <buffer> <silent> [{ :call search('".s:ftplugin_sql_objects."', 'bW')<CR>" 397df177f67SBram Moolenaar" Could not figure out how to use a :call search() string in visual mode 398df177f67SBram Moolenaar" without it ending visual mode 3990fd9289dSBram Moolenaar" Unfortunately, this will add a entry to the search history 400df177f67SBram Moolenaarexec 'vmap <buffer> <silent> ]} /'.s:ftplugin_sql_objects.'<CR>' 401df177f67SBram Moolenaarexec 'vmap <buffer> <silent> [{ ?'.s:ftplugin_sql_objects.'<CR>' 402df177f67SBram Moolenaar 403df177f67SBram Moolenaar" Mappings to move to the next COMMENT 404df177f67SBram Moolenaar" 405df177f67SBram Moolenaar" Had to double the \ for the \| separator since this has a special 406df177f67SBram Moolenaar" meaning on maps 4070fd9289dSBram Moolenaarlet b:comment_leader = '\\(--\\\|\\/\\/\\\|\\*\\\|\\/\\*\\\|\\*\\/\\)' 408df177f67SBram Moolenaar" Find the start of the next comment 4090fd9289dSBram Moolenaarlet b:comment_start = '^\\(\\s*'.b:comment_leader.'.*\\n\\)\\@<!'. 4100fd9289dSBram Moolenaar \ '\\(\\s*'.b:comment_leader.'\\)' 411df177f67SBram Moolenaar" Find the end of the previous comment 4120fd9289dSBram Moolenaarlet b:comment_end = '\\(^\\s*'.b:comment_leader.'.*\\n\\)'. 4130fd9289dSBram Moolenaar \ '\\(^\\s*'.b:comment_leader.'\\)\\@!' 414df177f67SBram Moolenaar" Skip over the comment 415df177f67SBram Moolenaarlet b:comment_jump_over = "call search('". 4160fd9289dSBram Moolenaar \ '^\\(\\s*'.b:comment_leader.'.*\\n\\)\\@<!'. 417df177f67SBram Moolenaar \ "', 'W')" 418df177f67SBram Moolenaarlet b:comment_skip_back = "call search('". 4190fd9289dSBram Moolenaar \ '^\\(\\s*'.b:comment_leader.'.*\\n\\)\\@<!'. 420df177f67SBram Moolenaar \ "', 'bW')" 421df177f67SBram Moolenaar" Move to the start and end of comments 4223577c6faSBram Moolenaarexec 'nnoremap <silent><buffer> ]" :call search('."'".b:comment_start."'".', "W" )<CR>' 4233577c6faSBram Moolenaarexec 'nnoremap <silent><buffer> [" :call search('."'".b:comment_end."'".', "W" )<CR>' 4243577c6faSBram Moolenaarexec 'vnoremap <silent><buffer> ]" :<C-U>exec "normal! gv"<Bar>call search('."'".b:comment_start."'".', "W" )<CR>' 4253577c6faSBram Moolenaarexec 'vnoremap <silent><buffer> [" :<C-U>exec "normal! gv"<Bar>call search('."'".b:comment_end."'".', "W" )<CR>' 426df177f67SBram Moolenaar 427df177f67SBram Moolenaar" Comments can be of the form: 428df177f67SBram Moolenaar" /* 429df177f67SBram Moolenaar" * 430df177f67SBram Moolenaar" */ 431df177f67SBram Moolenaar" or 432df177f67SBram Moolenaar" -- 4330fd9289dSBram Moolenaar" or 4340fd9289dSBram Moolenaar" // 435df177f67SBram Moolenaarsetlocal comments=s1:/*,mb:*,ex:*/,:--,:// 436df177f67SBram Moolenaar 4370fd9289dSBram Moolenaar" Set completion with CTRL-X CTRL-O to autoloaded function. 4380fd9289dSBram Moolenaarif exists('&omnifunc') 439f193fffdSBram Moolenaar " Since the SQL completion plugin can be used in conjunction 440f193fffdSBram Moolenaar " with other completion filetypes it must record the previous 441f193fffdSBram Moolenaar " OMNI function prior to setting up the SQL OMNI function 442f193fffdSBram Moolenaar let b:sql_compl_savefunc = &omnifunc 443f193fffdSBram Moolenaar 4440fd9289dSBram Moolenaar " This is used by the sqlcomplete.vim plugin 4450fd9289dSBram Moolenaar " Source it for it's global functions 4460fd9289dSBram Moolenaar runtime autoload/syntaxcomplete.vim 4470fd9289dSBram Moolenaar 4480fd9289dSBram Moolenaar setlocal omnifunc=sqlcomplete#Complete 4490fd9289dSBram Moolenaar " Prevent the intellisense plugin from loading 4500fd9289dSBram Moolenaar let b:sql_vis = 1 451e2f98b95SBram Moolenaar if !exists('g:omni_sql_no_default_maps') 452e2f98b95SBram Moolenaar " Static maps which use populate the completion list 453e2f98b95SBram Moolenaar " using Vim's syntax highlighting rules 4545c73622aSBram Moolenaar exec 'imap <buffer> '.g:ftplugin_sql_omni_key.'a <C-\><C-O>:call sqlcomplete#Map("syntax")<CR><C-X><C-O>' 4555c73622aSBram Moolenaar exec 'imap <buffer> '.g:ftplugin_sql_omni_key.'k <C-\><C-O>:call sqlcomplete#Map("sqlKeyword")<CR><C-X><C-O>' 4565c73622aSBram Moolenaar exec 'imap <buffer> '.g:ftplugin_sql_omni_key.'f <C-\><C-O>:call sqlcomplete#Map("sqlFunction")<CR><C-X><C-O>' 4575c73622aSBram Moolenaar exec 'imap <buffer> '.g:ftplugin_sql_omni_key.'o <C-\><C-O>:call sqlcomplete#Map("sqlOption")<CR><C-X><C-O>' 4585c73622aSBram Moolenaar exec 'imap <buffer> '.g:ftplugin_sql_omni_key.'T <C-\><C-O>:call sqlcomplete#Map("sqlType")<CR><C-X><C-O>' 4595c73622aSBram Moolenaar exec 'imap <buffer> '.g:ftplugin_sql_omni_key.'s <C-\><C-O>:call sqlcomplete#Map("sqlStatement")<CR><C-X><C-O>' 460e2f98b95SBram Moolenaar " Dynamic maps which use populate the completion list 461e2f98b95SBram Moolenaar " using the dbext.vim plugin 4625c73622aSBram Moolenaar exec 'imap <buffer> '.g:ftplugin_sql_omni_key.'t <C-\><C-O>:call sqlcomplete#Map("table")<CR><C-X><C-O>' 4635c73622aSBram Moolenaar exec 'imap <buffer> '.g:ftplugin_sql_omni_key.'p <C-\><C-O>:call sqlcomplete#Map("procedure")<CR><C-X><C-O>' 4645c73622aSBram Moolenaar exec 'imap <buffer> '.g:ftplugin_sql_omni_key.'v <C-\><C-O>:call sqlcomplete#Map("view")<CR><C-X><C-O>' 4655c73622aSBram Moolenaar exec 'imap <buffer> '.g:ftplugin_sql_omni_key.'c <C-\><C-O>:call sqlcomplete#Map("column")<CR><C-X><C-O>' 4665c73622aSBram Moolenaar exec 'imap <buffer> '.g:ftplugin_sql_omni_key.'l <C-\><C-O>:call sqlcomplete#Map("column_csv")<CR><C-X><C-O>' 467e2f98b95SBram Moolenaar " The next 3 maps are only to be used while the completion window is 468e2f98b95SBram Moolenaar " active due to the <CR> at the beginning of the map 4695c73622aSBram 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>' 470f193fffdSBram Moolenaar " <C-Right> is not recognized on most Unix systems, so only create 471f193fffdSBram Moolenaar " these additional maps on the Windows platform. 472f193fffdSBram Moolenaar " If you would like to use these maps, choose a different key and make 473f193fffdSBram Moolenaar " the same map in your vimrc. 4745c73622aSBram Moolenaar " if has('win32') 4755c73622aSBram Moolenaar exec 'imap <buffer> '.g:ftplugin_sql_omni_key_right.' <C-R>=sqlcomplete#DrillIntoTable()<CR>' 4765c73622aSBram Moolenaar exec 'imap <buffer> '.g:ftplugin_sql_omni_key_left.' <C-R>=sqlcomplete#DrillOutOfColumns()<CR>' 4775c73622aSBram Moolenaar " endif 478e2f98b95SBram Moolenaar " Remove any cached items useful for schema changes 4795c73622aSBram Moolenaar exec 'imap <buffer> '.g:ftplugin_sql_omni_key.'R <C-\><C-O>:call sqlcomplete#Map("resetCache")<CR><C-X><C-O>' 480f193fffdSBram Moolenaar endif 481f193fffdSBram Moolenaar 482f193fffdSBram Moolenaar if b:sql_compl_savefunc != "" 483f193fffdSBram Moolenaar " We are changing the filetype to SQL from some other filetype 484f193fffdSBram Moolenaar " which had OMNI completion defined. We need to activate the 485f193fffdSBram Moolenaar " SQL completion plugin in order to cache some of the syntax items 486f193fffdSBram Moolenaar " while the syntax rules for SQL are active. 487f9d5ca1dSBram Moolenaar call sqlcomplete#ResetCacheSyntax() 488f193fffdSBram Moolenaar call sqlcomplete#PreCacheSyntax() 489e2f98b95SBram Moolenaar endif 4900fd9289dSBram Moolenaarendif 4910fd9289dSBram Moolenaar 492df177f67SBram Moolenaarlet &cpo = s:save_cpo 493df177f67SBram Moolenaar 494e2f98b95SBram Moolenaar" vim:sw=4: 495df177f67SBram Moolenaar 496