xref: /vim-8.2.3635/runtime/ftplugin/sql.vim (revision 34feacbc)
1df177f67SBram Moolenaar" SQL filetype plugin file
2071d4279SBram Moolenaar" Language:    SQL (Common for Oracle, Microsoft SQL Server, Sybase)
3*34feacbcSBram Moolenaar" Version:     10.0
4adc2182cSBram Moolenaar" Maintainer:  David Fishburn <dfishburn dot vim at gmail dot com>
5*34feacbcSBram Moolenaar" Last Change: 2012 Dec 04
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*34feacbcSBram Moolenaar" Version 10.0 (Dec 2012)
40*34feacbcSBram Moolenaar"
41*34feacbcSBram Moolenaar" NF: Changed all maps to use noremap instead of must map
42*34feacbcSBram Moolenaar" NF: Changed all visual maps to use xnoremap instead of vnoremap as they
43*34feacbcSBram Moolenaar"     should only be used in visual mode and not select mode.
44*34feacbcSBram Moolenaar" BF: Most of the maps were using doubled up backslashes before they were
45*34feacbcSBram Moolenaar"     changed to using the search() function, which meant they no longer
46*34feacbcSBram Moolenaar"     worked.
47*34feacbcSBram Moolenaar"
48*34feacbcSBram Moolenaar" Version 9.0
49*34feacbcSBram Moolenaar"
50*34feacbcSBram Moolenaar" NF: Completes 'b:undo_ftplugin'
51*34feacbcSBram Moolenaar" BF: Correctly set cpoptions when creating script
52*34feacbcSBram Moolenaar"
53adc2182cSBram Moolenaar" Version 8.0
54adc2182cSBram Moolenaar"
55adc2182cSBram Moolenaar" NF: Improved the matchit plugin regex (Talek)
56adc2182cSBram Moolenaar"
57f9d5ca1dSBram Moolenaar" Version 7.0
58f9d5ca1dSBram Moolenaar"
59f9d5ca1dSBram Moolenaar" NF: Calls the sqlcomplete#ResetCacheSyntax() function when calling
60f9d5ca1dSBram Moolenaar"     SQLSetType.
61f9d5ca1dSBram Moolenaar"
625c73622aSBram Moolenaar" Version 6.0
635c73622aSBram Moolenaar"
645c73622aSBram Moolenaar" NF: Adds the command SQLGetType
655c73622aSBram Moolenaar"
665c73622aSBram Moolenaar" Version 5.0
675c73622aSBram Moolenaar"
685c73622aSBram Moolenaar" NF: Adds the ability to choose the keys to control SQL completion, just add
695c73622aSBram Moolenaar"     the following to your .vimrc:
705c73622aSBram Moolenaar"    let g:ftplugin_sql_omni_key       = '<C-C>'
715c73622aSBram Moolenaar"    let g:ftplugin_sql_omni_key_right = '<Right>'
725c73622aSBram Moolenaar"    let g:ftplugin_sql_omni_key_left  = '<Left>'
735c73622aSBram Moolenaar"
745c73622aSBram Moolenaar" BF: format-options - Auto-wrap comments using textwidth was turned off
755c73622aSBram Moolenaar"                      by mistake.
760fd9289dSBram Moolenaar
770fd9289dSBram Moolenaar
78071d4279SBram Moolenaar" Only do this when not done yet for this buffer
79071d4279SBram Moolenaarif exists("b:did_ftplugin")
80071d4279SBram Moolenaar  finish
81071d4279SBram Moolenaarendif
82071d4279SBram Moolenaar
83df177f67SBram Moolenaarlet s:save_cpo = &cpo
848e52a593SBram Moolenaarset cpo&vim
85df177f67SBram Moolenaar
863577c6faSBram Moolenaar" Disable autowrapping for code, but enable for comments
873577c6faSBram Moolenaar" t	Auto-wrap text using textwidth
883577c6faSBram Moolenaar" c     Auto-wrap comments using textwidth, inserting the current comment
893577c6faSBram Moolenaar"       leader automatically.
903577c6faSBram Moolenaarsetlocal formatoptions-=t
915c73622aSBram Moolenaarsetlocal formatoptions+=c
923577c6faSBram Moolenaar
930fd9289dSBram Moolenaar" Functions/Commands to allow the user to change SQL syntax dialects
940fd9289dSBram Moolenaar" through the use of :SQLSetType <tab> for completion.
950fd9289dSBram Moolenaar" This works with both Vim 6 and 7.
960fd9289dSBram Moolenaar
970fd9289dSBram Moolenaarif !exists("*SQL_SetType")
980fd9289dSBram Moolenaar    " NOTE: You cannot use function! since this file can be
990fd9289dSBram Moolenaar    " sourced from within this function.  That will result in
1000fd9289dSBram Moolenaar    " an error reported by Vim.
1010fd9289dSBram Moolenaar    function SQL_GetList(ArgLead, CmdLine, CursorPos)
1020fd9289dSBram Moolenaar
1030fd9289dSBram Moolenaar        if !exists('s:sql_list')
1040fd9289dSBram Moolenaar            " Grab a list of files that contain "sql" in their names
1050fd9289dSBram Moolenaar            let list_indent   = globpath(&runtimepath, 'indent/*sql*')
1060fd9289dSBram Moolenaar            let list_syntax   = globpath(&runtimepath, 'syntax/*sql*')
1070fd9289dSBram Moolenaar            let list_ftplugin = globpath(&runtimepath, 'ftplugin/*sql*')
1080fd9289dSBram Moolenaar
1090fd9289dSBram Moolenaar            let sqls = "\n".list_indent."\n".list_syntax."\n".list_ftplugin."\n"
1100fd9289dSBram Moolenaar
1110fd9289dSBram Moolenaar            " Strip out everything (path info) but the filename
1120fd9289dSBram Moolenaar            " Regex
1130fd9289dSBram Moolenaar            "    From between two newline characters
1140fd9289dSBram Moolenaar            "    Non-greedily grab all characters
1150fd9289dSBram Moolenaar            "    Followed by a valid filename \w\+\.\w\+ (sql.vim)
1160fd9289dSBram Moolenaar            "    Followed by a newline, but do not include the newline
1170fd9289dSBram Moolenaar            "
1180fd9289dSBram Moolenaar            "    Replace it with just the filename (get rid of PATH)
1190fd9289dSBram Moolenaar            "
1200fd9289dSBram Moolenaar            "    Recursively, since there are many filenames that contain
1210fd9289dSBram Moolenaar            "    the word SQL in the indent, syntax and ftplugin directory
1220fd9289dSBram Moolenaar            let sqls = substitute( sqls,
1230fd9289dSBram Moolenaar                        \ '[\n]\%(.\{-}\)\(\w\+\.\w\+\)\n\@=',
1240fd9289dSBram Moolenaar                        \ '\1\n',
1250fd9289dSBram Moolenaar                        \ 'g'
1260fd9289dSBram Moolenaar                        \ )
1270fd9289dSBram Moolenaar
1280fd9289dSBram Moolenaar            " Remove duplicates, since sqlanywhere.vim can exist in the
1290fd9289dSBram Moolenaar            " sytax, indent and ftplugin directory, yet we only want
1300fd9289dSBram Moolenaar            " to display the option once
1310fd9289dSBram Moolenaar            let index = match(sqls, '.\{-}\ze\n')
1320fd9289dSBram Moolenaar            while index > -1
1330fd9289dSBram Moolenaar                " Get the first filename
1340fd9289dSBram Moolenaar                let file = matchstr(sqls, '.\{-}\ze\n', index)
1350fd9289dSBram Moolenaar                " Recursively replace any *other* occurrence of that
1360fd9289dSBram Moolenaar                " filename with nothing (ie remove it)
1370fd9289dSBram Moolenaar                let sqls = substitute(sqls, '\%>'.(index+strlen(file)).'c\<'.file.'\>\n', '', 'g')
1380fd9289dSBram Moolenaar                " Move on to the next filename
1390fd9289dSBram Moolenaar                let index = match(sqls, '.\{-}\ze\n', (index+strlen(file)+1))
1400fd9289dSBram Moolenaar            endwhile
1410fd9289dSBram Moolenaar
1420fd9289dSBram Moolenaar            " Sort the list if using version 7
1430fd9289dSBram Moolenaar            if v:version >= 700
1440fd9289dSBram Moolenaar                let mylist = split(sqls, "\n")
1450fd9289dSBram Moolenaar                let mylist = sort(mylist)
1460fd9289dSBram Moolenaar                let sqls   = join(mylist, "\n")
1470fd9289dSBram Moolenaar            endif
1480fd9289dSBram Moolenaar
1490fd9289dSBram Moolenaar            let s:sql_list = sqls
1500fd9289dSBram Moolenaar        endif
1510fd9289dSBram Moolenaar
1520fd9289dSBram Moolenaar        return s:sql_list
1530fd9289dSBram Moolenaar
1540fd9289dSBram Moolenaar    endfunction
1550fd9289dSBram Moolenaar
1560fd9289dSBram Moolenaar    function SQL_SetType(name)
1570fd9289dSBram Moolenaar
1580fd9289dSBram Moolenaar        " User has decided to override default SQL scripts and
1590fd9289dSBram Moolenaar        " specify a vendor specific version
1600fd9289dSBram Moolenaar        " (ie Oracle, Informix, SQL Anywhere, ...)
1610fd9289dSBram Moolenaar        " So check for an remove any settings that prevent the
1620fd9289dSBram Moolenaar        " scripts from being executed, and then source the
1630fd9289dSBram Moolenaar        " appropriate Vim scripts.
1640fd9289dSBram Moolenaar        if exists("b:did_ftplugin")
1650fd9289dSBram Moolenaar            unlet b:did_ftplugin
1660fd9289dSBram Moolenaar        endif
1670fd9289dSBram Moolenaar        if exists("b:current_syntax")
1680fd9289dSBram Moolenaar            " echomsg 'SQLSetType - clearing syntax'
1690fd9289dSBram Moolenaar            syntax clear
1700fd9289dSBram Moolenaar        endif
1710fd9289dSBram Moolenaar        if exists("b:did_indent")
1720fd9289dSBram Moolenaar            " echomsg 'SQLSetType - clearing indent'
1730fd9289dSBram Moolenaar            unlet b:did_indent
1740fd9289dSBram Moolenaar            " Set these values to their defaults
1750fd9289dSBram Moolenaar            setlocal indentkeys&
1760fd9289dSBram Moolenaar            setlocal indentexpr&
1770fd9289dSBram Moolenaar        endif
1780fd9289dSBram Moolenaar
1790fd9289dSBram Moolenaar        " Ensure the name is in the correct format
1800fd9289dSBram Moolenaar        let new_sql_type = substitute(a:name,
1810fd9289dSBram Moolenaar                    \ '\s*\([^\.]\+\)\(\.\w\+\)\?', '\L\1', '')
1820fd9289dSBram Moolenaar
1830fd9289dSBram Moolenaar        " Do not specify a buffer local variable if it is
1840fd9289dSBram Moolenaar        " the default value
1850fd9289dSBram Moolenaar        if new_sql_type == 'sql'
1860fd9289dSBram Moolenaar          let new_sql_type = 'sqloracle'
1870fd9289dSBram Moolenaar        endif
1880fd9289dSBram Moolenaar        let b:sql_type_override = new_sql_type
1890fd9289dSBram Moolenaar
190f9d5ca1dSBram Moolenaar        " Remove any cached SQL since a new sytax will have different
191f9d5ca1dSBram Moolenaar        " items and groups
192f9d5ca1dSBram Moolenaar        if !exists('g:loaded_sql_completion') || 100 == g:loaded_sql_completion
193f9d5ca1dSBram Moolenaar            call sqlcomplete#ResetCacheSyntax()
194f9d5ca1dSBram Moolenaar        endif
195f9d5ca1dSBram Moolenaar
1960fd9289dSBram Moolenaar        " Vim will automatically source the correct files if we
1970fd9289dSBram Moolenaar        " change the filetype.  You cannot do this with setfiletype
1980fd9289dSBram Moolenaar        " since that command will only execute if a filetype has
1990fd9289dSBram Moolenaar        " not already been set.  In this case we want to override
2000fd9289dSBram Moolenaar        " the existing filetype.
2010fd9289dSBram Moolenaar        let &filetype = 'sql'
202f9d5ca1dSBram Moolenaar
203f9d5ca1dSBram Moolenaar        if b:sql_compl_savefunc != ""
204f9d5ca1dSBram Moolenaar            " We are changing the filetype to SQL from some other filetype
205f9d5ca1dSBram Moolenaar            " which had OMNI completion defined.  We need to activate the
206f9d5ca1dSBram Moolenaar            " SQL completion plugin in order to cache some of the syntax items
207f9d5ca1dSBram Moolenaar            " while the syntax rules for SQL are active.
208f9d5ca1dSBram Moolenaar            call sqlcomplete#PreCacheSyntax()
209f9d5ca1dSBram Moolenaar        endif
2100fd9289dSBram Moolenaar    endfunction
2110fd9289dSBram Moolenaar    command! -nargs=* -complete=custom,SQL_GetList SQLSetType :call SQL_SetType(<q-args>)
2120fd9289dSBram Moolenaar
2130fd9289dSBram Moolenaarendif
2140fd9289dSBram Moolenaar
2155c73622aSBram Moolenaar" Functions/Commands to allow the user determine current SQL syntax dialect
2165c73622aSBram Moolenaar" This works with both Vim 6 and 7.
2175c73622aSBram Moolenaar
2185c73622aSBram Moolenaarif !exists("*SQL_GetType")
2195c73622aSBram Moolenaar    function SQL_GetType()
2205c73622aSBram Moolenaar        if exists('b:sql_type_override')
2215c73622aSBram Moolenaar            echomsg "Current SQL dialect in use:".b:sql_type_override
2225c73622aSBram Moolenaar        else
2235c73622aSBram Moolenaar            echomsg "Current SQL dialect in use:".g:sql_type_default
2245c73622aSBram Moolenaar        endif
2255c73622aSBram Moolenaar    endfunction
2265c73622aSBram Moolenaar    command! -nargs=0 SQLGetType :call SQL_GetType()
2275c73622aSBram Moolenaarendif
2285c73622aSBram Moolenaar
2290fd9289dSBram Moolenaarif exists("b:sql_type_override")
2300fd9289dSBram Moolenaar    " echo 'sourcing buffer ftplugin/'.b:sql_type_override.'.vim'
2310fd9289dSBram Moolenaar    if globpath(&runtimepath, 'ftplugin/'.b:sql_type_override.'.vim') != ''
2320fd9289dSBram Moolenaar        exec 'runtime ftplugin/'.b:sql_type_override.'.vim'
2330fd9289dSBram Moolenaar    " else
2340fd9289dSBram Moolenaar    "     echomsg 'ftplugin/'.b:sql_type_override.' not exist, using default'
2350fd9289dSBram Moolenaar    endif
2360fd9289dSBram Moolenaarelseif exists("g:sql_type_default")
2370fd9289dSBram Moolenaar    " echo 'sourcing global ftplugin/'.g:sql_type_default.'.vim'
2380fd9289dSBram Moolenaar    if globpath(&runtimepath, 'ftplugin/'.g:sql_type_default.'.vim') != ''
2390fd9289dSBram Moolenaar        exec 'runtime ftplugin/'.g:sql_type_default.'.vim'
2400fd9289dSBram Moolenaar    " else
2410fd9289dSBram Moolenaar    "     echomsg 'ftplugin/'.g:sql_type_default.'.vim not exist, using default'
2420fd9289dSBram Moolenaar    endif
2430fd9289dSBram Moolenaarendif
2440fd9289dSBram Moolenaar
2450fd9289dSBram Moolenaar" If the above runtime command succeeded, do not load the default settings
2460fd9289dSBram Moolenaarif exists("b:did_ftplugin")
2470fd9289dSBram Moolenaar  finish
2480fd9289dSBram Moolenaarendif
2490fd9289dSBram Moolenaar
250*34feacbcSBram Moolenaarlet b:undo_ftplugin = "setl comments< formatoptions< define< omnifunc<" .
251*34feacbcSBram Moolenaar		    \ " | unlet! b:browsefilter b:match_words"
2520fd9289dSBram Moolenaar
253071d4279SBram Moolenaar" Don't load another plugin for this buffer
254071d4279SBram Moolenaarlet b:did_ftplugin     = 1
2550fd9289dSBram Moolenaarlet b:current_ftplugin = 'sql'
2560fd9289dSBram Moolenaar
2570fd9289dSBram Moolenaar" Win32 can filter files in the browse dialog
2580fd9289dSBram Moolenaarif has("gui_win32") && !exists("b:browsefilter")
2590fd9289dSBram Moolenaar    let b:browsefilter = "SQL Files (*.sql)\t*.sql\n" .
2600fd9289dSBram Moolenaar	  \ "All Files (*.*)\t*.*\n"
2610fd9289dSBram Moolenaarendif
262071d4279SBram Moolenaar
263df177f67SBram Moolenaar" Some standard expressions for use with the matchit strings
264df177f67SBram Moolenaarlet s:notend = '\%(\<end\s\+\)\@<!'
265df177f67SBram Moolenaarlet s:when_no_matched_or_others = '\%(\<when\>\%(\s\+\%(\%(\<not\>\s\+\)\?<matched\>\)\|\<others\>\)\@!\)'
266df177f67SBram Moolenaarlet s:or_replace = '\%(or\s\+replace\s\+\)\?'
267df177f67SBram Moolenaar
268071d4279SBram Moolenaar" Define patterns for the matchit macro
269071d4279SBram Moolenaarif !exists("b:match_words")
270071d4279SBram Moolenaar    " SQL is generally case insensitive
271071d4279SBram Moolenaar    let b:match_ignorecase = 1
272df177f67SBram Moolenaar
273df177f67SBram Moolenaar    " Handle the following:
274df177f67SBram Moolenaar    " if
275df177f67SBram Moolenaar    " elseif | elsif
276df177f67SBram Moolenaar    " else [if]
277df177f67SBram Moolenaar    " end if
278df177f67SBram Moolenaar    "
279df177f67SBram Moolenaar    " [while condition] loop
280df177f67SBram Moolenaar    "     leave
281df177f67SBram Moolenaar    "     break
282df177f67SBram Moolenaar    "     continue
283df177f67SBram Moolenaar    "     exit
284df177f67SBram Moolenaar    " end loop
285df177f67SBram Moolenaar    "
286df177f67SBram Moolenaar    " for
287df177f67SBram Moolenaar    "     leave
288df177f67SBram Moolenaar    "     break
289df177f67SBram Moolenaar    "     continue
290df177f67SBram Moolenaar    "     exit
291df177f67SBram Moolenaar    " end loop
292df177f67SBram Moolenaar    "
293df177f67SBram Moolenaar    " do
294df177f67SBram Moolenaar    "     statements
295df177f67SBram Moolenaar    " doend
296df177f67SBram Moolenaar    "
297df177f67SBram Moolenaar    " case
298df177f67SBram Moolenaar    " when
299df177f67SBram Moolenaar    " when
300df177f67SBram Moolenaar    " default
301df177f67SBram Moolenaar    " end case
302df177f67SBram Moolenaar    "
303df177f67SBram Moolenaar    " merge
304df177f67SBram Moolenaar    " when not matched
305df177f67SBram Moolenaar    " when matched
306df177f67SBram Moolenaar    "
307df177f67SBram Moolenaar    " EXCEPTION
308df177f67SBram Moolenaar    " WHEN column_not_found THEN
309df177f67SBram Moolenaar    " WHEN OTHERS THEN
310df177f67SBram Moolenaar    "
311df177f67SBram Moolenaar    " create[ or replace] procedure|function|event
312adc2182cSBram Moolenaar                " \ '^\s*\<\%(do\|for\|while\|loop\)\>.*:'.
313df177f67SBram Moolenaar
314*34feacbcSBram Moolenaar    " For ColdFusion support
315*34feacbcSBram Moolenaar    setlocal matchpairs+=<:>
316*34feacbcSBram Moolenaar    let b:match_words = &matchpairs .
317*34feacbcSBram Moolenaar		\ ',\<begin\>:\<end\>\W*$,'.
318df177f67SBram Moolenaar		\
319df177f67SBram Moolenaar                \ s:notend . '\<if\>:'.
320df177f67SBram Moolenaar                \ '\<elsif\>\|\<elseif\>\|\<else\>:'.
321df177f67SBram Moolenaar                \ '\<end\s\+if\>,'.
322df177f67SBram Moolenaar                \
323adc2182cSBram Moolenaar                \ '\(^\s*\)\@<=\(\<\%(do\|for\|while\|loop\)\>.*\):'.
324adc2182cSBram Moolenaar                \ '\%(\<exit\>\|\<leave\>\|\<break\>\|\<continue\>\):'.
325adc2182cSBram Moolenaar                \ '\%(\<doend\>\|\%(\<end\s\+\%(for\|while\|loop\>\)\)\),'.
326df177f67SBram Moolenaar                \
327df177f67SBram Moolenaar                \ '\%('. s:notend . '\<case\>\):'.
328df177f67SBram Moolenaar                \ '\%('.s:when_no_matched_or_others.'\):'.
329df177f67SBram Moolenaar                \ '\%(\<when\s\+others\>\|\<end\s\+case\>\),' .
330df177f67SBram Moolenaar                \
331df177f67SBram Moolenaar                \ '\<merge\>:' .
332df177f67SBram Moolenaar                \ '\<when\s\+not\s\+matched\>:' .
333df177f67SBram Moolenaar                \ '\<when\s\+matched\>,' .
334df177f67SBram Moolenaar                \
335df177f67SBram Moolenaar                \ '\%(\<create\s\+' . s:or_replace . '\)\?'.
336df177f67SBram Moolenaar                \ '\%(function\|procedure\|event\):'.
337df177f67SBram Moolenaar                \ '\<returns\?\>'
338df177f67SBram Moolenaar                " \ '\<begin\>\|\<returns\?\>:'.
339df177f67SBram Moolenaar                " \ '\<end\>\(;\)\?\s*$'
340df177f67SBram Moolenaar                " \ '\<exception\>:'.s:when_no_matched_or_others.
341df177f67SBram Moolenaar                " \ ':\<when\s\+others\>,'.
342df177f67SBram Moolenaar		"
343df177f67SBram Moolenaar                " \ '\%(\<exception\>\|\%('. s:notend . '\<case\>\)\):'.
344df177f67SBram Moolenaar                " \ '\%(\<default\>\|'.s:when_no_matched_or_others.'\):'.
345df177f67SBram Moolenaar                " \ '\%(\%(\<when\s\+others\>\)\|\<end\s\+case\>\),' .
346071d4279SBram Moolenaarendif
347df177f67SBram Moolenaar
348df177f67SBram Moolenaar" Define how to find the macro definition of a variable using the various
349df177f67SBram Moolenaar" [d, [D, [_CTRL_D and so on features
350df177f67SBram Moolenaar" Match these values ignoring case
351df177f67SBram Moolenaar" ie  DECLARE varname INTEGER
3520fd9289dSBram Moolenaarlet &l:define = '\c\<\(VARIABLE\|DECLARE\|IN\|OUT\|INOUT\)\>'
353df177f67SBram Moolenaar
354df177f67SBram Moolenaar
355df177f67SBram Moolenaar" Mappings to move to the next BEGIN ... END block
356df177f67SBram Moolenaar" \W - no characters or digits
357*34feacbcSBram Moolenaarnnoremap <buffer> <silent> ]] :call search('\c^\s*begin\>', 'W' )<CR>
358*34feacbcSBram Moolenaarnnoremap <buffer> <silent> [[ :call search('\c^\s*begin\>', 'bW' )<CR>
359*34feacbcSBram Moolenaarnnoremap <buffer> <silent> ][ :call search('\c^\s*end\W*$', 'W' )<CR>
360*34feacbcSBram Moolenaarnnoremap <buffer> <silent> [] :call search('\c^\s*end\W*$', 'bW' )<CR>
361*34feacbcSBram Moolenaarxnoremap <buffer> <silent> ]] :<C-U>exec "normal! gv"<Bar>call search('\c^\s*begin\>', 'W' )<CR>
362*34feacbcSBram Moolenaarxnoremap <buffer> <silent> [[ :<C-U>exec "normal! gv"<Bar>call search('\c^\s*begin\>', 'bW' )<CR>
363*34feacbcSBram Moolenaarxnoremap <buffer> <silent> ][ :<C-U>exec "normal! gv"<Bar>call search('\c^\s*end\W*$', 'W' )<CR>
364*34feacbcSBram Moolenaarxnoremap <buffer> <silent> [] :<C-U>exec "normal! gv"<Bar>call search('\c^\s*end\W*$', 'bW' )<CR>
365df177f67SBram Moolenaar
366df177f67SBram Moolenaar
3670fd9289dSBram Moolenaar" By default only look for CREATE statements, but allow
3680fd9289dSBram Moolenaar" the user to override
3690fd9289dSBram Moolenaarif !exists('g:ftplugin_sql_statements')
3700fd9289dSBram Moolenaar    let g:ftplugin_sql_statements = 'create'
3710fd9289dSBram Moolenaarendif
3720fd9289dSBram Moolenaar
373df177f67SBram Moolenaar" Predefined SQL objects what are used by the below mappings using
374df177f67SBram Moolenaar" the ]} style maps.
375df177f67SBram Moolenaar" This global variable allows the users to override it's value
376df177f67SBram Moolenaar" from within their vimrc.
3770fd9289dSBram Moolenaar" Note, you cannot use \?, since these patterns can be used to search
3780fd9289dSBram Moolenaar" backwards, you must use \{,1}
379df177f67SBram Moolenaarif !exists('g:ftplugin_sql_objects')
380df177f67SBram Moolenaar    let g:ftplugin_sql_objects = 'function,procedure,event,' .
381*34feacbcSBram Moolenaar                \ '\(existing\\|global\s\+temporary\s\+\)\{,1}' .
3820fd9289dSBram Moolenaar                \ 'table,trigger' .
383df177f67SBram Moolenaar                \ ',schema,service,publication,database,datatype,domain' .
384df177f67SBram Moolenaar                \ ',index,subscription,synchronization,view,variable'
385df177f67SBram Moolenaarendif
386df177f67SBram Moolenaar
3875c73622aSBram Moolenaar" Key to trigger SQL completion
3885c73622aSBram Moolenaarif !exists('g:ftplugin_sql_omni_key')
3895c73622aSBram Moolenaar    let g:ftplugin_sql_omni_key = '<C-C>'
3905c73622aSBram Moolenaarendif
3915c73622aSBram Moolenaar" Key to trigger drill into column list
3925c73622aSBram Moolenaarif !exists('g:ftplugin_sql_omni_key_right')
3935c73622aSBram Moolenaar    let g:ftplugin_sql_omni_key_right = '<Right>'
3945c73622aSBram Moolenaarendif
3955c73622aSBram Moolenaar" Key to trigger drill out of column list
3965c73622aSBram Moolenaarif !exists('g:ftplugin_sql_omni_key_left')
3975c73622aSBram Moolenaar    let g:ftplugin_sql_omni_key_left = '<Left>'
3985c73622aSBram Moolenaarendif
3995c73622aSBram Moolenaar
4000fd9289dSBram Moolenaar" Replace all ,'s with bars, except ones with numbers after them.
4010fd9289dSBram Moolenaar" This will most likely be a \{,1} string.
402df177f67SBram Moolenaarlet s:ftplugin_sql_objects =
403*34feacbcSBram Moolenaar            \ '\c^\s*' .
404*34feacbcSBram Moolenaar            \ '\(\(' .
405*34feacbcSBram Moolenaar            \ substitute(g:ftplugin_sql_statements, ',\d\@!', '\\\\|', 'g') .
406*34feacbcSBram Moolenaar            \ '\)\s\+\(or\s\+replace\s\+\)\{,1}\)\{,1}' .
407*34feacbcSBram Moolenaar            \ '\<\(' .
408*34feacbcSBram Moolenaar            \ substitute(g:ftplugin_sql_objects, ',\d\@!', '\\\\|', 'g') .
409*34feacbcSBram Moolenaar            \ '\)\>'
410df177f67SBram Moolenaar
411df177f67SBram Moolenaar" Mappings to move to the next CREATE ... block
412*34feacbcSBram Moolenaarexec "nnoremap <buffer> <silent> ]} :call search('".s:ftplugin_sql_objects."', 'W')<CR>"
413*34feacbcSBram Moolenaarexec "nnoremap <buffer> <silent> [{ :call search('".s:ftplugin_sql_objects."', 'bW')<CR>"
414df177f67SBram Moolenaar" Could not figure out how to use a :call search() string in visual mode
415df177f67SBram Moolenaar" without it ending visual mode
4160fd9289dSBram Moolenaar" Unfortunately, this will add a entry to the search history
417*34feacbcSBram Moolenaarexec 'xnoremap <buffer> <silent> ]} /'.s:ftplugin_sql_objects.'<CR>'
418*34feacbcSBram Moolenaarexec 'xnoremap <buffer> <silent> [{ ?'.s:ftplugin_sql_objects.'<CR>'
419df177f67SBram Moolenaar
420df177f67SBram Moolenaar" Mappings to move to the next COMMENT
421df177f67SBram Moolenaar"
422df177f67SBram Moolenaar" Had to double the \ for the \| separator since this has a special
423df177f67SBram Moolenaar" meaning on maps
424*34feacbcSBram Moolenaarlet b:comment_leader = '\(--\\|\/\/\\|\*\\|\/\*\\|\*\/\)'
425df177f67SBram Moolenaar" Find the start of the next comment
426*34feacbcSBram Moolenaarlet b:comment_start  = '^\(\s*'.b:comment_leader.'.*\n\)\@<!'.
427*34feacbcSBram Moolenaar            \ '\(\s*'.b:comment_leader.'\)'
428df177f67SBram Moolenaar" Find the end of the previous comment
429*34feacbcSBram Moolenaarlet b:comment_end = '\(^\s*'.b:comment_leader.'.*\n\)'.
430*34feacbcSBram Moolenaar            \ '\(^\s*'.b:comment_leader.'\)\@!'
431df177f67SBram Moolenaar" Skip over the comment
432df177f67SBram Moolenaarlet b:comment_jump_over  = "call search('".
433*34feacbcSBram Moolenaar            \ '^\(\s*'.b:comment_leader.'.*\n\)\@<!'.
434df177f67SBram Moolenaar            \ "', 'W')"
435df177f67SBram Moolenaarlet b:comment_skip_back  = "call search('".
436*34feacbcSBram Moolenaar            \ '^\(\s*'.b:comment_leader.'.*\n\)\@<!'.
437df177f67SBram Moolenaar            \ "', 'bW')"
438df177f67SBram Moolenaar" Move to the start and end of comments
4393577c6faSBram Moolenaarexec 'nnoremap <silent><buffer> ]" :call search('."'".b:comment_start."'".', "W" )<CR>'
4403577c6faSBram Moolenaarexec 'nnoremap <silent><buffer> [" :call search('."'".b:comment_end."'".', "W" )<CR>'
441*34feacbcSBram Moolenaarexec 'xnoremap <silent><buffer> ]" :<C-U>exec "normal! gv"<Bar>call search('."'".b:comment_start."'".', "W" )<CR>'
442*34feacbcSBram Moolenaarexec 'xnoremap <silent><buffer> [" :<C-U>exec "normal! gv"<Bar>call search('."'".b:comment_end."'".', "W" )<CR>'
443df177f67SBram Moolenaar
444df177f67SBram Moolenaar" Comments can be of the form:
445df177f67SBram Moolenaar"   /*
446df177f67SBram Moolenaar"    *
447df177f67SBram Moolenaar"    */
448df177f67SBram Moolenaar" or
449df177f67SBram Moolenaar"   --
4500fd9289dSBram Moolenaar" or
4510fd9289dSBram Moolenaar"   //
452df177f67SBram Moolenaarsetlocal comments=s1:/*,mb:*,ex:*/,:--,://
453df177f67SBram Moolenaar
4540fd9289dSBram Moolenaar" Set completion with CTRL-X CTRL-O to autoloaded function.
4550fd9289dSBram Moolenaarif exists('&omnifunc')
456f193fffdSBram Moolenaar    " Since the SQL completion plugin can be used in conjunction
457f193fffdSBram Moolenaar    " with other completion filetypes it must record the previous
458f193fffdSBram Moolenaar    " OMNI function prior to setting up the SQL OMNI function
459f193fffdSBram Moolenaar    let b:sql_compl_savefunc = &omnifunc
460f193fffdSBram Moolenaar
4610fd9289dSBram Moolenaar    " This is used by the sqlcomplete.vim plugin
4620fd9289dSBram Moolenaar    " Source it for it's global functions
4630fd9289dSBram Moolenaar    runtime autoload/syntaxcomplete.vim
4640fd9289dSBram Moolenaar
4650fd9289dSBram Moolenaar    setlocal omnifunc=sqlcomplete#Complete
4660fd9289dSBram Moolenaar    " Prevent the intellisense plugin from loading
4670fd9289dSBram Moolenaar    let b:sql_vis = 1
468e2f98b95SBram Moolenaar    if !exists('g:omni_sql_no_default_maps')
469e2f98b95SBram Moolenaar        " Static maps which use populate the completion list
470e2f98b95SBram Moolenaar        " using Vim's syntax highlighting rules
471*34feacbcSBram Moolenaar        exec 'inoremap <buffer> '.g:ftplugin_sql_omni_key.'a <C-\><C-O>:call sqlcomplete#Map("syntax")<CR><C-X><C-O>'
472*34feacbcSBram Moolenaar        exec 'inoremap <buffer> '.g:ftplugin_sql_omni_key.'k <C-\><C-O>:call sqlcomplete#Map("sqlKeyword")<CR><C-X><C-O>'
473*34feacbcSBram Moolenaar        exec 'inoremap <buffer> '.g:ftplugin_sql_omni_key.'f <C-\><C-O>:call sqlcomplete#Map("sqlFunction")<CR><C-X><C-O>'
474*34feacbcSBram Moolenaar        exec 'inoremap <buffer> '.g:ftplugin_sql_omni_key.'o <C-\><C-O>:call sqlcomplete#Map("sqlOption")<CR><C-X><C-O>'
475*34feacbcSBram Moolenaar        exec 'inoremap <buffer> '.g:ftplugin_sql_omni_key.'T <C-\><C-O>:call sqlcomplete#Map("sqlType")<CR><C-X><C-O>'
476*34feacbcSBram Moolenaar        exec 'inoremap <buffer> '.g:ftplugin_sql_omni_key.'s <C-\><C-O>:call sqlcomplete#Map("sqlStatement")<CR><C-X><C-O>'
477e2f98b95SBram Moolenaar        " Dynamic maps which use populate the completion list
478e2f98b95SBram Moolenaar        " using the dbext.vim plugin
479*34feacbcSBram Moolenaar        exec 'inoremap <buffer> '.g:ftplugin_sql_omni_key.'t <C-\><C-O>:call sqlcomplete#Map("table")<CR><C-X><C-O>'
480*34feacbcSBram Moolenaar        exec 'inoremap <buffer> '.g:ftplugin_sql_omni_key.'p <C-\><C-O>:call sqlcomplete#Map("procedure")<CR><C-X><C-O>'
481*34feacbcSBram Moolenaar        exec 'inoremap <buffer> '.g:ftplugin_sql_omni_key.'v <C-\><C-O>:call sqlcomplete#Map("view")<CR><C-X><C-O>'
482*34feacbcSBram Moolenaar        exec 'inoremap <buffer> '.g:ftplugin_sql_omni_key.'c <C-\><C-O>:call sqlcomplete#Map("column")<CR><C-X><C-O>'
483*34feacbcSBram Moolenaar        exec 'inoremap <buffer> '.g:ftplugin_sql_omni_key.'l <C-\><C-O>:call sqlcomplete#Map("column_csv")<CR><C-X><C-O>'
484e2f98b95SBram Moolenaar        " The next 3 maps are only to be used while the completion window is
485e2f98b95SBram Moolenaar        " active due to the <CR> at the beginning of the map
486*34feacbcSBram 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>'
487f193fffdSBram Moolenaar        " <C-Right> is not recognized on most Unix systems, so only create
488f193fffdSBram Moolenaar        " these additional maps on the Windows platform.
489f193fffdSBram Moolenaar        " If you would like to use these maps, choose a different key and make
490f193fffdSBram Moolenaar        " the same map in your vimrc.
4915c73622aSBram Moolenaar        " if has('win32')
492*34feacbcSBram Moolenaar        exec 'inoremap <buffer> '.g:ftplugin_sql_omni_key_right.' <C-R>=sqlcomplete#DrillIntoTable()<CR>'
493*34feacbcSBram Moolenaar        exec 'inoremap <buffer> '.g:ftplugin_sql_omni_key_left.'  <C-R>=sqlcomplete#DrillOutOfColumns()<CR>'
4945c73622aSBram Moolenaar        " endif
495e2f98b95SBram Moolenaar        " Remove any cached items useful for schema changes
496*34feacbcSBram Moolenaar        exec 'inoremap <buffer> '.g:ftplugin_sql_omni_key.'R <C-\><C-O>:call sqlcomplete#Map("resetCache")<CR><C-X><C-O>'
497f193fffdSBram Moolenaar    endif
498f193fffdSBram Moolenaar
499f193fffdSBram Moolenaar    if b:sql_compl_savefunc != ""
500f193fffdSBram Moolenaar        " We are changing the filetype to SQL from some other filetype
501f193fffdSBram Moolenaar        " which had OMNI completion defined.  We need to activate the
502f193fffdSBram Moolenaar        " SQL completion plugin in order to cache some of the syntax items
503f193fffdSBram Moolenaar        " while the syntax rules for SQL are active.
504f9d5ca1dSBram Moolenaar        call sqlcomplete#ResetCacheSyntax()
505f193fffdSBram Moolenaar        call sqlcomplete#PreCacheSyntax()
506e2f98b95SBram Moolenaar    endif
5070fd9289dSBram Moolenaarendif
5080fd9289dSBram Moolenaar
509df177f67SBram Moolenaarlet &cpo = s:save_cpo
51084f7235bSBram Moolenaarunlet s:save_cpo
511df177f67SBram Moolenaar
512e2f98b95SBram Moolenaar" vim:sw=4:
513df177f67SBram Moolenaar
514