xref: /vim-8.2.3635/runtime/ftplugin/sql.vim (revision ad3b366c)
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