xref: /vim-8.2.3635/runtime/ftplugin/sql.vim (revision df177f67)
1*df177f67SBram Moolenaar" SQL filetype plugin file
2071d4279SBram Moolenaar" Language:    SQL (Common for Oracle, Microsoft SQL Server, Sybase)
3*df177f67SBram Moolenaar" Version:     0.08
4*df177f67SBram Moolenaar" Maintainer:  David Fishburn <fishburn at ianywhere dot com>
5*df177f67SBram Moolenaar" Last Change: Mon Feb 21 2005 7:27:36 AM
6*df177f67SBram Moolenaar" Download:    http://vim.sourceforge.net/script.php?script_id=454
7071d4279SBram Moolenaar
8071d4279SBram Moolenaar" This file should only contain values that are common to all SQL languages
9071d4279SBram Moolenaar" Oracle, Microsoft SQL Server, Sybase ASA/ASE, MySQL, and so on
10071d4279SBram Moolenaar" If additional features are required create:
11*df177f67SBram Moolenaar"        vimfiles/after/ftplugin/sql.vim (Windows)
12*df177f67SBram Moolenaar"        .vim/after/ftplugin/sql.vim     (Unix)
13*df177f67SBram Moolenaar" to override and add any of your own settings.
14071d4279SBram Moolenaar
15071d4279SBram Moolenaar" Only do this when not done yet for this buffer
16071d4279SBram Moolenaarif exists("b:did_ftplugin")
17071d4279SBram Moolenaar  finish
18071d4279SBram Moolenaarendif
19071d4279SBram Moolenaar
20*df177f67SBram Moolenaarlet s:save_cpo = &cpo
21*df177f67SBram Moolenaarset cpo=
22*df177f67SBram Moolenaar
23071d4279SBram Moolenaar" Don't load another plugin for this buffer
24071d4279SBram Moolenaarlet b:did_ftplugin = 1
25071d4279SBram Moolenaar
26*df177f67SBram Moolenaar" Some standard expressions for use with the matchit strings
27*df177f67SBram Moolenaarlet s:notend = '\%(\<end\s\+\)\@<!'
28*df177f67SBram Moolenaarlet s:when_no_matched_or_others = '\%(\<when\>\%(\s\+\%(\%(\<not\>\s\+\)\?<matched\>\)\|\<others\>\)\@!\)'
29*df177f67SBram Moolenaarlet s:or_replace = '\%(or\s\+replace\s\+\)\?'
30*df177f67SBram Moolenaar
31071d4279SBram Moolenaar" Define patterns for the matchit macro
32071d4279SBram Moolenaarif !exists("b:match_words")
33071d4279SBram Moolenaar    " SQL is generally case insensitive
34071d4279SBram Moolenaar    let b:match_ignorecase = 1
35*df177f67SBram Moolenaar
36*df177f67SBram Moolenaar    " Handle the following:
37*df177f67SBram Moolenaar    " if
38*df177f67SBram Moolenaar    " elseif | elsif
39*df177f67SBram Moolenaar    " else [if]
40*df177f67SBram Moolenaar    " end if
41*df177f67SBram Moolenaar    "
42*df177f67SBram Moolenaar    " [while condition] loop
43*df177f67SBram Moolenaar    "     leave
44*df177f67SBram Moolenaar    "     break
45*df177f67SBram Moolenaar    "     continue
46*df177f67SBram Moolenaar    "     exit
47*df177f67SBram Moolenaar    " end loop
48*df177f67SBram Moolenaar    "
49*df177f67SBram Moolenaar    " for
50*df177f67SBram Moolenaar    "     leave
51*df177f67SBram Moolenaar    "     break
52*df177f67SBram Moolenaar    "     continue
53*df177f67SBram Moolenaar    "     exit
54*df177f67SBram Moolenaar    " end loop
55*df177f67SBram Moolenaar    "
56*df177f67SBram Moolenaar    " do
57*df177f67SBram Moolenaar    "     statements
58*df177f67SBram Moolenaar    " doend
59*df177f67SBram Moolenaar    "
60*df177f67SBram Moolenaar    " case
61*df177f67SBram Moolenaar    " when
62*df177f67SBram Moolenaar    " when
63*df177f67SBram Moolenaar    " default
64*df177f67SBram Moolenaar    " end case
65*df177f67SBram Moolenaar    "
66*df177f67SBram Moolenaar    " merge
67*df177f67SBram Moolenaar    " when not matched
68*df177f67SBram Moolenaar    " when matched
69*df177f67SBram Moolenaar    "
70*df177f67SBram Moolenaar    " EXCEPTION
71*df177f67SBram Moolenaar    " WHEN column_not_found THEN
72*df177f67SBram Moolenaar    " WHEN OTHERS THEN
73*df177f67SBram Moolenaar    "
74*df177f67SBram Moolenaar    " create[ or replace] procedure|function|event
75*df177f67SBram Moolenaar
76071d4279SBram Moolenaar    let b:match_words =
77*df177f67SBram Moolenaar		\ '\<begin\>:\<end\>\W*$,'.
78*df177f67SBram Moolenaar		\
79*df177f67SBram Moolenaar                \ s:notend . '\<if\>:'.
80*df177f67SBram Moolenaar                \ '\<elsif\>\|\<elseif\>\|\<else\>:'.
81*df177f67SBram Moolenaar                \ '\<end\s\+if\>,'.
82*df177f67SBram Moolenaar                \
83*df177f67SBram Moolenaar                \ '\<do\>\|'.
84*df177f67SBram Moolenaar                \ '\<while\>\|'.
85*df177f67SBram Moolenaar                \ '\%(' . s:notend . '\<loop\>\)\|'.
86*df177f67SBram Moolenaar                \ '\%(' . s:notend . '\<for\>\):'.
87*df177f67SBram Moolenaar                \ '\<exit\>\|\<leave\>\|\<break\>\|\<continue\>:'.
88*df177f67SBram Moolenaar                \ '\%(\<end\s\+\%(for\|loop\>\)\)\|\<doend\>,'.
89*df177f67SBram Moolenaar                \
90*df177f67SBram Moolenaar                \ '\%('. s:notend . '\<case\>\):'.
91*df177f67SBram Moolenaar                \ '\%('.s:when_no_matched_or_others.'\):'.
92*df177f67SBram Moolenaar                \ '\%(\<when\s\+others\>\|\<end\s\+case\>\),' .
93*df177f67SBram Moolenaar                \
94*df177f67SBram Moolenaar                \ '\<merge\>:' .
95*df177f67SBram Moolenaar                \ '\<when\s\+not\s\+matched\>:' .
96*df177f67SBram Moolenaar                \ '\<when\s\+matched\>,' .
97*df177f67SBram Moolenaar                \
98*df177f67SBram Moolenaar                \ '\%(\<create\s\+' . s:or_replace . '\)\?'.
99*df177f67SBram Moolenaar                \ '\%(function\|procedure\|event\):'.
100*df177f67SBram Moolenaar                \ '\<returns\?\>'
101*df177f67SBram Moolenaar                " \ '\<begin\>\|\<returns\?\>:'.
102*df177f67SBram Moolenaar                " \ '\<end\>\(;\)\?\s*$'
103*df177f67SBram Moolenaar                " \ '\<exception\>:'.s:when_no_matched_or_others.
104*df177f67SBram Moolenaar                " \ ':\<when\s\+others\>,'.
105*df177f67SBram Moolenaar		"
106*df177f67SBram Moolenaar                " \ '\%(\<exception\>\|\%('. s:notend . '\<case\>\)\):'.
107*df177f67SBram Moolenaar                " \ '\%(\<default\>\|'.s:when_no_matched_or_others.'\):'.
108*df177f67SBram Moolenaar                " \ '\%(\%(\<when\s\+others\>\)\|\<end\s\+case\>\),' .
109071d4279SBram Moolenaarendif
110*df177f67SBram Moolenaar
111*df177f67SBram Moolenaar" Define how to find the macro definition of a variable using the various
112*df177f67SBram Moolenaar" [d, [D, [_CTRL_D and so on features
113*df177f67SBram Moolenaar" Match these values ignoring case
114*df177f67SBram Moolenaar" ie  DECLARE varname INTEGER
115*df177f67SBram Moolenaarlet &l:define = '\c\(DECLARE\|IN\|OUT\|INOUT\)\s*'
116*df177f67SBram Moolenaar
117*df177f67SBram Moolenaar
118*df177f67SBram Moolenaar" Mappings to move to the next BEGIN ... END block
119*df177f67SBram Moolenaar" \W - no characters or digits
120*df177f67SBram Moolenaarnmap <buffer> <silent> ]] :call search('\c^\s*begin\>', 'W' )<CR>
121*df177f67SBram Moolenaarnmap <buffer> <silent> [[ :call search('\c^\s*begin\>', 'bW' )<CR>
122*df177f67SBram Moolenaarnmap <buffer> <silent> ][ :call search('\c^\s*end\W*$', 'W' )<CR>
123*df177f67SBram Moolenaarnmap <buffer> <silent> [] :call search('\c^\s*end\W*$', 'bW' )<CR>
124*df177f67SBram Moolenaarvmap <buffer> <silent> ]] /\c^\s*begin\><CR>
125*df177f67SBram Moolenaarvmap <buffer> <silent> [[ ?\c^\s*begin<CR>
126*df177f67SBram Moolenaarvmap <buffer> <silent> ][ /\c^\s*end\W*$<CR>
127*df177f67SBram Moolenaarvmap <buffer> <silent> [] ?\c^\s*end\W*$<CR>
128*df177f67SBram Moolenaar
129*df177f67SBram Moolenaar
130*df177f67SBram Moolenaar" Predefined SQL objects what are used by the below mappings using
131*df177f67SBram Moolenaar" the ]} style maps.
132*df177f67SBram Moolenaar" This global variable allows the users to override it's value
133*df177f67SBram Moolenaar" from within their vimrc.
134*df177f67SBram Moolenaarif !exists('g:ftplugin_sql_objects')
135*df177f67SBram Moolenaar    let g:ftplugin_sql_objects = 'function,procedure,event,' .
136*df177f67SBram Moolenaar                \ '\(existing\\|global\s\+temporary\s\+\)\?table,trigger' .
137*df177f67SBram Moolenaar                \ ',schema,service,publication,database,datatype,domain' .
138*df177f67SBram Moolenaar                \ ',index,subscription,synchronization,view,variable'
139*df177f67SBram Moolenaarendif
140*df177f67SBram Moolenaar
141*df177f67SBram Moolenaarlet s:ftplugin_sql_objects =
142*df177f67SBram Moolenaar            \ '\c^\s*' .
143*df177f67SBram Moolenaar            \ '\(create\s\+\(or\s\+replace\s\+\)\?\)\?' .
144*df177f67SBram Moolenaar            \ '\<\(' .
145*df177f67SBram Moolenaar            \ substitute(g:ftplugin_sql_objects, ',', '\\\\|', 'g') .
146*df177f67SBram Moolenaar            \ '\)\>'
147*df177f67SBram Moolenaar
148*df177f67SBram Moolenaar" Mappings to move to the next CREATE ... block
149*df177f67SBram Moolenaar" map <buffer> <silent> ]} :call search(g:ftplugin_sql_objects, 'W' )<CR>
150*df177f67SBram Moolenaar" nmap <buffer> <silent> [{ :call search('\c^\s*\(create\s\+\(or\s\+replace\s\+\)\?\)\?\<\(function\\|procedure\\|event\\|table\\|trigger\\|schema\)\>', 'bW' )<CR>
151*df177f67SBram Moolenaar" exec 'nmap <buffer> <silent> ]} /'.s:ftplugin_sql_objects.'<CR>'
152*df177f67SBram Moolenaarexec "nmap <buffer> <silent> ]} :call search('".s:ftplugin_sql_objects."', 'W')<CR>"
153*df177f67SBram Moolenaarexec "nmap <buffer> <silent> [{ :call search('".s:ftplugin_sql_objects."', 'bW')<CR>"
154*df177f67SBram Moolenaar" Could not figure out how to use a :call search() string in visual mode
155*df177f67SBram Moolenaar" without it ending visual mode
156*df177f67SBram Moolenaarexec 'vmap <buffer> <silent> ]} /'.s:ftplugin_sql_objects.'<CR>'
157*df177f67SBram Moolenaarexec 'vmap <buffer> <silent> [{ ?'.s:ftplugin_sql_objects.'<CR>'
158*df177f67SBram Moolenaar" vmap <buffer> <silent> ]} /\c^\s*\(create\s\+\(or\s\+replace\s\+\)\?\)\?\<\(function\\|procedure\\|event\\|table\\|trigger\\|schema\)\><CR>
159*df177f67SBram Moolenaar" vmap <buffer> <silent> [{ ?\c^\s*\(create\s\+\(or\s\+replace\s\+\)\?\)\?\<\(function\\|procedure\\|event\\|table\\|trigger\\|schema\)\><CR>
160*df177f67SBram Moolenaar
161*df177f67SBram Moolenaar" Mappings to move to the next COMMENT
162*df177f67SBram Moolenaar"
163*df177f67SBram Moolenaar" Had to double the \ for the \| separator since this has a special
164*df177f67SBram Moolenaar" meaning on maps
165*df177f67SBram Moolenaarlet b:comment_leader = '\(--\\|\/\/\\|\*\\|\/\*\\|\*\/\)'
166*df177f67SBram Moolenaar" Find the start of the next comment
167*df177f67SBram Moolenaarlet b:comment_start  = '^\(\s*'.b:comment_leader.'.*\n\)\@<!'.
168*df177f67SBram Moolenaar            \ '\(\s*'.b:comment_leader.'\)'
169*df177f67SBram Moolenaar" Find the end of the previous comment
170*df177f67SBram Moolenaarlet b:comment_end = '\(^\s*'.b:comment_leader.'.*\n\)'.
171*df177f67SBram Moolenaar            \ '\(^\s*'.b:comment_leader.'\)\@!'
172*df177f67SBram Moolenaar" Skip over the comment
173*df177f67SBram Moolenaarlet b:comment_jump_over  = "call search('".
174*df177f67SBram Moolenaar            \ '^\(\s*'.b:comment_leader.'.*\n\)\@<!'.
175*df177f67SBram Moolenaar            \ "', 'W')"
176*df177f67SBram Moolenaarlet b:comment_skip_back  = "call search('".
177*df177f67SBram Moolenaar            \ '^\(\s*'.b:comment_leader.'.*\n\)\@<!'.
178*df177f67SBram Moolenaar            \ "', 'bW')"
179*df177f67SBram Moolenaar" Move to the start and end of comments
180*df177f67SBram Moolenaarexec 'nnoremap <silent><buffer> ]" /'.b:comment_start.'<CR>'
181*df177f67SBram Moolenaarexec 'nnoremap <silent><buffer> [" /'.b:comment_end.'<CR>'
182*df177f67SBram Moolenaarexec 'vnoremap <silent><buffer> ]" /'.b:comment_start.'<CR>'
183*df177f67SBram Moolenaarexec 'vnoremap <silent><buffer> [" /'.b:comment_end.'<CR>'
184*df177f67SBram Moolenaar
185*df177f67SBram Moolenaar" Comments can be of the form:
186*df177f67SBram Moolenaar"   /*
187*df177f67SBram Moolenaar"    *
188*df177f67SBram Moolenaar"    */
189*df177f67SBram Moolenaar" or
190*df177f67SBram Moolenaar"   //
191*df177f67SBram Moolenaar" or
192*df177f67SBram Moolenaar"   --
193*df177f67SBram Moolenaarsetlocal comments=s1:/*,mb:*,ex:*/,:--,://
194*df177f67SBram Moolenaar
195*df177f67SBram Moolenaarlet &cpo = s:save_cpo
196*df177f67SBram Moolenaar
197*df177f67SBram Moolenaar" vim:sw=4:ff=unix:
198*df177f67SBram Moolenaar
199