diff runtime/ftplugin/sql.vim @ 167:c93c9cad9618

updated for version 7.0051
author vimboss
date Tue, 22 Feb 2005 08:39:57 +0000
parents 3fc0f57ecb91
children 7b21554be7a1
line wrap: on
line diff
--- a/runtime/ftplugin/sql.vim
+++ b/runtime/ftplugin/sql.vim
@@ -1,35 +1,198 @@
-" Vim filetype plugin file
-" Language:	SQL (Common for Oracle, Microsoft SQL Server, Sybase)
-" Version:	0.02
-" Maintainer:	David Fishburn <fishburn@ianywhere.com>
-" Last Change:	Tue May 27 2003 09:33:31
+" SQL filetype plugin file
+" Language:    SQL (Common for Oracle, Microsoft SQL Server, Sybase)
+" Version:     0.08
+" Maintainer:  David Fishburn <fishburn at ianywhere dot com>
+" Last Change: Mon Feb 21 2005 7:27:36 AM
+" Download:    http://vim.sourceforge.net/script.php?script_id=454
 
 " This file should only contain values that are common to all SQL languages
 " Oracle, Microsoft SQL Server, Sybase ASA/ASE, MySQL, and so on
 " If additional features are required create:
-" vimfiles/after/ftplugin/sql.vim
-" to override and add any of your own settings
+"        vimfiles/after/ftplugin/sql.vim (Windows)
+"        .vim/after/ftplugin/sql.vim     (Unix)
+" to override and add any of your own settings.
 
 " Only do this when not done yet for this buffer
 if exists("b:did_ftplugin")
   finish
 endif
 
+let s:save_cpo = &cpo
+set cpo=
+
 " Don't load another plugin for this buffer
 let b:did_ftplugin = 1
 
+" Some standard expressions for use with the matchit strings
+let s:notend = '\%(\<end\s\+\)\@<!'
+let s:when_no_matched_or_others = '\%(\<when\>\%(\s\+\%(\%(\<not\>\s\+\)\?<matched\>\)\|\<others\>\)\@!\)'
+let s:or_replace = '\%(or\s\+replace\s\+\)\?'
+
 " Define patterns for the matchit macro
 if !exists("b:match_words")
     " SQL is generally case insensitive
     let b:match_ignorecase = 1
+
+    " Handle the following:
+    " if
+    " elseif | elsif
+    " else [if]
+    " end if
+    "
+    " [while condition] loop
+    "     leave
+    "     break
+    "     continue
+    "     exit
+    " end loop
+    "
+    " for
+    "     leave
+    "     break
+    "     continue
+    "     exit
+    " end loop
+    "
+    " do
+    "     statements
+    " doend
+    "
+    " case
+    " when 
+    " when
+    " default
+    " end case
+    "
+    " merge
+    " when not matched
+    " when matched
+    "
+    " EXCEPTION
+    " WHEN column_not_found THEN
+    " WHEN OTHERS THEN
+    "
+    " create[ or replace] procedure|function|event
+
     let b:match_words =
-		\ '\<begin\>:\<end\>\(;\)\?$,'.
-		\ '\<if\>:\<elsif\>:\<elseif\>:\<else\>:'.
-		\ '\%(\<end\s\+\)\@<!' . '\<if\>:\<end\s\+if\>,'.
-		\ '\<loop\>:\<break\>:\<continue\>:'.
-		\ '\%(\<end\s\+\)\@<!' . '\<loop\>:\<end\s\+loop\>,'.
-		\ '\<for\>:\<break\>:\<continue\>:'.
-		\ '\%(\<end\s\+\)\@<!' . '\<for\>:\<end\s\+for\>,'.
-		\ '\<case\>:\<when\>:\<default\>:'.
-		\ '\%(\<end\s\+\)\@<!' . '\<case\>:\<end\s\+case\>'
+		\ '\<begin\>:\<end\>\W*$,'.
+		\
+                \ s:notend . '\<if\>:'.
+                \ '\<elsif\>\|\<elseif\>\|\<else\>:'.
+                \ '\<end\s\+if\>,'.
+                \
+                \ '\<do\>\|'.
+                \ '\<while\>\|'.
+                \ '\%(' . s:notend . '\<loop\>\)\|'.
+                \ '\%(' . s:notend . '\<for\>\):'.
+                \ '\<exit\>\|\<leave\>\|\<break\>\|\<continue\>:'.
+                \ '\%(\<end\s\+\%(for\|loop\>\)\)\|\<doend\>,'.
+                \
+                \ '\%('. s:notend . '\<case\>\):'.
+                \ '\%('.s:when_no_matched_or_others.'\):'.
+                \ '\%(\<when\s\+others\>\|\<end\s\+case\>\),' .
+                \
+                \ '\<merge\>:' .
+                \ '\<when\s\+not\s\+matched\>:' .
+                \ '\<when\s\+matched\>,' .
+                \
+                \ '\%(\<create\s\+' . s:or_replace . '\)\?'.
+                \ '\%(function\|procedure\|event\):'.
+                \ '\<returns\?\>'
+                " \ '\<begin\>\|\<returns\?\>:'.
+                " \ '\<end\>\(;\)\?\s*$'
+                " \ '\<exception\>:'.s:when_no_matched_or_others.
+                " \ ':\<when\s\+others\>,'.
+		"
+                " \ '\%(\<exception\>\|\%('. s:notend . '\<case\>\)\):'.
+                " \ '\%(\<default\>\|'.s:when_no_matched_or_others.'\):'.
+                " \ '\%(\%(\<when\s\+others\>\)\|\<end\s\+case\>\),' .
 endif
+
+" Define how to find the macro definition of a variable using the various
+" [d, [D, [_CTRL_D and so on features
+" Match these values ignoring case
+" ie  DECLARE varname INTEGER
+let &l:define = '\c\(DECLARE\|IN\|OUT\|INOUT\)\s*'
+
+
+" Mappings to move to the next BEGIN ... END block
+" \W - no characters or digits
+nmap <buffer> <silent> ]] :call search('\c^\s*begin\>', 'W' )<CR>
+nmap <buffer> <silent> [[ :call search('\c^\s*begin\>', 'bW' )<CR>
+nmap <buffer> <silent> ][ :call search('\c^\s*end\W*$', 'W' )<CR>
+nmap <buffer> <silent> [] :call search('\c^\s*end\W*$', 'bW' )<CR>
+vmap <buffer> <silent> ]] /\c^\s*begin\><CR>
+vmap <buffer> <silent> [[ ?\c^\s*begin<CR>
+vmap <buffer> <silent> ][ /\c^\s*end\W*$<CR>
+vmap <buffer> <silent> [] ?\c^\s*end\W*$<CR>
+
+
+" Predefined SQL objects what are used by the below mappings using
+" the ]} style maps.
+" This global variable allows the users to override it's value
+" from within their vimrc.
+if !exists('g:ftplugin_sql_objects')
+    let g:ftplugin_sql_objects = 'function,procedure,event,' .
+                \ '\(existing\\|global\s\+temporary\s\+\)\?table,trigger' .
+                \ ',schema,service,publication,database,datatype,domain' .
+                \ ',index,subscription,synchronization,view,variable'
+endif
+
+let s:ftplugin_sql_objects = 
+            \ '\c^\s*' .
+            \ '\(create\s\+\(or\s\+replace\s\+\)\?\)\?' .
+            \ '\<\(' .
+            \ substitute(g:ftplugin_sql_objects, ',', '\\\\|', 'g') .
+            \ '\)\>' 
+
+" Mappings to move to the next CREATE ... block
+" map <buffer> <silent> ]} :call search(g:ftplugin_sql_objects, 'W' )<CR>
+" nmap <buffer> <silent> [{ :call search('\c^\s*\(create\s\+\(or\s\+replace\s\+\)\?\)\?\<\(function\\|procedure\\|event\\|table\\|trigger\\|schema\)\>', 'bW' )<CR>
+" exec 'nmap <buffer> <silent> ]} /'.s:ftplugin_sql_objects.'<CR>'
+exec "nmap <buffer> <silent> ]} :call search('".s:ftplugin_sql_objects."', 'W')<CR>"
+exec "nmap <buffer> <silent> [{ :call search('".s:ftplugin_sql_objects."', 'bW')<CR>"
+" Could not figure out how to use a :call search() string in visual mode
+" without it ending visual mode
+exec 'vmap <buffer> <silent> ]} /'.s:ftplugin_sql_objects.'<CR>'
+exec 'vmap <buffer> <silent> [{ ?'.s:ftplugin_sql_objects.'<CR>'
+" vmap <buffer> <silent> ]} /\c^\s*\(create\s\+\(or\s\+replace\s\+\)\?\)\?\<\(function\\|procedure\\|event\\|table\\|trigger\\|schema\)\><CR>
+" vmap <buffer> <silent> [{ ?\c^\s*\(create\s\+\(or\s\+replace\s\+\)\?\)\?\<\(function\\|procedure\\|event\\|table\\|trigger\\|schema\)\><CR>
+
+" Mappings to move to the next COMMENT
+"
+" Had to double the \ for the \| separator since this has a special
+" meaning on maps
+let b:comment_leader = '\(--\\|\/\/\\|\*\\|\/\*\\|\*\/\)'
+" Find the start of the next comment
+let b:comment_start  = '^\(\s*'.b:comment_leader.'.*\n\)\@<!'.
+            \ '\(\s*'.b:comment_leader.'\)'
+" Find the end of the previous comment
+let b:comment_end = '\(^\s*'.b:comment_leader.'.*\n\)'.
+            \ '\(^\s*'.b:comment_leader.'\)\@!'
+" Skip over the comment
+let b:comment_jump_over  = "call search('".
+            \ '^\(\s*'.b:comment_leader.'.*\n\)\@<!'.
+            \ "', 'W')"
+let b:comment_skip_back  = "call search('".
+            \ '^\(\s*'.b:comment_leader.'.*\n\)\@<!'.
+            \ "', 'bW')"
+" Move to the start and end of comments
+exec 'nnoremap <silent><buffer> ]" /'.b:comment_start.'<CR>'
+exec 'nnoremap <silent><buffer> [" /'.b:comment_end.'<CR>'
+exec 'vnoremap <silent><buffer> ]" /'.b:comment_start.'<CR>'
+exec 'vnoremap <silent><buffer> [" /'.b:comment_end.'<CR>'
+
+" Comments can be of the form:
+"   /*
+"    *
+"    */
+" or
+"   // 
+" or
+"   --
+setlocal comments=s1:/*,mb:*,ex:*/,:--,://
+
+let &cpo = s:save_cpo
+
+" vim:sw=4:ff=unix:
+