xref: /vim-8.2.3635/runtime/ftplugin/sql.vim (revision 5c73622a)
1df177f67SBram Moolenaar" SQL filetype plugin file
2071d4279SBram Moolenaar" Language:    SQL (Common for Oracle, Microsoft SQL Server, Sybase)
3*5c73622aSBram Moolenaar" Version:     6.0
4df177f67SBram Moolenaar" Maintainer:  David Fishburn <fishburn at ianywhere dot com>
5*5c73622aSBram Moolenaar" Last Change: 2009 Aug 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'
32*5c73622aSBram Moolenaar"
33*5c73622aSBram Moolenaar" This file also creates a command, SQLGetType, which allows you to
34*5c73622aSBram Moolenaar" determine what the current dialect is in use.
35*5c73622aSBram Moolenaar"     :SQLGetType
36*5c73622aSBram Moolenaar"
37*5c73622aSBram Moolenaar" History
38*5c73622aSBram Moolenaar"
39*5c73622aSBram Moolenaar" Version 6.0
40*5c73622aSBram Moolenaar"
41*5c73622aSBram Moolenaar" NF: Adds the command SQLGetType
42*5c73622aSBram Moolenaar"
43*5c73622aSBram Moolenaar" Version 5.0
44*5c73622aSBram Moolenaar"
45*5c73622aSBram Moolenaar" NF: Adds the ability to choose the keys to control SQL completion, just add
46*5c73622aSBram Moolenaar"     the following to your .vimrc:
47*5c73622aSBram Moolenaar"    let g:ftplugin_sql_omni_key       = '<C-C>'
48*5c73622aSBram Moolenaar"    let g:ftplugin_sql_omni_key_right = '<Right>'
49*5c73622aSBram Moolenaar"    let g:ftplugin_sql_omni_key_left  = '<Left>'
50*5c73622aSBram Moolenaar"
51*5c73622aSBram Moolenaar" BF: format-options - Auto-wrap comments using textwidth was turned off
52*5c73622aSBram Moolenaar"                      by mistake.
530fd9289dSBram Moolenaar
540fd9289dSBram Moolenaar
55071d4279SBram Moolenaar" Only do this when not done yet for this buffer
56071d4279SBram Moolenaarif exists("b:did_ftplugin")
57071d4279SBram Moolenaar  finish
58071d4279SBram Moolenaarendif
59071d4279SBram Moolenaar
60df177f67SBram Moolenaarlet s:save_cpo = &cpo
61df177f67SBram Moolenaarset cpo=
62df177f67SBram Moolenaar
633577c6faSBram Moolenaar" Disable autowrapping for code, but enable for comments
643577c6faSBram Moolenaar" t	Auto-wrap text using textwidth
653577c6faSBram Moolenaar" c     Auto-wrap comments using textwidth, inserting the current comment
663577c6faSBram Moolenaar"       leader automatically.
673577c6faSBram Moolenaarsetlocal formatoptions-=t
68*5c73622aSBram Moolenaarsetlocal formatoptions+=c
693577c6faSBram Moolenaar
700fd9289dSBram Moolenaar" Functions/Commands to allow the user to change SQL syntax dialects
710fd9289dSBram Moolenaar" through the use of :SQLSetType <tab> for completion.
720fd9289dSBram Moolenaar" This works with both Vim 6 and 7.
730fd9289dSBram Moolenaar
740fd9289dSBram Moolenaarif !exists("*SQL_SetType")
750fd9289dSBram Moolenaar    " NOTE: You cannot use function! since this file can be
760fd9289dSBram Moolenaar    " sourced from within this function.  That will result in
770fd9289dSBram Moolenaar    " an error reported by Vim.
780fd9289dSBram Moolenaar    function SQL_GetList(ArgLead, CmdLine, CursorPos)
790fd9289dSBram Moolenaar
800fd9289dSBram Moolenaar        if !exists('s:sql_list')
810fd9289dSBram Moolenaar            " Grab a list of files that contain "sql" in their names
820fd9289dSBram Moolenaar            let list_indent   = globpath(&runtimepath, 'indent/*sql*')
830fd9289dSBram Moolenaar            let list_syntax   = globpath(&runtimepath, 'syntax/*sql*')
840fd9289dSBram Moolenaar            let list_ftplugin = globpath(&runtimepath, 'ftplugin/*sql*')
850fd9289dSBram Moolenaar
860fd9289dSBram Moolenaar            let sqls = "\n".list_indent."\n".list_syntax."\n".list_ftplugin."\n"
870fd9289dSBram Moolenaar
880fd9289dSBram Moolenaar            " Strip out everything (path info) but the filename
890fd9289dSBram Moolenaar            " Regex
900fd9289dSBram Moolenaar            "    From between two newline characters
910fd9289dSBram Moolenaar            "    Non-greedily grab all characters
920fd9289dSBram Moolenaar            "    Followed by a valid filename \w\+\.\w\+ (sql.vim)
930fd9289dSBram Moolenaar            "    Followed by a newline, but do not include the newline
940fd9289dSBram Moolenaar            "
950fd9289dSBram Moolenaar            "    Replace it with just the filename (get rid of PATH)
960fd9289dSBram Moolenaar            "
970fd9289dSBram Moolenaar            "    Recursively, since there are many filenames that contain
980fd9289dSBram Moolenaar            "    the word SQL in the indent, syntax and ftplugin directory
990fd9289dSBram Moolenaar            let sqls = substitute( sqls,
1000fd9289dSBram Moolenaar                        \ '[\n]\%(.\{-}\)\(\w\+\.\w\+\)\n\@=',
1010fd9289dSBram Moolenaar                        \ '\1\n',
1020fd9289dSBram Moolenaar                        \ 'g'
1030fd9289dSBram Moolenaar                        \ )
1040fd9289dSBram Moolenaar
1050fd9289dSBram Moolenaar            " Remove duplicates, since sqlanywhere.vim can exist in the
1060fd9289dSBram Moolenaar            " sytax, indent and ftplugin directory, yet we only want
1070fd9289dSBram Moolenaar            " to display the option once
1080fd9289dSBram Moolenaar            let index = match(sqls, '.\{-}\ze\n')
1090fd9289dSBram Moolenaar            while index > -1
1100fd9289dSBram Moolenaar                " Get the first filename
1110fd9289dSBram Moolenaar                let file = matchstr(sqls, '.\{-}\ze\n', index)
1120fd9289dSBram Moolenaar                " Recursively replace any *other* occurrence of that
1130fd9289dSBram Moolenaar                " filename with nothing (ie remove it)
1140fd9289dSBram Moolenaar                let sqls = substitute(sqls, '\%>'.(index+strlen(file)).'c\<'.file.'\>\n', '', 'g')
1150fd9289dSBram Moolenaar                " Move on to the next filename
1160fd9289dSBram Moolenaar                let index = match(sqls, '.\{-}\ze\n', (index+strlen(file)+1))
1170fd9289dSBram Moolenaar            endwhile
1180fd9289dSBram Moolenaar
1190fd9289dSBram Moolenaar            " Sort the list if using version 7
1200fd9289dSBram Moolenaar            if v:version >= 700
1210fd9289dSBram Moolenaar                let mylist = split(sqls, "\n")
1220fd9289dSBram Moolenaar                let mylist = sort(mylist)
1230fd9289dSBram Moolenaar                let sqls   = join(mylist, "\n")
1240fd9289dSBram Moolenaar            endif
1250fd9289dSBram Moolenaar
1260fd9289dSBram Moolenaar            let s:sql_list = sqls
1270fd9289dSBram Moolenaar        endif
1280fd9289dSBram Moolenaar
1290fd9289dSBram Moolenaar        return s:sql_list
1300fd9289dSBram Moolenaar
1310fd9289dSBram Moolenaar    endfunction
1320fd9289dSBram Moolenaar
1330fd9289dSBram Moolenaar    function SQL_SetType(name)
1340fd9289dSBram Moolenaar
1350fd9289dSBram Moolenaar        " User has decided to override default SQL scripts and
1360fd9289dSBram Moolenaar        " specify a vendor specific version
1370fd9289dSBram Moolenaar        " (ie Oracle, Informix, SQL Anywhere, ...)
1380fd9289dSBram Moolenaar        " So check for an remove any settings that prevent the
1390fd9289dSBram Moolenaar        " scripts from being executed, and then source the
1400fd9289dSBram Moolenaar        " appropriate Vim scripts.
1410fd9289dSBram Moolenaar        if exists("b:did_ftplugin")
1420fd9289dSBram Moolenaar            unlet b:did_ftplugin
1430fd9289dSBram Moolenaar        endif
1440fd9289dSBram Moolenaar        if exists("b:current_syntax")
1450fd9289dSBram Moolenaar            " echomsg 'SQLSetType - clearing syntax'
1460fd9289dSBram Moolenaar            syntax clear
1470fd9289dSBram Moolenaar        endif
1480fd9289dSBram Moolenaar        if exists("b:did_indent")
1490fd9289dSBram Moolenaar            " echomsg 'SQLSetType - clearing indent'
1500fd9289dSBram Moolenaar            unlet b:did_indent
1510fd9289dSBram Moolenaar            " Set these values to their defaults
1520fd9289dSBram Moolenaar            setlocal indentkeys&
1530fd9289dSBram Moolenaar            setlocal indentexpr&
1540fd9289dSBram Moolenaar        endif
1550fd9289dSBram Moolenaar
1560fd9289dSBram Moolenaar        " Ensure the name is in the correct format
1570fd9289dSBram Moolenaar        let new_sql_type = substitute(a:name,
1580fd9289dSBram Moolenaar                    \ '\s*\([^\.]\+\)\(\.\w\+\)\?', '\L\1', '')
1590fd9289dSBram Moolenaar
1600fd9289dSBram Moolenaar        " Do not specify a buffer local variable if it is
1610fd9289dSBram Moolenaar        " the default value
1620fd9289dSBram Moolenaar        if new_sql_type == 'sql'
1630fd9289dSBram Moolenaar          let new_sql_type = 'sqloracle'
1640fd9289dSBram Moolenaar        endif
1650fd9289dSBram Moolenaar        let b:sql_type_override = new_sql_type
1660fd9289dSBram Moolenaar
1670fd9289dSBram Moolenaar        " Vim will automatically source the correct files if we
1680fd9289dSBram Moolenaar        " change the filetype.  You cannot do this with setfiletype
1690fd9289dSBram Moolenaar        " since that command will only execute if a filetype has
1700fd9289dSBram Moolenaar        " not already been set.  In this case we want to override
1710fd9289dSBram Moolenaar        " the existing filetype.
1720fd9289dSBram Moolenaar        let &filetype = 'sql'
1730fd9289dSBram Moolenaar    endfunction
1740fd9289dSBram Moolenaar    command! -nargs=* -complete=custom,SQL_GetList SQLSetType :call SQL_SetType(<q-args>)
1750fd9289dSBram Moolenaar
1760fd9289dSBram Moolenaarendif
1770fd9289dSBram Moolenaar
178*5c73622aSBram Moolenaar" Functions/Commands to allow the user determine current SQL syntax dialect
179*5c73622aSBram Moolenaar" This works with both Vim 6 and 7.
180*5c73622aSBram Moolenaar
181*5c73622aSBram Moolenaarif !exists("*SQL_GetType")
182*5c73622aSBram Moolenaar    function SQL_GetType()
183*5c73622aSBram Moolenaar        if exists('b:sql_type_override')
184*5c73622aSBram Moolenaar            echomsg "Current SQL dialect in use:".b:sql_type_override
185*5c73622aSBram Moolenaar        else
186*5c73622aSBram Moolenaar            echomsg "Current SQL dialect in use:".g:sql_type_default
187*5c73622aSBram Moolenaar        endif
188*5c73622aSBram Moolenaar    endfunction
189*5c73622aSBram Moolenaar    command! -nargs=0 SQLGetType :call SQL_GetType()
190*5c73622aSBram Moolenaarendif
191*5c73622aSBram Moolenaar
1920fd9289dSBram Moolenaarif exists("b:sql_type_override")
1930fd9289dSBram Moolenaar    " echo 'sourcing buffer ftplugin/'.b:sql_type_override.'.vim'
1940fd9289dSBram Moolenaar    if globpath(&runtimepath, 'ftplugin/'.b:sql_type_override.'.vim') != ''
1950fd9289dSBram Moolenaar        exec 'runtime ftplugin/'.b:sql_type_override.'.vim'
1960fd9289dSBram Moolenaar    " else
1970fd9289dSBram Moolenaar    "     echomsg 'ftplugin/'.b:sql_type_override.' not exist, using default'
1980fd9289dSBram Moolenaar    endif
1990fd9289dSBram Moolenaarelseif exists("g:sql_type_default")
2000fd9289dSBram Moolenaar    " echo 'sourcing global ftplugin/'.g:sql_type_default.'.vim'
2010fd9289dSBram Moolenaar    if globpath(&runtimepath, 'ftplugin/'.g:sql_type_default.'.vim') != ''
2020fd9289dSBram Moolenaar        exec 'runtime ftplugin/'.g:sql_type_default.'.vim'
2030fd9289dSBram Moolenaar    " else
2040fd9289dSBram Moolenaar    "     echomsg 'ftplugin/'.g:sql_type_default.'.vim not exist, using default'
2050fd9289dSBram Moolenaar    endif
2060fd9289dSBram Moolenaarendif
2070fd9289dSBram Moolenaar
2080fd9289dSBram Moolenaar" If the above runtime command succeeded, do not load the default settings
2090fd9289dSBram Moolenaarif exists("b:did_ftplugin")
2100fd9289dSBram Moolenaar  finish
2110fd9289dSBram Moolenaarendif
2120fd9289dSBram Moolenaar
2130fd9289dSBram Moolenaarlet b:undo_ftplugin = "setl comments<"
2140fd9289dSBram Moolenaar
215071d4279SBram Moolenaar" Don't load another plugin for this buffer
216071d4279SBram Moolenaarlet b:did_ftplugin     = 1
2170fd9289dSBram Moolenaarlet b:current_ftplugin = 'sql'
2180fd9289dSBram Moolenaar
2190fd9289dSBram Moolenaar" Win32 can filter files in the browse dialog
2200fd9289dSBram Moolenaarif has("gui_win32") && !exists("b:browsefilter")
2210fd9289dSBram Moolenaar    let b:browsefilter = "SQL Files (*.sql)\t*.sql\n" .
2220fd9289dSBram Moolenaar	  \ "All Files (*.*)\t*.*\n"
2230fd9289dSBram Moolenaarendif
224071d4279SBram Moolenaar
225df177f67SBram Moolenaar" Some standard expressions for use with the matchit strings
226df177f67SBram Moolenaarlet s:notend = '\%(\<end\s\+\)\@<!'
227df177f67SBram Moolenaarlet s:when_no_matched_or_others = '\%(\<when\>\%(\s\+\%(\%(\<not\>\s\+\)\?<matched\>\)\|\<others\>\)\@!\)'
228df177f67SBram Moolenaarlet s:or_replace = '\%(or\s\+replace\s\+\)\?'
229df177f67SBram Moolenaar
230071d4279SBram Moolenaar" Define patterns for the matchit macro
231071d4279SBram Moolenaarif !exists("b:match_words")
232071d4279SBram Moolenaar    " SQL is generally case insensitive
233071d4279SBram Moolenaar    let b:match_ignorecase = 1
234df177f67SBram Moolenaar
235df177f67SBram Moolenaar    " Handle the following:
236df177f67SBram Moolenaar    " if
237df177f67SBram Moolenaar    " elseif | elsif
238df177f67SBram Moolenaar    " else [if]
239df177f67SBram Moolenaar    " end if
240df177f67SBram Moolenaar    "
241df177f67SBram Moolenaar    " [while condition] loop
242df177f67SBram Moolenaar    "     leave
243df177f67SBram Moolenaar    "     break
244df177f67SBram Moolenaar    "     continue
245df177f67SBram Moolenaar    "     exit
246df177f67SBram Moolenaar    " end loop
247df177f67SBram Moolenaar    "
248df177f67SBram Moolenaar    " for
249df177f67SBram Moolenaar    "     leave
250df177f67SBram Moolenaar    "     break
251df177f67SBram Moolenaar    "     continue
252df177f67SBram Moolenaar    "     exit
253df177f67SBram Moolenaar    " end loop
254df177f67SBram Moolenaar    "
255df177f67SBram Moolenaar    " do
256df177f67SBram Moolenaar    "     statements
257df177f67SBram Moolenaar    " doend
258df177f67SBram Moolenaar    "
259df177f67SBram Moolenaar    " case
260df177f67SBram Moolenaar    " when
261df177f67SBram Moolenaar    " when
262df177f67SBram Moolenaar    " default
263df177f67SBram Moolenaar    " end case
264df177f67SBram Moolenaar    "
265df177f67SBram Moolenaar    " merge
266df177f67SBram Moolenaar    " when not matched
267df177f67SBram Moolenaar    " when matched
268df177f67SBram Moolenaar    "
269df177f67SBram Moolenaar    " EXCEPTION
270df177f67SBram Moolenaar    " WHEN column_not_found THEN
271df177f67SBram Moolenaar    " WHEN OTHERS THEN
272df177f67SBram Moolenaar    "
273df177f67SBram Moolenaar    " create[ or replace] procedure|function|event
274df177f67SBram Moolenaar
275071d4279SBram Moolenaar    let b:match_words =
276df177f67SBram Moolenaar		\ '\<begin\>:\<end\>\W*$,'.
277df177f67SBram Moolenaar		\
278df177f67SBram Moolenaar                \ s:notend . '\<if\>:'.
279df177f67SBram Moolenaar                \ '\<elsif\>\|\<elseif\>\|\<else\>:'.
280df177f67SBram Moolenaar                \ '\<end\s\+if\>,'.
281df177f67SBram Moolenaar                \
282df177f67SBram Moolenaar                \ '\<do\>\|'.
283df177f67SBram Moolenaar                \ '\<while\>\|'.
284df177f67SBram Moolenaar                \ '\%(' . s:notend . '\<loop\>\)\|'.
285df177f67SBram Moolenaar                \ '\%(' . s:notend . '\<for\>\):'.
286df177f67SBram Moolenaar                \ '\<exit\>\|\<leave\>\|\<break\>\|\<continue\>:'.
287df177f67SBram Moolenaar                \ '\%(\<end\s\+\%(for\|loop\>\)\)\|\<doend\>,'.
288df177f67SBram Moolenaar                \
289df177f67SBram Moolenaar                \ '\%('. s:notend . '\<case\>\):'.
290df177f67SBram Moolenaar                \ '\%('.s:when_no_matched_or_others.'\):'.
291df177f67SBram Moolenaar                \ '\%(\<when\s\+others\>\|\<end\s\+case\>\),' .
292df177f67SBram Moolenaar                \
293df177f67SBram Moolenaar                \ '\<merge\>:' .
294df177f67SBram Moolenaar                \ '\<when\s\+not\s\+matched\>:' .
295df177f67SBram Moolenaar                \ '\<when\s\+matched\>,' .
296df177f67SBram Moolenaar                \
297df177f67SBram Moolenaar                \ '\%(\<create\s\+' . s:or_replace . '\)\?'.
298df177f67SBram Moolenaar                \ '\%(function\|procedure\|event\):'.
299df177f67SBram Moolenaar                \ '\<returns\?\>'
300df177f67SBram Moolenaar                " \ '\<begin\>\|\<returns\?\>:'.
301df177f67SBram Moolenaar                " \ '\<end\>\(;\)\?\s*$'
302df177f67SBram Moolenaar                " \ '\<exception\>:'.s:when_no_matched_or_others.
303df177f67SBram Moolenaar                " \ ':\<when\s\+others\>,'.
304df177f67SBram Moolenaar		"
305df177f67SBram Moolenaar                " \ '\%(\<exception\>\|\%('. s:notend . '\<case\>\)\):'.
306df177f67SBram Moolenaar                " \ '\%(\<default\>\|'.s:when_no_matched_or_others.'\):'.
307df177f67SBram Moolenaar                " \ '\%(\%(\<when\s\+others\>\)\|\<end\s\+case\>\),' .
308071d4279SBram Moolenaarendif
309df177f67SBram Moolenaar
310df177f67SBram Moolenaar" Define how to find the macro definition of a variable using the various
311df177f67SBram Moolenaar" [d, [D, [_CTRL_D and so on features
312df177f67SBram Moolenaar" Match these values ignoring case
313df177f67SBram Moolenaar" ie  DECLARE varname INTEGER
3140fd9289dSBram Moolenaarlet &l:define = '\c\<\(VARIABLE\|DECLARE\|IN\|OUT\|INOUT\)\>'
315df177f67SBram Moolenaar
316df177f67SBram Moolenaar
317df177f67SBram Moolenaar" Mappings to move to the next BEGIN ... END block
318df177f67SBram Moolenaar" \W - no characters or digits
3190fd9289dSBram Moolenaarnmap <buffer> <silent> ]] :call search('\\c^\\s*begin\\>', 'W' )<CR>
3200fd9289dSBram Moolenaarnmap <buffer> <silent> [[ :call search('\\c^\\s*begin\\>', 'bW' )<CR>
3210fd9289dSBram Moolenaarnmap <buffer> <silent> ][ :call search('\\c^\\s*end\\W*$', 'W' )<CR>
3220fd9289dSBram Moolenaarnmap <buffer> <silent> [] :call search('\\c^\\s*end\\W*$', 'bW' )<CR>
3233577c6faSBram Moolenaarvmap <buffer> <silent> ]] :<C-U>exec "normal! gv"<Bar>call search('\\c^\\s*begin\\>', 'W' )<CR>
3243577c6faSBram Moolenaarvmap <buffer> <silent> [[ :<C-U>exec "normal! gv"<Bar>call search('\\c^\\s*begin\\>', 'bW' )<CR>
3253577c6faSBram Moolenaarvmap <buffer> <silent> ][ :<C-U>exec "normal! gv"<Bar>call search('\\c^\\s*end\\W*$', 'W' )<CR>
3263577c6faSBram Moolenaarvmap <buffer> <silent> [] :<C-U>exec "normal! gv"<Bar>call search('\\c^\\s*end\\W*$', 'bW' )<CR>
327df177f67SBram Moolenaar
328df177f67SBram Moolenaar
3290fd9289dSBram Moolenaar" By default only look for CREATE statements, but allow
3300fd9289dSBram Moolenaar" the user to override
3310fd9289dSBram Moolenaarif !exists('g:ftplugin_sql_statements')
3320fd9289dSBram Moolenaar    let g:ftplugin_sql_statements = 'create'
3330fd9289dSBram Moolenaarendif
3340fd9289dSBram Moolenaar
335df177f67SBram Moolenaar" Predefined SQL objects what are used by the below mappings using
336df177f67SBram Moolenaar" the ]} style maps.
337df177f67SBram Moolenaar" This global variable allows the users to override it's value
338df177f67SBram Moolenaar" from within their vimrc.
3390fd9289dSBram Moolenaar" Note, you cannot use \?, since these patterns can be used to search
3400fd9289dSBram Moolenaar" backwards, you must use \{,1}
341df177f67SBram Moolenaarif !exists('g:ftplugin_sql_objects')
342df177f67SBram Moolenaar    let g:ftplugin_sql_objects = 'function,procedure,event,' .
3430fd9289dSBram Moolenaar                \ '\\(existing\\\\|global\\s\\+temporary\\s\\+\\)\\\{,1}' .
3440fd9289dSBram Moolenaar                \ 'table,trigger' .
345df177f67SBram Moolenaar                \ ',schema,service,publication,database,datatype,domain' .
346df177f67SBram Moolenaar                \ ',index,subscription,synchronization,view,variable'
347df177f67SBram Moolenaarendif
348df177f67SBram Moolenaar
349*5c73622aSBram Moolenaar" Key to trigger SQL completion
350*5c73622aSBram Moolenaarif !exists('g:ftplugin_sql_omni_key')
351*5c73622aSBram Moolenaar    let g:ftplugin_sql_omni_key = '<C-C>'
352*5c73622aSBram Moolenaarendif
353*5c73622aSBram Moolenaar" Key to trigger drill into column list
354*5c73622aSBram Moolenaarif !exists('g:ftplugin_sql_omni_key_right')
355*5c73622aSBram Moolenaar    let g:ftplugin_sql_omni_key_right = '<Right>'
356*5c73622aSBram Moolenaarendif
357*5c73622aSBram Moolenaar" Key to trigger drill out of column list
358*5c73622aSBram Moolenaarif !exists('g:ftplugin_sql_omni_key_left')
359*5c73622aSBram Moolenaar    let g:ftplugin_sql_omni_key_left = '<Left>'
360*5c73622aSBram Moolenaarendif
361*5c73622aSBram Moolenaar
3620fd9289dSBram Moolenaar" Replace all ,'s with bars, except ones with numbers after them.
3630fd9289dSBram Moolenaar" This will most likely be a \{,1} string.
364df177f67SBram Moolenaarlet s:ftplugin_sql_objects =
3650fd9289dSBram Moolenaar            \ '\\c^\\s*' .
3660fd9289dSBram Moolenaar            \ '\\(\\(' .
3670fd9289dSBram Moolenaar            \ substitute(g:ftplugin_sql_statements, ',\d\@!', '\\\\\\|', 'g') .
3680fd9289dSBram Moolenaar            \ '\\)\\s\\+\\(or\\s\\+replace\\\s\+\\)\\{,1}\\)\\{,1}' .
3690fd9289dSBram Moolenaar            \ '\\<\\(' .
3700fd9289dSBram Moolenaar            \ substitute(g:ftplugin_sql_objects, ',\d\@!', '\\\\\\|', 'g') .
3710fd9289dSBram Moolenaar            \ '\\)\\>'
372df177f67SBram Moolenaar
373df177f67SBram Moolenaar" Mappings to move to the next CREATE ... block
374df177f67SBram Moolenaarexec "nmap <buffer> <silent> ]} :call search('".s:ftplugin_sql_objects."', 'W')<CR>"
375df177f67SBram Moolenaarexec "nmap <buffer> <silent> [{ :call search('".s:ftplugin_sql_objects."', 'bW')<CR>"
376df177f67SBram Moolenaar" Could not figure out how to use a :call search() string in visual mode
377df177f67SBram Moolenaar" without it ending visual mode
3780fd9289dSBram Moolenaar" Unfortunately, this will add a entry to the search history
379df177f67SBram Moolenaarexec 'vmap <buffer> <silent> ]} /'.s:ftplugin_sql_objects.'<CR>'
380df177f67SBram Moolenaarexec 'vmap <buffer> <silent> [{ ?'.s:ftplugin_sql_objects.'<CR>'
381df177f67SBram Moolenaar
382df177f67SBram Moolenaar" Mappings to move to the next COMMENT
383df177f67SBram Moolenaar"
384df177f67SBram Moolenaar" Had to double the \ for the \| separator since this has a special
385df177f67SBram Moolenaar" meaning on maps
3860fd9289dSBram Moolenaarlet b:comment_leader = '\\(--\\\|\\/\\/\\\|\\*\\\|\\/\\*\\\|\\*\\/\\)'
387df177f67SBram Moolenaar" Find the start of the next comment
3880fd9289dSBram Moolenaarlet b:comment_start  = '^\\(\\s*'.b:comment_leader.'.*\\n\\)\\@<!'.
3890fd9289dSBram Moolenaar            \ '\\(\\s*'.b:comment_leader.'\\)'
390df177f67SBram Moolenaar" Find the end of the previous comment
3910fd9289dSBram Moolenaarlet b:comment_end = '\\(^\\s*'.b:comment_leader.'.*\\n\\)'.
3920fd9289dSBram Moolenaar            \ '\\(^\\s*'.b:comment_leader.'\\)\\@!'
393df177f67SBram Moolenaar" Skip over the comment
394df177f67SBram Moolenaarlet b:comment_jump_over  = "call search('".
3950fd9289dSBram Moolenaar            \ '^\\(\\s*'.b:comment_leader.'.*\\n\\)\\@<!'.
396df177f67SBram Moolenaar            \ "', 'W')"
397df177f67SBram Moolenaarlet b:comment_skip_back  = "call search('".
3980fd9289dSBram Moolenaar            \ '^\\(\\s*'.b:comment_leader.'.*\\n\\)\\@<!'.
399df177f67SBram Moolenaar            \ "', 'bW')"
400df177f67SBram Moolenaar" Move to the start and end of comments
4013577c6faSBram Moolenaarexec 'nnoremap <silent><buffer> ]" :call search('."'".b:comment_start."'".', "W" )<CR>'
4023577c6faSBram Moolenaarexec 'nnoremap <silent><buffer> [" :call search('."'".b:comment_end."'".', "W" )<CR>'
4033577c6faSBram Moolenaarexec 'vnoremap <silent><buffer> ]" :<C-U>exec "normal! gv"<Bar>call search('."'".b:comment_start."'".', "W" )<CR>'
4043577c6faSBram Moolenaarexec 'vnoremap <silent><buffer> [" :<C-U>exec "normal! gv"<Bar>call search('."'".b:comment_end."'".', "W" )<CR>'
405df177f67SBram Moolenaar
406df177f67SBram Moolenaar" Comments can be of the form:
407df177f67SBram Moolenaar"   /*
408df177f67SBram Moolenaar"    *
409df177f67SBram Moolenaar"    */
410df177f67SBram Moolenaar" or
411df177f67SBram Moolenaar"   --
4120fd9289dSBram Moolenaar" or
4130fd9289dSBram Moolenaar"   //
414df177f67SBram Moolenaarsetlocal comments=s1:/*,mb:*,ex:*/,:--,://
415df177f67SBram Moolenaar
4160fd9289dSBram Moolenaar" Set completion with CTRL-X CTRL-O to autoloaded function.
4170fd9289dSBram Moolenaarif exists('&omnifunc')
418f193fffdSBram Moolenaar    " Since the SQL completion plugin can be used in conjunction
419f193fffdSBram Moolenaar    " with other completion filetypes it must record the previous
420f193fffdSBram Moolenaar    " OMNI function prior to setting up the SQL OMNI function
421f193fffdSBram Moolenaar    let b:sql_compl_savefunc = &omnifunc
422f193fffdSBram Moolenaar
4230fd9289dSBram Moolenaar    " This is used by the sqlcomplete.vim plugin
4240fd9289dSBram Moolenaar    " Source it for it's global functions
4250fd9289dSBram Moolenaar    runtime autoload/syntaxcomplete.vim
4260fd9289dSBram Moolenaar
4270fd9289dSBram Moolenaar    setlocal omnifunc=sqlcomplete#Complete
4280fd9289dSBram Moolenaar    " Prevent the intellisense plugin from loading
4290fd9289dSBram Moolenaar    let b:sql_vis = 1
430e2f98b95SBram Moolenaar    if !exists('g:omni_sql_no_default_maps')
431e2f98b95SBram Moolenaar        " Static maps which use populate the completion list
432e2f98b95SBram Moolenaar        " using Vim's syntax highlighting rules
433*5c73622aSBram Moolenaar        exec 'imap <buffer> '.g:ftplugin_sql_omni_key.'a <C-\><C-O>:call sqlcomplete#Map("syntax")<CR><C-X><C-O>'
434*5c73622aSBram Moolenaar        exec 'imap <buffer> '.g:ftplugin_sql_omni_key.'k <C-\><C-O>:call sqlcomplete#Map("sqlKeyword")<CR><C-X><C-O>'
435*5c73622aSBram Moolenaar        exec 'imap <buffer> '.g:ftplugin_sql_omni_key.'f <C-\><C-O>:call sqlcomplete#Map("sqlFunction")<CR><C-X><C-O>'
436*5c73622aSBram Moolenaar        exec 'imap <buffer> '.g:ftplugin_sql_omni_key.'o <C-\><C-O>:call sqlcomplete#Map("sqlOption")<CR><C-X><C-O>'
437*5c73622aSBram Moolenaar        exec 'imap <buffer> '.g:ftplugin_sql_omni_key.'T <C-\><C-O>:call sqlcomplete#Map("sqlType")<CR><C-X><C-O>'
438*5c73622aSBram Moolenaar        exec 'imap <buffer> '.g:ftplugin_sql_omni_key.'s <C-\><C-O>:call sqlcomplete#Map("sqlStatement")<CR><C-X><C-O>'
439e2f98b95SBram Moolenaar        " Dynamic maps which use populate the completion list
440e2f98b95SBram Moolenaar        " using the dbext.vim plugin
441*5c73622aSBram Moolenaar        exec 'imap <buffer> '.g:ftplugin_sql_omni_key.'t <C-\><C-O>:call sqlcomplete#Map("table")<CR><C-X><C-O>'
442*5c73622aSBram Moolenaar        exec 'imap <buffer> '.g:ftplugin_sql_omni_key.'p <C-\><C-O>:call sqlcomplete#Map("procedure")<CR><C-X><C-O>'
443*5c73622aSBram Moolenaar        exec 'imap <buffer> '.g:ftplugin_sql_omni_key.'v <C-\><C-O>:call sqlcomplete#Map("view")<CR><C-X><C-O>'
444*5c73622aSBram Moolenaar        exec 'imap <buffer> '.g:ftplugin_sql_omni_key.'c <C-\><C-O>:call sqlcomplete#Map("column")<CR><C-X><C-O>'
445*5c73622aSBram Moolenaar        exec 'imap <buffer> '.g:ftplugin_sql_omni_key.'l <C-\><C-O>:call sqlcomplete#Map("column_csv")<CR><C-X><C-O>'
446e2f98b95SBram Moolenaar        " The next 3 maps are only to be used while the completion window is
447e2f98b95SBram Moolenaar        " active due to the <CR> at the beginning of the map
448*5c73622aSBram 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>'
449f193fffdSBram Moolenaar        " <C-Right> is not recognized on most Unix systems, so only create
450f193fffdSBram Moolenaar        " these additional maps on the Windows platform.
451f193fffdSBram Moolenaar        " If you would like to use these maps, choose a different key and make
452f193fffdSBram Moolenaar        " the same map in your vimrc.
453*5c73622aSBram Moolenaar        " if has('win32')
454*5c73622aSBram Moolenaar        exec 'imap <buffer> '.g:ftplugin_sql_omni_key_right.' <C-R>=sqlcomplete#DrillIntoTable()<CR>'
455*5c73622aSBram Moolenaar        exec 'imap <buffer> '.g:ftplugin_sql_omni_key_left.'  <C-R>=sqlcomplete#DrillOutOfColumns()<CR>'
456*5c73622aSBram Moolenaar        " endif
457e2f98b95SBram Moolenaar        " Remove any cached items useful for schema changes
458*5c73622aSBram Moolenaar        exec 'imap <buffer> '.g:ftplugin_sql_omni_key.'R <C-\><C-O>:call sqlcomplete#Map("resetCache")<CR><C-X><C-O>'
459f193fffdSBram Moolenaar    endif
460f193fffdSBram Moolenaar
461f193fffdSBram Moolenaar    if b:sql_compl_savefunc != ""
462f193fffdSBram Moolenaar        " We are changing the filetype to SQL from some other filetype
463f193fffdSBram Moolenaar        " which had OMNI completion defined.  We need to activate the
464f193fffdSBram Moolenaar        " SQL completion plugin in order to cache some of the syntax items
465f193fffdSBram Moolenaar        " while the syntax rules for SQL are active.
466f193fffdSBram Moolenaar        call sqlcomplete#PreCacheSyntax()
467e2f98b95SBram Moolenaar    endif
4680fd9289dSBram Moolenaarendif
4690fd9289dSBram Moolenaar
470df177f67SBram Moolenaarlet &cpo = s:save_cpo
471df177f67SBram Moolenaar
472e2f98b95SBram Moolenaar" vim:sw=4:
473df177f67SBram Moolenaar
474