xref: /vim-8.2.3635/runtime/ftplugin/sql.vim (revision 3577c6fa)
1df177f67SBram Moolenaar" SQL filetype plugin file
2071d4279SBram Moolenaar" Language:    SQL (Common for Oracle, Microsoft SQL Server, Sybase)
3*3577c6faSBram Moolenaar" Version:     4.0
4df177f67SBram Moolenaar" Maintainer:  David Fishburn <fishburn at ianywhere dot com>
5*3577c6faSBram Moolenaar" Last Change: Wed 27 Feb 2008 04:35:21 PM Eastern Standard Time
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'
320fd9289dSBram Moolenaar
330fd9289dSBram Moolenaar
34071d4279SBram Moolenaar" Only do this when not done yet for this buffer
35071d4279SBram Moolenaarif exists("b:did_ftplugin")
36071d4279SBram Moolenaar  finish
37071d4279SBram Moolenaarendif
38071d4279SBram Moolenaar
39df177f67SBram Moolenaarlet s:save_cpo = &cpo
40df177f67SBram Moolenaarset cpo=
41df177f67SBram Moolenaar
42*3577c6faSBram Moolenaar" Disable autowrapping for code, but enable for comments
43*3577c6faSBram Moolenaar" t	Auto-wrap text using textwidth
44*3577c6faSBram Moolenaar" c     Auto-wrap comments using textwidth, inserting the current comment
45*3577c6faSBram Moolenaar"       leader automatically.
46*3577c6faSBram Moolenaarsetlocal formatoptions-=t
47*3577c6faSBram Moolenaarsetlocal formatoptions-=c
48*3577c6faSBram Moolenaar
490fd9289dSBram Moolenaar" Functions/Commands to allow the user to change SQL syntax dialects
500fd9289dSBram Moolenaar" through the use of :SQLSetType <tab> for completion.
510fd9289dSBram Moolenaar" This works with both Vim 6 and 7.
520fd9289dSBram Moolenaar
530fd9289dSBram Moolenaarif !exists("*SQL_SetType")
540fd9289dSBram Moolenaar    " NOTE: You cannot use function! since this file can be
550fd9289dSBram Moolenaar    " sourced from within this function.  That will result in
560fd9289dSBram Moolenaar    " an error reported by Vim.
570fd9289dSBram Moolenaar    function SQL_GetList(ArgLead, CmdLine, CursorPos)
580fd9289dSBram Moolenaar
590fd9289dSBram Moolenaar        if !exists('s:sql_list')
600fd9289dSBram Moolenaar            " Grab a list of files that contain "sql" in their names
610fd9289dSBram Moolenaar            let list_indent   = globpath(&runtimepath, 'indent/*sql*')
620fd9289dSBram Moolenaar            let list_syntax   = globpath(&runtimepath, 'syntax/*sql*')
630fd9289dSBram Moolenaar            let list_ftplugin = globpath(&runtimepath, 'ftplugin/*sql*')
640fd9289dSBram Moolenaar
650fd9289dSBram Moolenaar            let sqls = "\n".list_indent."\n".list_syntax."\n".list_ftplugin."\n"
660fd9289dSBram Moolenaar
670fd9289dSBram Moolenaar            " Strip out everything (path info) but the filename
680fd9289dSBram Moolenaar            " Regex
690fd9289dSBram Moolenaar            "    From between two newline characters
700fd9289dSBram Moolenaar            "    Non-greedily grab all characters
710fd9289dSBram Moolenaar            "    Followed by a valid filename \w\+\.\w\+ (sql.vim)
720fd9289dSBram Moolenaar            "    Followed by a newline, but do not include the newline
730fd9289dSBram Moolenaar            "
740fd9289dSBram Moolenaar            "    Replace it with just the filename (get rid of PATH)
750fd9289dSBram Moolenaar            "
760fd9289dSBram Moolenaar            "    Recursively, since there are many filenames that contain
770fd9289dSBram Moolenaar            "    the word SQL in the indent, syntax and ftplugin directory
780fd9289dSBram Moolenaar            let sqls = substitute( sqls,
790fd9289dSBram Moolenaar                        \ '[\n]\%(.\{-}\)\(\w\+\.\w\+\)\n\@=',
800fd9289dSBram Moolenaar                        \ '\1\n',
810fd9289dSBram Moolenaar                        \ 'g'
820fd9289dSBram Moolenaar                        \ )
830fd9289dSBram Moolenaar
840fd9289dSBram Moolenaar            " Remove duplicates, since sqlanywhere.vim can exist in the
850fd9289dSBram Moolenaar            " sytax, indent and ftplugin directory, yet we only want
860fd9289dSBram Moolenaar            " to display the option once
870fd9289dSBram Moolenaar            let index = match(sqls, '.\{-}\ze\n')
880fd9289dSBram Moolenaar            while index > -1
890fd9289dSBram Moolenaar                " Get the first filename
900fd9289dSBram Moolenaar                let file = matchstr(sqls, '.\{-}\ze\n', index)
910fd9289dSBram Moolenaar                " Recursively replace any *other* occurrence of that
920fd9289dSBram Moolenaar                " filename with nothing (ie remove it)
930fd9289dSBram Moolenaar                let sqls = substitute(sqls, '\%>'.(index+strlen(file)).'c\<'.file.'\>\n', '', 'g')
940fd9289dSBram Moolenaar                " Move on to the next filename
950fd9289dSBram Moolenaar                let index = match(sqls, '.\{-}\ze\n', (index+strlen(file)+1))
960fd9289dSBram Moolenaar            endwhile
970fd9289dSBram Moolenaar
980fd9289dSBram Moolenaar            " Sort the list if using version 7
990fd9289dSBram Moolenaar            if v:version >= 700
1000fd9289dSBram Moolenaar                let mylist = split(sqls, "\n")
1010fd9289dSBram Moolenaar                let mylist = sort(mylist)
1020fd9289dSBram Moolenaar                let sqls   = join(mylist, "\n")
1030fd9289dSBram Moolenaar            endif
1040fd9289dSBram Moolenaar
1050fd9289dSBram Moolenaar            let s:sql_list = sqls
1060fd9289dSBram Moolenaar        endif
1070fd9289dSBram Moolenaar
1080fd9289dSBram Moolenaar        return s:sql_list
1090fd9289dSBram Moolenaar
1100fd9289dSBram Moolenaar    endfunction
1110fd9289dSBram Moolenaar
1120fd9289dSBram Moolenaar    function SQL_SetType(name)
1130fd9289dSBram Moolenaar
1140fd9289dSBram Moolenaar        " User has decided to override default SQL scripts and
1150fd9289dSBram Moolenaar        " specify a vendor specific version
1160fd9289dSBram Moolenaar        " (ie Oracle, Informix, SQL Anywhere, ...)
1170fd9289dSBram Moolenaar        " So check for an remove any settings that prevent the
1180fd9289dSBram Moolenaar        " scripts from being executed, and then source the
1190fd9289dSBram Moolenaar        " appropriate Vim scripts.
1200fd9289dSBram Moolenaar        if exists("b:did_ftplugin")
1210fd9289dSBram Moolenaar            unlet b:did_ftplugin
1220fd9289dSBram Moolenaar        endif
1230fd9289dSBram Moolenaar        if exists("b:current_syntax")
1240fd9289dSBram Moolenaar            " echomsg 'SQLSetType - clearing syntax'
1250fd9289dSBram Moolenaar            syntax clear
1260fd9289dSBram Moolenaar        endif
1270fd9289dSBram Moolenaar        if exists("b:did_indent")
1280fd9289dSBram Moolenaar            " echomsg 'SQLSetType - clearing indent'
1290fd9289dSBram Moolenaar            unlet b:did_indent
1300fd9289dSBram Moolenaar            " Set these values to their defaults
1310fd9289dSBram Moolenaar            setlocal indentkeys&
1320fd9289dSBram Moolenaar            setlocal indentexpr&
1330fd9289dSBram Moolenaar        endif
1340fd9289dSBram Moolenaar
1350fd9289dSBram Moolenaar        " Ensure the name is in the correct format
1360fd9289dSBram Moolenaar        let new_sql_type = substitute(a:name,
1370fd9289dSBram Moolenaar                    \ '\s*\([^\.]\+\)\(\.\w\+\)\?', '\L\1', '')
1380fd9289dSBram Moolenaar
1390fd9289dSBram Moolenaar        " Do not specify a buffer local variable if it is
1400fd9289dSBram Moolenaar        " the default value
1410fd9289dSBram Moolenaar        if new_sql_type == 'sql'
1420fd9289dSBram Moolenaar          let new_sql_type = 'sqloracle'
1430fd9289dSBram Moolenaar        endif
1440fd9289dSBram Moolenaar        let b:sql_type_override = new_sql_type
1450fd9289dSBram Moolenaar
1460fd9289dSBram Moolenaar        " Vim will automatically source the correct files if we
1470fd9289dSBram Moolenaar        " change the filetype.  You cannot do this with setfiletype
1480fd9289dSBram Moolenaar        " since that command will only execute if a filetype has
1490fd9289dSBram Moolenaar        " not already been set.  In this case we want to override
1500fd9289dSBram Moolenaar        " the existing filetype.
1510fd9289dSBram Moolenaar        let &filetype = 'sql'
1520fd9289dSBram Moolenaar    endfunction
1530fd9289dSBram Moolenaar    command! -nargs=* -complete=custom,SQL_GetList SQLSetType :call SQL_SetType(<q-args>)
1540fd9289dSBram Moolenaar
1550fd9289dSBram Moolenaarendif
1560fd9289dSBram Moolenaar
1570fd9289dSBram Moolenaarif exists("b:sql_type_override")
1580fd9289dSBram Moolenaar    " echo 'sourcing buffer ftplugin/'.b:sql_type_override.'.vim'
1590fd9289dSBram Moolenaar    if globpath(&runtimepath, 'ftplugin/'.b:sql_type_override.'.vim') != ''
1600fd9289dSBram Moolenaar        exec 'runtime ftplugin/'.b:sql_type_override.'.vim'
1610fd9289dSBram Moolenaar    " else
1620fd9289dSBram Moolenaar    "     echomsg 'ftplugin/'.b:sql_type_override.' not exist, using default'
1630fd9289dSBram Moolenaar    endif
1640fd9289dSBram Moolenaarelseif exists("g:sql_type_default")
1650fd9289dSBram Moolenaar    " echo 'sourcing global ftplugin/'.g:sql_type_default.'.vim'
1660fd9289dSBram Moolenaar    if globpath(&runtimepath, 'ftplugin/'.g:sql_type_default.'.vim') != ''
1670fd9289dSBram Moolenaar        exec 'runtime ftplugin/'.g:sql_type_default.'.vim'
1680fd9289dSBram Moolenaar    " else
1690fd9289dSBram Moolenaar    "     echomsg 'ftplugin/'.g:sql_type_default.'.vim not exist, using default'
1700fd9289dSBram Moolenaar    endif
1710fd9289dSBram Moolenaarendif
1720fd9289dSBram Moolenaar
1730fd9289dSBram Moolenaar" If the above runtime command succeeded, do not load the default settings
1740fd9289dSBram Moolenaarif exists("b:did_ftplugin")
1750fd9289dSBram Moolenaar  finish
1760fd9289dSBram Moolenaarendif
1770fd9289dSBram Moolenaar
1780fd9289dSBram Moolenaarlet b:undo_ftplugin = "setl comments<"
1790fd9289dSBram Moolenaar
180071d4279SBram Moolenaar" Don't load another plugin for this buffer
181071d4279SBram Moolenaarlet b:did_ftplugin     = 1
1820fd9289dSBram Moolenaarlet b:current_ftplugin = 'sql'
1830fd9289dSBram Moolenaar
1840fd9289dSBram Moolenaar" Win32 can filter files in the browse dialog
1850fd9289dSBram Moolenaarif has("gui_win32") && !exists("b:browsefilter")
1860fd9289dSBram Moolenaar    let b:browsefilter = "SQL Files (*.sql)\t*.sql\n" .
1870fd9289dSBram Moolenaar	  \ "All Files (*.*)\t*.*\n"
1880fd9289dSBram Moolenaarendif
189071d4279SBram Moolenaar
190df177f67SBram Moolenaar" Some standard expressions for use with the matchit strings
191df177f67SBram Moolenaarlet s:notend = '\%(\<end\s\+\)\@<!'
192df177f67SBram Moolenaarlet s:when_no_matched_or_others = '\%(\<when\>\%(\s\+\%(\%(\<not\>\s\+\)\?<matched\>\)\|\<others\>\)\@!\)'
193df177f67SBram Moolenaarlet s:or_replace = '\%(or\s\+replace\s\+\)\?'
194df177f67SBram Moolenaar
195071d4279SBram Moolenaar" Define patterns for the matchit macro
196071d4279SBram Moolenaarif !exists("b:match_words")
197071d4279SBram Moolenaar    " SQL is generally case insensitive
198071d4279SBram Moolenaar    let b:match_ignorecase = 1
199df177f67SBram Moolenaar
200df177f67SBram Moolenaar    " Handle the following:
201df177f67SBram Moolenaar    " if
202df177f67SBram Moolenaar    " elseif | elsif
203df177f67SBram Moolenaar    " else [if]
204df177f67SBram Moolenaar    " end if
205df177f67SBram Moolenaar    "
206df177f67SBram Moolenaar    " [while condition] loop
207df177f67SBram Moolenaar    "     leave
208df177f67SBram Moolenaar    "     break
209df177f67SBram Moolenaar    "     continue
210df177f67SBram Moolenaar    "     exit
211df177f67SBram Moolenaar    " end loop
212df177f67SBram Moolenaar    "
213df177f67SBram Moolenaar    " for
214df177f67SBram Moolenaar    "     leave
215df177f67SBram Moolenaar    "     break
216df177f67SBram Moolenaar    "     continue
217df177f67SBram Moolenaar    "     exit
218df177f67SBram Moolenaar    " end loop
219df177f67SBram Moolenaar    "
220df177f67SBram Moolenaar    " do
221df177f67SBram Moolenaar    "     statements
222df177f67SBram Moolenaar    " doend
223df177f67SBram Moolenaar    "
224df177f67SBram Moolenaar    " case
225df177f67SBram Moolenaar    " when
226df177f67SBram Moolenaar    " when
227df177f67SBram Moolenaar    " default
228df177f67SBram Moolenaar    " end case
229df177f67SBram Moolenaar    "
230df177f67SBram Moolenaar    " merge
231df177f67SBram Moolenaar    " when not matched
232df177f67SBram Moolenaar    " when matched
233df177f67SBram Moolenaar    "
234df177f67SBram Moolenaar    " EXCEPTION
235df177f67SBram Moolenaar    " WHEN column_not_found THEN
236df177f67SBram Moolenaar    " WHEN OTHERS THEN
237df177f67SBram Moolenaar    "
238df177f67SBram Moolenaar    " create[ or replace] procedure|function|event
239df177f67SBram Moolenaar
240071d4279SBram Moolenaar    let b:match_words =
241df177f67SBram Moolenaar		\ '\<begin\>:\<end\>\W*$,'.
242df177f67SBram Moolenaar		\
243df177f67SBram Moolenaar                \ s:notend . '\<if\>:'.
244df177f67SBram Moolenaar                \ '\<elsif\>\|\<elseif\>\|\<else\>:'.
245df177f67SBram Moolenaar                \ '\<end\s\+if\>,'.
246df177f67SBram Moolenaar                \
247df177f67SBram Moolenaar                \ '\<do\>\|'.
248df177f67SBram Moolenaar                \ '\<while\>\|'.
249df177f67SBram Moolenaar                \ '\%(' . s:notend . '\<loop\>\)\|'.
250df177f67SBram Moolenaar                \ '\%(' . s:notend . '\<for\>\):'.
251df177f67SBram Moolenaar                \ '\<exit\>\|\<leave\>\|\<break\>\|\<continue\>:'.
252df177f67SBram Moolenaar                \ '\%(\<end\s\+\%(for\|loop\>\)\)\|\<doend\>,'.
253df177f67SBram Moolenaar                \
254df177f67SBram Moolenaar                \ '\%('. s:notend . '\<case\>\):'.
255df177f67SBram Moolenaar                \ '\%('.s:when_no_matched_or_others.'\):'.
256df177f67SBram Moolenaar                \ '\%(\<when\s\+others\>\|\<end\s\+case\>\),' .
257df177f67SBram Moolenaar                \
258df177f67SBram Moolenaar                \ '\<merge\>:' .
259df177f67SBram Moolenaar                \ '\<when\s\+not\s\+matched\>:' .
260df177f67SBram Moolenaar                \ '\<when\s\+matched\>,' .
261df177f67SBram Moolenaar                \
262df177f67SBram Moolenaar                \ '\%(\<create\s\+' . s:or_replace . '\)\?'.
263df177f67SBram Moolenaar                \ '\%(function\|procedure\|event\):'.
264df177f67SBram Moolenaar                \ '\<returns\?\>'
265df177f67SBram Moolenaar                " \ '\<begin\>\|\<returns\?\>:'.
266df177f67SBram Moolenaar                " \ '\<end\>\(;\)\?\s*$'
267df177f67SBram Moolenaar                " \ '\<exception\>:'.s:when_no_matched_or_others.
268df177f67SBram Moolenaar                " \ ':\<when\s\+others\>,'.
269df177f67SBram Moolenaar		"
270df177f67SBram Moolenaar                " \ '\%(\<exception\>\|\%('. s:notend . '\<case\>\)\):'.
271df177f67SBram Moolenaar                " \ '\%(\<default\>\|'.s:when_no_matched_or_others.'\):'.
272df177f67SBram Moolenaar                " \ '\%(\%(\<when\s\+others\>\)\|\<end\s\+case\>\),' .
273071d4279SBram Moolenaarendif
274df177f67SBram Moolenaar
275df177f67SBram Moolenaar" Define how to find the macro definition of a variable using the various
276df177f67SBram Moolenaar" [d, [D, [_CTRL_D and so on features
277df177f67SBram Moolenaar" Match these values ignoring case
278df177f67SBram Moolenaar" ie  DECLARE varname INTEGER
2790fd9289dSBram Moolenaarlet &l:define = '\c\<\(VARIABLE\|DECLARE\|IN\|OUT\|INOUT\)\>'
280df177f67SBram Moolenaar
281df177f67SBram Moolenaar
282df177f67SBram Moolenaar" Mappings to move to the next BEGIN ... END block
283df177f67SBram Moolenaar" \W - no characters or digits
2840fd9289dSBram Moolenaarnmap <buffer> <silent> ]] :call search('\\c^\\s*begin\\>', 'W' )<CR>
2850fd9289dSBram Moolenaarnmap <buffer> <silent> [[ :call search('\\c^\\s*begin\\>', 'bW' )<CR>
2860fd9289dSBram Moolenaarnmap <buffer> <silent> ][ :call search('\\c^\\s*end\\W*$', 'W' )<CR>
2870fd9289dSBram Moolenaarnmap <buffer> <silent> [] :call search('\\c^\\s*end\\W*$', 'bW' )<CR>
288*3577c6faSBram Moolenaarvmap <buffer> <silent> ]] :<C-U>exec "normal! gv"<Bar>call search('\\c^\\s*begin\\>', 'W' )<CR>
289*3577c6faSBram Moolenaarvmap <buffer> <silent> [[ :<C-U>exec "normal! gv"<Bar>call search('\\c^\\s*begin\\>', 'bW' )<CR>
290*3577c6faSBram Moolenaarvmap <buffer> <silent> ][ :<C-U>exec "normal! gv"<Bar>call search('\\c^\\s*end\\W*$', 'W' )<CR>
291*3577c6faSBram Moolenaarvmap <buffer> <silent> [] :<C-U>exec "normal! gv"<Bar>call search('\\c^\\s*end\\W*$', 'bW' )<CR>
292df177f67SBram Moolenaar
293df177f67SBram Moolenaar
2940fd9289dSBram Moolenaar" By default only look for CREATE statements, but allow
2950fd9289dSBram Moolenaar" the user to override
2960fd9289dSBram Moolenaarif !exists('g:ftplugin_sql_statements')
2970fd9289dSBram Moolenaar    let g:ftplugin_sql_statements = 'create'
2980fd9289dSBram Moolenaarendif
2990fd9289dSBram Moolenaar
300df177f67SBram Moolenaar" Predefined SQL objects what are used by the below mappings using
301df177f67SBram Moolenaar" the ]} style maps.
302df177f67SBram Moolenaar" This global variable allows the users to override it's value
303df177f67SBram Moolenaar" from within their vimrc.
3040fd9289dSBram Moolenaar" Note, you cannot use \?, since these patterns can be used to search
3050fd9289dSBram Moolenaar" backwards, you must use \{,1}
306df177f67SBram Moolenaarif !exists('g:ftplugin_sql_objects')
307df177f67SBram Moolenaar    let g:ftplugin_sql_objects = 'function,procedure,event,' .
3080fd9289dSBram Moolenaar                \ '\\(existing\\\\|global\\s\\+temporary\\s\\+\\)\\\{,1}' .
3090fd9289dSBram Moolenaar                \ 'table,trigger' .
310df177f67SBram Moolenaar                \ ',schema,service,publication,database,datatype,domain' .
311df177f67SBram Moolenaar                \ ',index,subscription,synchronization,view,variable'
312df177f67SBram Moolenaarendif
313df177f67SBram Moolenaar
3140fd9289dSBram Moolenaar" Replace all ,'s with bars, except ones with numbers after them.
3150fd9289dSBram Moolenaar" This will most likely be a \{,1} string.
316df177f67SBram Moolenaarlet s:ftplugin_sql_objects =
3170fd9289dSBram Moolenaar            \ '\\c^\\s*' .
3180fd9289dSBram Moolenaar            \ '\\(\\(' .
3190fd9289dSBram Moolenaar            \ substitute(g:ftplugin_sql_statements, ',\d\@!', '\\\\\\|', 'g') .
3200fd9289dSBram Moolenaar            \ '\\)\\s\\+\\(or\\s\\+replace\\\s\+\\)\\{,1}\\)\\{,1}' .
3210fd9289dSBram Moolenaar            \ '\\<\\(' .
3220fd9289dSBram Moolenaar            \ substitute(g:ftplugin_sql_objects, ',\d\@!', '\\\\\\|', 'g') .
3230fd9289dSBram Moolenaar            \ '\\)\\>'
324df177f67SBram Moolenaar
325df177f67SBram Moolenaar" Mappings to move to the next CREATE ... block
326df177f67SBram Moolenaarexec "nmap <buffer> <silent> ]} :call search('".s:ftplugin_sql_objects."', 'W')<CR>"
327df177f67SBram Moolenaarexec "nmap <buffer> <silent> [{ :call search('".s:ftplugin_sql_objects."', 'bW')<CR>"
328df177f67SBram Moolenaar" Could not figure out how to use a :call search() string in visual mode
329df177f67SBram Moolenaar" without it ending visual mode
3300fd9289dSBram Moolenaar" Unfortunately, this will add a entry to the search history
331df177f67SBram Moolenaarexec 'vmap <buffer> <silent> ]} /'.s:ftplugin_sql_objects.'<CR>'
332df177f67SBram Moolenaarexec 'vmap <buffer> <silent> [{ ?'.s:ftplugin_sql_objects.'<CR>'
333df177f67SBram Moolenaar
334df177f67SBram Moolenaar" Mappings to move to the next COMMENT
335df177f67SBram Moolenaar"
336df177f67SBram Moolenaar" Had to double the \ for the \| separator since this has a special
337df177f67SBram Moolenaar" meaning on maps
3380fd9289dSBram Moolenaarlet b:comment_leader = '\\(--\\\|\\/\\/\\\|\\*\\\|\\/\\*\\\|\\*\\/\\)'
339df177f67SBram Moolenaar" Find the start of the next comment
3400fd9289dSBram Moolenaarlet b:comment_start  = '^\\(\\s*'.b:comment_leader.'.*\\n\\)\\@<!'.
3410fd9289dSBram Moolenaar            \ '\\(\\s*'.b:comment_leader.'\\)'
342df177f67SBram Moolenaar" Find the end of the previous comment
3430fd9289dSBram Moolenaarlet b:comment_end = '\\(^\\s*'.b:comment_leader.'.*\\n\\)'.
3440fd9289dSBram Moolenaar            \ '\\(^\\s*'.b:comment_leader.'\\)\\@!'
345df177f67SBram Moolenaar" Skip over the comment
346df177f67SBram Moolenaarlet b:comment_jump_over  = "call search('".
3470fd9289dSBram Moolenaar            \ '^\\(\\s*'.b:comment_leader.'.*\\n\\)\\@<!'.
348df177f67SBram Moolenaar            \ "', 'W')"
349df177f67SBram Moolenaarlet b:comment_skip_back  = "call search('".
3500fd9289dSBram Moolenaar            \ '^\\(\\s*'.b:comment_leader.'.*\\n\\)\\@<!'.
351df177f67SBram Moolenaar            \ "', 'bW')"
352df177f67SBram Moolenaar" Move to the start and end of comments
353*3577c6faSBram Moolenaarexec 'nnoremap <silent><buffer> ]" :call search('."'".b:comment_start."'".', "W" )<CR>'
354*3577c6faSBram Moolenaarexec 'nnoremap <silent><buffer> [" :call search('."'".b:comment_end."'".', "W" )<CR>'
355*3577c6faSBram Moolenaarexec 'vnoremap <silent><buffer> ]" :<C-U>exec "normal! gv"<Bar>call search('."'".b:comment_start."'".', "W" )<CR>'
356*3577c6faSBram Moolenaarexec 'vnoremap <silent><buffer> [" :<C-U>exec "normal! gv"<Bar>call search('."'".b:comment_end."'".', "W" )<CR>'
357df177f67SBram Moolenaar
358df177f67SBram Moolenaar" Comments can be of the form:
359df177f67SBram Moolenaar"   /*
360df177f67SBram Moolenaar"    *
361df177f67SBram Moolenaar"    */
362df177f67SBram Moolenaar" or
363df177f67SBram Moolenaar"   --
3640fd9289dSBram Moolenaar" or
3650fd9289dSBram Moolenaar"   //
366df177f67SBram Moolenaarsetlocal comments=s1:/*,mb:*,ex:*/,:--,://
367df177f67SBram Moolenaar
3680fd9289dSBram Moolenaar" Set completion with CTRL-X CTRL-O to autoloaded function.
3690fd9289dSBram Moolenaarif exists('&omnifunc')
370f193fffdSBram Moolenaar    " Since the SQL completion plugin can be used in conjunction
371f193fffdSBram Moolenaar    " with other completion filetypes it must record the previous
372f193fffdSBram Moolenaar    " OMNI function prior to setting up the SQL OMNI function
373f193fffdSBram Moolenaar    let b:sql_compl_savefunc = &omnifunc
374f193fffdSBram Moolenaar
3750fd9289dSBram Moolenaar    " This is used by the sqlcomplete.vim plugin
3760fd9289dSBram Moolenaar    " Source it for it's global functions
3770fd9289dSBram Moolenaar    runtime autoload/syntaxcomplete.vim
3780fd9289dSBram Moolenaar
3790fd9289dSBram Moolenaar    setlocal omnifunc=sqlcomplete#Complete
3800fd9289dSBram Moolenaar    " Prevent the intellisense plugin from loading
3810fd9289dSBram Moolenaar    let b:sql_vis = 1
382e2f98b95SBram Moolenaar    if !exists('g:omni_sql_no_default_maps')
383e2f98b95SBram Moolenaar        " Static maps which use populate the completion list
384e2f98b95SBram Moolenaar        " using Vim's syntax highlighting rules
385f193fffdSBram Moolenaar        imap <buffer> <c-c>a <C-\><C-O>:call sqlcomplete#Map('syntax')<CR><C-X><C-O>
386f193fffdSBram Moolenaar        imap <buffer> <c-c>k <C-\><C-O>:call sqlcomplete#Map('sqlKeyword')<CR><C-X><C-O>
387f193fffdSBram Moolenaar        imap <buffer> <c-c>f <C-\><C-O>:call sqlcomplete#Map('sqlFunction')<CR><C-X><C-O>
388f193fffdSBram Moolenaar        imap <buffer> <c-c>o <C-\><C-O>:call sqlcomplete#Map('sqlOption')<CR><C-X><C-O>
389f193fffdSBram Moolenaar        imap <buffer> <c-c>T <C-\><C-O>:call sqlcomplete#Map('sqlType')<CR><C-X><C-O>
390f193fffdSBram Moolenaar        imap <buffer> <c-c>s <C-\><C-O>:call sqlcomplete#Map('sqlStatement')<CR><C-X><C-O>
391e2f98b95SBram Moolenaar        " Dynamic maps which use populate the completion list
392e2f98b95SBram Moolenaar        " using the dbext.vim plugin
393f193fffdSBram Moolenaar        imap <buffer> <c-c>t <C-\><C-O>:call sqlcomplete#Map('table')<CR><C-X><C-O>
394f193fffdSBram Moolenaar        imap <buffer> <c-c>p <C-\><C-O>:call sqlcomplete#Map('procedure')<CR><C-X><C-O>
395f193fffdSBram Moolenaar        imap <buffer> <c-c>v <C-\><C-O>:call sqlcomplete#Map('view')<CR><C-X><C-O>
396f193fffdSBram Moolenaar        imap <buffer> <c-c>c <C-\><C-O>:call sqlcomplete#Map('column')<CR><C-X><C-O>
397f193fffdSBram Moolenaar        imap <buffer> <c-c>l <C-\><C-O>:call sqlcomplete#Map('column_csv')<CR><C-X><C-O>
398e2f98b95SBram Moolenaar        " The next 3 maps are only to be used while the completion window is
399e2f98b95SBram Moolenaar        " active due to the <CR> at the beginning of the map
400f193fffdSBram Moolenaar        imap <buffer> <c-c>L <C-Y><C-\><C-O>:call sqlcomplete#Map('column_csv')<CR><C-X><C-O>
401f193fffdSBram Moolenaar        " <C-Right> is not recognized on most Unix systems, so only create
402f193fffdSBram Moolenaar        " these additional maps on the Windows platform.
403f193fffdSBram Moolenaar        " If you would like to use these maps, choose a different key and make
404f193fffdSBram Moolenaar        " the same map in your vimrc.
405e2f98b95SBram Moolenaar        if has('win32')
406f193fffdSBram Moolenaar            imap <buffer> <c-right>  <C-R>=sqlcomplete#DrillIntoTable()<CR>
407f193fffdSBram Moolenaar            imap <buffer> <c-left>  <C-R>=sqlcomplete#DrillOutOfColumns()<CR>
408e2f98b95SBram Moolenaar        endif
409e2f98b95SBram Moolenaar        " Remove any cached items useful for schema changes
410f193fffdSBram Moolenaar        imap <buffer> <c-c>R <C-\><C-O>:call sqlcomplete#Map('resetCache')<CR><C-X><C-O>
411f193fffdSBram Moolenaar    endif
412f193fffdSBram Moolenaar
413f193fffdSBram Moolenaar    if b:sql_compl_savefunc != ""
414f193fffdSBram Moolenaar        " We are changing the filetype to SQL from some other filetype
415f193fffdSBram Moolenaar        " which had OMNI completion defined.  We need to activate the
416f193fffdSBram Moolenaar        " SQL completion plugin in order to cache some of the syntax items
417f193fffdSBram Moolenaar        " while the syntax rules for SQL are active.
418f193fffdSBram Moolenaar        call sqlcomplete#PreCacheSyntax()
419e2f98b95SBram Moolenaar    endif
4200fd9289dSBram Moolenaarendif
4210fd9289dSBram Moolenaar
422df177f67SBram Moolenaarlet &cpo = s:save_cpo
423df177f67SBram Moolenaar
424e2f98b95SBram Moolenaar" vim:sw=4:
425df177f67SBram Moolenaar
426