home *** CD-ROM | disk | FTP | other *** search
/ vim.ftp.fu-berlin.de / 2015-02-03.vim.ftp.fu-berlin.de.tar / vim.ftp.fu-berlin.de / runtime / ftplugin / sql.vim < prev    next >
Encoding:
Text File  |  2012-05-31  |  19.0 KB  |  497 lines

  1. " SQL filetype plugin file
  2. " Language:    SQL (Common for Oracle, Microsoft SQL Server, Sybase)
  3. " Version:     8.0
  4. " Maintainer:  David Fishburn <dfishburn dot vim at gmail dot com>
  5. " Last Change: 2012 May 18
  6. " Download:    http://vim.sourceforge.net/script.php?script_id=454
  7.  
  8. " For more details please use:
  9. "        :h sql.txt
  10. "
  11. " This file should only contain values that are common to all SQL languages
  12. " Oracle, Microsoft SQL Server, Sybase ASA/ASE, MySQL, and so on
  13. " If additional features are required create:
  14. "        vimfiles/after/ftplugin/sql.vim (Windows)
  15. "        .vim/after/ftplugin/sql.vim     (Unix)
  16. " to override and add any of your own settings.
  17.  
  18.  
  19. " This file also creates a command, SQLSetType, which allows you to change
  20. " SQL dialects on the fly.  For example, if I open an Oracle SQL file, it
  21. " is color highlighted appropriately.  If I open an Informix SQL file, it
  22. " will still be highlighted according to Oracles settings.  By running:
  23. "     :SQLSetType sqlinformix
  24. "
  25. " All files called sqlinformix.vim will be loaded from the indent and syntax
  26. " directories.  This allows you to easily flip SQL dialects on a per file
  27. " basis.  NOTE: you can also use completion:
  28. "     :SQLSetType <tab>
  29. "
  30. " To change the default dialect, add the following to your vimrc:
  31. "    let g:sql_type_default = 'sqlanywhere'
  32. "
  33. " This file also creates a command, SQLGetType, which allows you to 
  34. " determine what the current dialect is in use.
  35. "     :SQLGetType
  36. "
  37. " History
  38. "
  39. " Version 8.0
  40. " NF: Improved the matchit plugin regex (Talek)
  41. "
  42. " Version 7.0
  43. " NF: Calls the sqlcomplete#ResetCacheSyntax() function when calling
  44. "     SQLSetType.
  45. "
  46. " Version 6.0
  47. " NF: Adds the command SQLGetType
  48. "
  49. " Version 5.0
  50. " NF: Adds the ability to choose the keys to control SQL completion, just add 
  51. "     the following to your .vimrc:
  52. "    let g:ftplugin_sql_omni_key       = '<C-C>'
  53. "    let g:ftplugin_sql_omni_key_right = '<Right>'
  54. "    let g:ftplugin_sql_omni_key_left  = '<Left>'
  55. "
  56. " BF: format-options - Auto-wrap comments using textwidth was turned off 
  57. "                      by mistake.
  58.  
  59.  
  60. " Only do this when not done yet for this buffer
  61. if exists("b:did_ftplugin")
  62.   finish
  63. endif
  64.  
  65. let s:save_cpo = &cpo
  66. set cpo&vim
  67.  
  68. " Disable autowrapping for code, but enable for comments
  69. " t    Auto-wrap text using textwidth
  70. " c     Auto-wrap comments using textwidth, inserting the current comment
  71. "       leader automatically.
  72. setlocal formatoptions-=t
  73. setlocal formatoptions+=c
  74.  
  75. " Functions/Commands to allow the user to change SQL syntax dialects
  76. " through the use of :SQLSetType <tab> for completion.
  77. " This works with both Vim 6 and 7.
  78.  
  79. if !exists("*SQL_SetType")
  80.     " NOTE: You cannot use function! since this file can be 
  81.     " sourced from within this function.  That will result in
  82.     " an error reported by Vim.
  83.     function SQL_GetList(ArgLead, CmdLine, CursorPos)
  84.  
  85.         if !exists('s:sql_list')
  86.             " Grab a list of files that contain "sql" in their names
  87.             let list_indent   = globpath(&runtimepath, 'indent/*sql*')
  88.             let list_syntax   = globpath(&runtimepath, 'syntax/*sql*')
  89.             let list_ftplugin = globpath(&runtimepath, 'ftplugin/*sql*')
  90.  
  91.             let sqls = "\n".list_indent."\n".list_syntax."\n".list_ftplugin."\n"
  92.  
  93.             " Strip out everything (path info) but the filename
  94.             " Regex
  95.             "    From between two newline characters
  96.             "    Non-greedily grab all characters
  97.             "    Followed by a valid filename \w\+\.\w\+ (sql.vim)
  98.             "    Followed by a newline, but do not include the newline
  99.             "
  100.             "    Replace it with just the filename (get rid of PATH)
  101.             "
  102.             "    Recursively, since there are many filenames that contain
  103.             "    the word SQL in the indent, syntax and ftplugin directory
  104.             let sqls = substitute( sqls, 
  105.                         \ '[\n]\%(.\{-}\)\(\w\+\.\w\+\)\n\@=', 
  106.                         \ '\1\n', 
  107.                         \ 'g'
  108.                         \ )
  109.  
  110.             " Remove duplicates, since sqlanywhere.vim can exist in the
  111.             " sytax, indent and ftplugin directory, yet we only want
  112.             " to display the option once
  113.             let index = match(sqls, '.\{-}\ze\n')
  114.             while index > -1
  115.                 " Get the first filename
  116.                 let file = matchstr(sqls, '.\{-}\ze\n', index)
  117.                 " Recursively replace any *other* occurrence of that
  118.                 " filename with nothing (ie remove it)
  119.                 let sqls = substitute(sqls, '\%>'.(index+strlen(file)).'c\<'.file.'\>\n', '', 'g')
  120.                 " Move on to the next filename
  121.                 let index = match(sqls, '.\{-}\ze\n', (index+strlen(file)+1))
  122.             endwhile
  123.  
  124.             " Sort the list if using version 7
  125.             if v:version >= 700
  126.                 let mylist = split(sqls, "\n")
  127.                 let mylist = sort(mylist)
  128.                 let sqls   = join(mylist, "\n")
  129.             endif
  130.  
  131.             let s:sql_list = sqls
  132.         endif
  133.  
  134.         return s:sql_list
  135.  
  136.     endfunction
  137.  
  138.     function SQL_SetType(name)
  139.  
  140.         " User has decided to override default SQL scripts and
  141.         " specify a vendor specific version 
  142.         " (ie Oracle, Informix, SQL Anywhere, ...)
  143.         " So check for an remove any settings that prevent the
  144.         " scripts from being executed, and then source the 
  145.         " appropriate Vim scripts.
  146.         if exists("b:did_ftplugin")
  147.             unlet b:did_ftplugin
  148.         endif
  149.         if exists("b:current_syntax")
  150.             " echomsg 'SQLSetType - clearing syntax'
  151.             syntax clear
  152.         endif
  153.         if exists("b:did_indent")
  154.             " echomsg 'SQLSetType - clearing indent'
  155.             unlet b:did_indent
  156.             " Set these values to their defaults
  157.             setlocal indentkeys&
  158.             setlocal indentexpr&
  159.         endif
  160.  
  161.         " Ensure the name is in the correct format
  162.         let new_sql_type = substitute(a:name, 
  163.                     \ '\s*\([^\.]\+\)\(\.\w\+\)\?', '\L\1', '')
  164.  
  165.         " Do not specify a buffer local variable if it is 
  166.         " the default value
  167.         if new_sql_type == 'sql'
  168.           let new_sql_type = 'sqloracle'
  169.         endif
  170.         let b:sql_type_override = new_sql_type
  171.  
  172.         " Remove any cached SQL since a new sytax will have different
  173.         " items and groups
  174.         if !exists('g:loaded_sql_completion') || 100 == g:loaded_sql_completion
  175.             call sqlcomplete#ResetCacheSyntax()
  176.         endif
  177.  
  178.         " Vim will automatically source the correct files if we
  179.         " change the filetype.  You cannot do this with setfiletype
  180.         " since that command will only execute if a filetype has
  181.         " not already been set.  In this case we want to override
  182.         " the existing filetype.
  183.         let &filetype = 'sql'
  184.  
  185.         if b:sql_compl_savefunc != ""
  186.             " We are changing the filetype to SQL from some other filetype
  187.             " which had OMNI completion defined.  We need to activate the
  188.             " SQL completion plugin in order to cache some of the syntax items
  189.             " while the syntax rules for SQL are active.
  190.             call sqlcomplete#PreCacheSyntax()
  191.         endif
  192.     endfunction
  193.     command! -nargs=* -complete=custom,SQL_GetList SQLSetType :call SQL_SetType(<q-args>)
  194.  
  195. endif
  196.  
  197. " Functions/Commands to allow the user determine current SQL syntax dialect
  198. " This works with both Vim 6 and 7.
  199.  
  200. if !exists("*SQL_GetType")
  201.     function SQL_GetType()
  202.         if exists('b:sql_type_override') 
  203.             echomsg "Current SQL dialect in use:".b:sql_type_override
  204.         else
  205.             echomsg "Current SQL dialect in use:".g:sql_type_default        
  206.         endif
  207.     endfunction
  208.     command! -nargs=0 SQLGetType :call SQL_GetType()
  209. endif
  210.  
  211. if exists("b:sql_type_override")
  212.     " echo 'sourcing buffer ftplugin/'.b:sql_type_override.'.vim'
  213.     if globpath(&runtimepath, 'ftplugin/'.b:sql_type_override.'.vim') != ''
  214.         exec 'runtime ftplugin/'.b:sql_type_override.'.vim'
  215.     " else
  216.     "     echomsg 'ftplugin/'.b:sql_type_override.' not exist, using default'
  217.     endif
  218. elseif exists("g:sql_type_default")
  219.     " echo 'sourcing global ftplugin/'.g:sql_type_default.'.vim'
  220.     if globpath(&runtimepath, 'ftplugin/'.g:sql_type_default.'.vim') != ''
  221.         exec 'runtime ftplugin/'.g:sql_type_default.'.vim'
  222.     " else
  223.     "     echomsg 'ftplugin/'.g:sql_type_default.'.vim not exist, using default'
  224.     endif
  225. endif
  226.  
  227. " If the above runtime command succeeded, do not load the default settings
  228. if exists("b:did_ftplugin")
  229.   finish
  230. endif
  231.  
  232. let b:undo_ftplugin = "setl comments<"
  233.  
  234. " Don't load another plugin for this buffer
  235. let b:did_ftplugin     = 1
  236. let b:current_ftplugin = 'sql'
  237.  
  238. " Win32 can filter files in the browse dialog
  239. if has("gui_win32") && !exists("b:browsefilter")
  240.     let b:browsefilter = "SQL Files (*.sql)\t*.sql\n" .
  241.       \ "All Files (*.*)\t*.*\n"
  242. endif
  243.  
  244. " Some standard expressions for use with the matchit strings
  245. let s:notend = '\%(\<end\s\+\)\@<!'
  246. let s:when_no_matched_or_others = '\%(\<when\>\%(\s\+\%(\%(\<not\>\s\+\)\?<matched\>\)\|\<others\>\)\@!\)'
  247. let s:or_replace = '\%(or\s\+replace\s\+\)\?'
  248.  
  249. " Define patterns for the matchit macro
  250. if !exists("b:match_words")
  251.     " SQL is generally case insensitive
  252.     let b:match_ignorecase = 1
  253.  
  254.     " Handle the following:
  255.     " if
  256.     " elseif | elsif
  257.     " else [if]
  258.     " end if
  259.     "
  260.     " [while condition] loop
  261.     "     leave
  262.     "     break
  263.     "     continue
  264.     "     exit
  265.     " end loop
  266.     "
  267.     " for
  268.     "     leave
  269.     "     break
  270.     "     continue
  271.     "     exit
  272.     " end loop
  273.     "
  274.     " do
  275.     "     statements
  276.     " doend
  277.     "
  278.     " case
  279.     " when 
  280.     " when
  281.     " default
  282.     " end case
  283.     "
  284.     " merge
  285.     " when not matched
  286.     " when matched
  287.     "
  288.     " EXCEPTION
  289.     " WHEN column_not_found THEN
  290.     " WHEN OTHERS THEN
  291.     "
  292.     " create[ or replace] procedure|function|event
  293.                 " \ '^\s*\<\%(do\|for\|while\|loop\)\>.*:'.
  294.  
  295.     let b:match_words =
  296.         \ '\<begin\>:\<end\>\W*$,'.
  297.         \
  298.                 \ s:notend . '\<if\>:'.
  299.                 \ '\<elsif\>\|\<elseif\>\|\<else\>:'.
  300.                 \ '\<end\s\+if\>,'.
  301.                 \
  302.                 \ '\(^\s*\)\@<=\(\<\%(do\|for\|while\|loop\)\>.*\):'.
  303.                 \ '\%(\<exit\>\|\<leave\>\|\<break\>\|\<continue\>\):'.
  304.                 \ '\%(\<doend\>\|\%(\<end\s\+\%(for\|while\|loop\>\)\)\),'.
  305.                 \
  306.                 \ '\%('. s:notend . '\<case\>\):'.
  307.                 \ '\%('.s:when_no_matched_or_others.'\):'.
  308.                 \ '\%(\<when\s\+others\>\|\<end\s\+case\>\),' .
  309.                 \
  310.                 \ '\<merge\>:' .
  311.                 \ '\<when\s\+not\s\+matched\>:' .
  312.                 \ '\<when\s\+matched\>,' .
  313.                 \
  314.                 \ '\%(\<create\s\+' . s:or_replace . '\)\?'.
  315.                 \ '\%(function\|procedure\|event\):'.
  316.                 \ '\<returns\?\>'
  317.                 " \ '\<begin\>\|\<returns\?\>:'.
  318.                 " \ '\<end\>\(;\)\?\s*$'
  319.                 " \ '\<exception\>:'.s:when_no_matched_or_others.
  320.                 " \ ':\<when\s\+others\>,'.
  321.         "
  322.                 " \ '\%(\<exception\>\|\%('. s:notend . '\<case\>\)\):'.
  323.                 " \ '\%(\<default\>\|'.s:when_no_matched_or_others.'\):'.
  324.                 " \ '\%(\%(\<when\s\+others\>\)\|\<end\s\+case\>\),' .
  325. endif
  326.  
  327. " Define how to find the macro definition of a variable using the various
  328. " [d, [D, [_CTRL_D and so on features
  329. " Match these values ignoring case
  330. " ie  DECLARE varname INTEGER
  331. let &l:define = '\c\<\(VARIABLE\|DECLARE\|IN\|OUT\|INOUT\)\>'
  332.  
  333.  
  334. " Mappings to move to the next BEGIN ... END block
  335. " \W - no characters or digits
  336. nmap <buffer> <silent> ]] :call search('\\c^\\s*begin\\>', 'W' )<CR>
  337. nmap <buffer> <silent> [[ :call search('\\c^\\s*begin\\>', 'bW' )<CR>
  338. nmap <buffer> <silent> ][ :call search('\\c^\\s*end\\W*$', 'W' )<CR>
  339. nmap <buffer> <silent> [] :call search('\\c^\\s*end\\W*$', 'bW' )<CR>
  340. vmap <buffer> <silent> ]] :<C-U>exec "normal! gv"<Bar>call search('\\c^\\s*begin\\>', 'W' )<CR>
  341. vmap <buffer> <silent> [[ :<C-U>exec "normal! gv"<Bar>call search('\\c^\\s*begin\\>', 'bW' )<CR>
  342. vmap <buffer> <silent> ][ :<C-U>exec "normal! gv"<Bar>call search('\\c^\\s*end\\W*$', 'W' )<CR>
  343. vmap <buffer> <silent> [] :<C-U>exec "normal! gv"<Bar>call search('\\c^\\s*end\\W*$', 'bW' )<CR>
  344.  
  345.  
  346. " By default only look for CREATE statements, but allow
  347. " the user to override
  348. if !exists('g:ftplugin_sql_statements')
  349.     let g:ftplugin_sql_statements = 'create'
  350. endif
  351.  
  352. " Predefined SQL objects what are used by the below mappings using
  353. " the ]} style maps.
  354. " This global variable allows the users to override it's value
  355. " from within their vimrc.
  356. " Note, you cannot use \?, since these patterns can be used to search
  357. " backwards, you must use \{,1}
  358. if !exists('g:ftplugin_sql_objects')
  359.     let g:ftplugin_sql_objects = 'function,procedure,event,' .
  360.                 \ '\\(existing\\\\|global\\s\\+temporary\\s\\+\\)\\\{,1}' .
  361.                 \ 'table,trigger' .
  362.                 \ ',schema,service,publication,database,datatype,domain' .
  363.                 \ ',index,subscription,synchronization,view,variable'
  364. endif
  365.  
  366. " Key to trigger SQL completion
  367. if !exists('g:ftplugin_sql_omni_key')
  368.     let g:ftplugin_sql_omni_key = '<C-C>'
  369. endif
  370. " Key to trigger drill into column list
  371. if !exists('g:ftplugin_sql_omni_key_right')
  372.     let g:ftplugin_sql_omni_key_right = '<Right>'
  373. endif
  374. " Key to trigger drill out of column list
  375. if !exists('g:ftplugin_sql_omni_key_left')
  376.     let g:ftplugin_sql_omni_key_left = '<Left>'
  377. endif
  378.  
  379. " Replace all ,'s with bars, except ones with numbers after them.
  380. " This will most likely be a \{,1} string.
  381. let s:ftplugin_sql_objects = 
  382.             \ '\\c^\\s*' .
  383.             \ '\\(\\(' .
  384.             \ substitute(g:ftplugin_sql_statements, ',\d\@!', '\\\\\\|', 'g') .
  385.             \ '\\)\\s\\+\\(or\\s\\+replace\\\s\+\\)\\{,1}\\)\\{,1}' .
  386.             \ '\\<\\(' .
  387.             \ substitute(g:ftplugin_sql_objects, ',\d\@!', '\\\\\\|', 'g') .
  388.             \ '\\)\\>' 
  389.  
  390. " Mappings to move to the next CREATE ... block
  391. exec "nmap <buffer> <silent> ]} :call search('".s:ftplugin_sql_objects."', 'W')<CR>"
  392. exec "nmap <buffer> <silent> [{ :call search('".s:ftplugin_sql_objects."', 'bW')<CR>"
  393. " Could not figure out how to use a :call search() string in visual mode
  394. " without it ending visual mode
  395. " Unfortunately, this will add a entry to the search history
  396. exec 'vmap <buffer> <silent> ]} /'.s:ftplugin_sql_objects.'<CR>'
  397. exec 'vmap <buffer> <silent> [{ ?'.s:ftplugin_sql_objects.'<CR>'
  398.  
  399. " Mappings to move to the next COMMENT
  400. "
  401. " Had to double the \ for the \| separator since this has a special
  402. " meaning on maps
  403. let b:comment_leader = '\\(--\\\|\\/\\/\\\|\\*\\\|\\/\\*\\\|\\*\\/\\)'
  404. " Find the start of the next comment
  405. let b:comment_start  = '^\\(\\s*'.b:comment_leader.'.*\\n\\)\\@<!'.
  406.             \ '\\(\\s*'.b:comment_leader.'\\)'
  407. " Find the end of the previous comment
  408. let b:comment_end = '\\(^\\s*'.b:comment_leader.'.*\\n\\)'.
  409.             \ '\\(^\\s*'.b:comment_leader.'\\)\\@!'
  410. " Skip over the comment
  411. let b:comment_jump_over  = "call search('".
  412.             \ '^\\(\\s*'.b:comment_leader.'.*\\n\\)\\@<!'.
  413.             \ "', 'W')"
  414. let b:comment_skip_back  = "call search('".
  415.             \ '^\\(\\s*'.b:comment_leader.'.*\\n\\)\\@<!'.
  416.             \ "', 'bW')"
  417. " Move to the start and end of comments
  418. exec 'nnoremap <silent><buffer> ]" :call search('."'".b:comment_start."'".', "W" )<CR>'
  419. exec 'nnoremap <silent><buffer> [" :call search('."'".b:comment_end."'".', "W" )<CR>'
  420. exec 'vnoremap <silent><buffer> ]" :<C-U>exec "normal! gv"<Bar>call search('."'".b:comment_start."'".', "W" )<CR>'
  421. exec 'vnoremap <silent><buffer> [" :<C-U>exec "normal! gv"<Bar>call search('."'".b:comment_end."'".', "W" )<CR>'
  422.  
  423. " Comments can be of the form:
  424. "   /*
  425. "    *
  426. "    */
  427. " or
  428. "   --
  429. " or
  430. "   // 
  431. setlocal comments=s1:/*,mb:*,ex:*/,:--,://
  432.  
  433. " Set completion with CTRL-X CTRL-O to autoloaded function.
  434. if exists('&omnifunc')
  435.     " Since the SQL completion plugin can be used in conjunction
  436.     " with other completion filetypes it must record the previous
  437.     " OMNI function prior to setting up the SQL OMNI function
  438.     let b:sql_compl_savefunc = &omnifunc
  439.  
  440.     " This is used by the sqlcomplete.vim plugin
  441.     " Source it for it's global functions
  442.     runtime autoload/syntaxcomplete.vim 
  443.  
  444.     setlocal omnifunc=sqlcomplete#Complete
  445.     " Prevent the intellisense plugin from loading
  446.     let b:sql_vis = 1
  447.     if !exists('g:omni_sql_no_default_maps')
  448.         " Static maps which use populate the completion list
  449.         " using Vim's syntax highlighting rules
  450.         exec 'imap <buffer> '.g:ftplugin_sql_omni_key.'a <C-\><C-O>:call sqlcomplete#Map("syntax")<CR><C-X><C-O>'
  451.         exec 'imap <buffer> '.g:ftplugin_sql_omni_key.'k <C-\><C-O>:call sqlcomplete#Map("sqlKeyword")<CR><C-X><C-O>'
  452.         exec 'imap <buffer> '.g:ftplugin_sql_omni_key.'f <C-\><C-O>:call sqlcomplete#Map("sqlFunction")<CR><C-X><C-O>'
  453.         exec 'imap <buffer> '.g:ftplugin_sql_omni_key.'o <C-\><C-O>:call sqlcomplete#Map("sqlOption")<CR><C-X><C-O>'
  454.         exec 'imap <buffer> '.g:ftplugin_sql_omni_key.'T <C-\><C-O>:call sqlcomplete#Map("sqlType")<CR><C-X><C-O>'
  455.         exec 'imap <buffer> '.g:ftplugin_sql_omni_key.'s <C-\><C-O>:call sqlcomplete#Map("sqlStatement")<CR><C-X><C-O>'
  456.         " Dynamic maps which use populate the completion list
  457.         " using the dbext.vim plugin
  458.         exec 'imap <buffer> '.g:ftplugin_sql_omni_key.'t <C-\><C-O>:call sqlcomplete#Map("table")<CR><C-X><C-O>'
  459.         exec 'imap <buffer> '.g:ftplugin_sql_omni_key.'p <C-\><C-O>:call sqlcomplete#Map("procedure")<CR><C-X><C-O>'
  460.         exec 'imap <buffer> '.g:ftplugin_sql_omni_key.'v <C-\><C-O>:call sqlcomplete#Map("view")<CR><C-X><C-O>'
  461.         exec 'imap <buffer> '.g:ftplugin_sql_omni_key.'c <C-\><C-O>:call sqlcomplete#Map("column")<CR><C-X><C-O>'
  462.         exec 'imap <buffer> '.g:ftplugin_sql_omni_key.'l <C-\><C-O>:call sqlcomplete#Map("column_csv")<CR><C-X><C-O>'
  463.         " The next 3 maps are only to be used while the completion window is
  464.         " active due to the <CR> at the beginning of the map
  465.         exec 'imap <buffer> '.g:ftplugin_sql_omni_key.'L <C-Y><C-\><C-O>:call sqlcomplete#Map("column_csv")<CR><C-X><C-O>'
  466.         " <C-Right> is not recognized on most Unix systems, so only create
  467.         " these additional maps on the Windows platform.
  468.         " If you would like to use these maps, choose a different key and make
  469.         " the same map in your vimrc.
  470.         " if has('win32')
  471.         exec 'imap <buffer> '.g:ftplugin_sql_omni_key_right.' <C-R>=sqlcomplete#DrillIntoTable()<CR>'
  472.         exec 'imap <buffer> '.g:ftplugin_sql_omni_key_left.'  <C-R>=sqlcomplete#DrillOutOfColumns()<CR>'
  473.         " endif
  474.         " Remove any cached items useful for schema changes
  475.         exec 'imap <buffer> '.g:ftplugin_sql_omni_key.'R <C-\><C-O>:call sqlcomplete#Map("resetCache")<CR><C-X><C-O>'
  476.     endif
  477.  
  478.     if b:sql_compl_savefunc != ""
  479.         " We are changing the filetype to SQL from some other filetype
  480.         " which had OMNI completion defined.  We need to activate the
  481.         " SQL completion plugin in order to cache some of the syntax items
  482.         " while the syntax rules for SQL are active.
  483.         call sqlcomplete#ResetCacheSyntax()
  484.         call sqlcomplete#PreCacheSyntax()
  485.     endif
  486. endif
  487.  
  488. let &cpo = s:save_cpo
  489. unlet s:save_cpo
  490.  
  491. " vim:sw=4:
  492.  
  493.