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