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