*sql.txt*   	For Vim version 7.0d.  Last change: Mon Apr 03 2006 10:34:00 PM

by David Fishburn

This is a filetype plugin to work with SQL files.

The Structured Query Language (SQL) is a standard which specifies statements
that allow a user to interact with a relational database.  Vim includes
features for navigation, indentation and syntax highlighting.

1. Navigation                                   |sql-navigation|
    1.1 Matchit		        		|sql-matchit|
    1.2 Text Object Motions		        |sql-object-motions|
    1.3 Predefined Object Motions               |sql-predefined-objects|
    1.4 Macros                                  |sql-macros|
2. SQL Dialects		                        |sql-dialects|
    2.1 SQLSetType		        	|SQLSetType|
    2.2 SQL Dialect Default		        |sql-type-default|
3. Adding new SQL Dialects		        |sql-adding-dialects|
4. OMNI SQL Completion  		        |sql-completion|
    4.1 Static mode		        	|sql-completion-static|
    4.2 Dynamic mode    		        |sql-completion-dynamic|
    4.3 Tutorial				|sql-completion-tutorial|
        4.3.1 Complete Tables			|sql-completion-tables|
        4.3.2 Complete Columns			|sql-completion-columns|
        4.3.3 Complete Procedures		|sql-completion-procedures|
        4.3.4 Complete Views			|sql-completion-views|
    4.4 Completion Customization		|sql-completion-customization|
    4.5 SQL Maps	        		|sql-completion-maps|
    4.6 Using with other filetypes		|sql-completion-filetypes|

==============================================================================
1. Navigation	        			*sql-navigation*

The SQL ftplugin provides a number of options to assist with file
navigation.


1.1 Matchit		        		*sql-matchit*
-----------
The matchit plugin (http://www.vim.org/scripts/script.php?script_id=39)
provides many additional features and can be customized for different
languages.  The matchit plugin is configured by defining a local 
buffer variable, b:match_words.  Pressing the % key while on various 
keywords will move the cursor to its match.  For example, if the cursor
is on an "if", pressing % will cycle between the "else", "elseif" and
"end if" keywords.

The following keywords are supported: >
    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

    create[ or replace] procedure|function|event
    returns
<

1.2 Text Object Motions		        	*sql-object-motions*
-----------------------
Vim has a number of predefined keys for working with text |object-motions|.
This filetype plugin attempts to translate these keys to maps which make sense
for the SQL language.

The following |Normal| mode and |Visual| mode maps exist (when you edit a SQL
file): >
    ]]              move forward to the next 'begin'
    [[              move backwards to the previous 'begin'
    ][              move forward to the next 'end'
    []              move backwards to the previous 'end'
<

1.3 Predefined Object Motions                   *sql-predefined-objects*
-----------------------------
Most relational databases support various standard features, tables, indices,
triggers and stored procedures.  Each vendor also has a variety of proprietary
objects.  The next set of maps have been created to help move between these
objects.  Depends on which database vendor you are using, the list of objects
must be configurable.  The filetype plugin attempts to define many of the
standard objects, plus many additional ones.  In order to make this as
flexible as possible, you can override the list of objects from within your
|vimrc| with the following: >
    let g:ftplugin_sql_objects = 'function,procedure,event,table,trigger' .
                \ ',schema,service,publication,database,datatype,domain' .
                \ ',index,subscription,synchronization,view,variable'
<                
The following |Normal| mode and |Visual| mode maps have been created which use
the above list: >
    ]}              move forward to the next 'create <object name>'
    [{              move backward to the previous 'create <object name>'

Repeatedly pressing ]} will cycle through each of these create statements: >
    create table t1 (
        ...
    );

    create procedure p1
    begin
        ...
    end;

    create index i1 on t1 (c1);
<
The default setting for g:ftplugin_sql_objects is: >
    let g:ftplugin_sql_objects = 'function,procedure,event,' .
                \ '\\(existing\\\\|global\\s\\+temporary\\s\\+\\)\\\{,1}' .
                \ 'table,trigger' .
                \ ',schema,service,publication,database,datatype,domain' .
                \ ',index,subscription,synchronization,view,variable'
<
The above will also handle these cases: >
    create table t1 (
        ...
    );
    create existing table t2 (
        ...
    );
    create global temporary table t3 (
        ...
    );
<
By default, the ftplugin only searches for CREATE statements.  You can also
override this via your |vimrc| with the following: >
    let g:ftplugin_sql_statements = 'create,alter'

The filetype plugin defines three types of comments: >
    1.  --
    2.  //
    3.  /*
         *
         */
<         
The following |Normal| mode and |Visual| mode maps have been created to work
with comments: >
    ]"              move forward to the beginning of a comment
    ["              move forward to the end of a comment



1.4 Macros                                         *sql-macros*
----------
Vim's feature to find macro definitions, |'define'|, is supported using this
regular expression: >
    \c\<\(VARIABLE\|DECLARE\|IN\|OUT\|INOUT\)\>
<
This addresses the following code: >
    CREATE VARIABLE myVar1 INTEGER;

    CREATE PROCEDURE sp_test(
        IN myVar2 INTEGER,
        OUT myVar3 CHAR(30),
        INOUT myVar4 NUMERIC(20,0)
    )
    BEGIN
        DECLARE myVar5 INTEGER;

        SELECT c1, c2, c3
          INTO myVar2, myVar3, myVar4
          FROM T1
         WHERE c4 = myVar1;
    END;
<
Place your cursor on "myVar1" on this line: >
         WHERE c4 = myVar1;
                     ^
<
Press any of the following keys: >
    [d
    [D
    [CTRL-D


==============================================================================
2. SQL Dialects	        			*sql-dialects* *sql-types*
                                                *sybase* *TSQL* *Transact-SQL*
                                                *sqlanywhere* 
                                                *oracle* *plsql* *sqlj*
                                                *sqlserver*
                                                *mysql* *postgress* *psql*
                                                *informix*

All relational databases support SQL.  There is a portion of SQL that is
portable across vendors (ex. CREATE TABLE, CREATE INDEX), but there is a
great deal of vendor specific extensions to SQL.  Oracle supports the 
"CREATE OR REPLACE" syntax, column defaults specified in the CREATE TABLE
statement and the procedural language (for stored procedures and triggers).

The default Vim distribution ships with syntax highlighting based on Oracle's
PL/SQL.  The default SQL indent script works for Oracle and SQL Anywhere.
The default filetype plugin works for all vendors and should remain vendor
neutral, but extendable.

Vim currently has support for a variety of different vendors, currently this
is via syntax scripts. Unfortunately, to flip between different syntax rules
you must either create:
    1.  New filetypes
    2.  Custom autocmds
    3.  Manual steps / commands

The majority of people work with only one vendor's database product, it would
be nice to specify a default in your |vimrc|.


2.1 SQLSetType		        		*sqlsettype* *SQLSetType*
--------------
For the people that work with many different databases, it would be nice to be
able to flip between the various vendors rules (indent, syntax) on a per
buffer basis, at any time.  The ftplugin/sql.vim file defines this function: >
    SQLSetType
<
Executing this function without any parameters will set the indent and syntax
scripts back to their defaults, see |sql-type-default|.  If you have turned
off Vi's compatibility mode, |'compatible'|, you can use the <Tab> key to
complete the optional parameter.

After typing the function name and a space, you can use the completion to
supply a parameter.  The function takes the name of the Vim script you want to
source.  Using the |cmdline-completion| feature, the SQLSetType function will
search the |'runtimepath'| for all Vim scripts with a name containing 'sql'.
This takes the guess work out of the spelling of the names.  The following are
examples: >
    :SQLSetType 
    :SQLSetType sqloracle
    :SQLSetType sqlanywhere
    :SQLSetType sqlinformix
    :SQLSetType mysql
<
The easiest approach is to the use <Tab> character which will first complete
the command name (SQLSetType), after a space and another <Tab>, display a list
of available Vim script names: >
    :SQL<Tab><space><Tab>
<

2.2 SQL Dialect Default		        	*sql-type-default*
-----------------------
As mentioned earlier, the default syntax rules for Vim is based on Oracle
(PL/SQL).  You can override this default by placing one of the following in
your |vimrc|: >
    let g:sql_type_default = 'sqlanywhere'
    let g:sql_type_default = 'sqlinformix'
    let g:sql_type_default = 'mysql'
<
If you added the following to your |vimrc|: >
    let g:sql_type_default = 'sqlinformix'
<
The next time edit a SQL file the following scripts will be automatically 
loaded by Vim: >
    ftplugin/sql.vim
    syntax/sqlinformix.vim
    indent/sql.vim
>
Notice indent/sqlinformix.sql was not loaded.  There is no indent file
for Informix, Vim loads the default files if the specified files does not
exist.


==============================================================================
3. Adding new SQL Dialects		        *sql-adding-dialects*

If you begin working with a SQL dialect which does not have any customizations
available with the default Vim distribution you can check http://www.vim.org
to see if any customization currently exist.  If not, you can begin by cloning
an existing script.  Read |filetype-plugins| for more details.

To help identify these scripts, try to create the files with a "sql" prefix.
If you decide you wish to create customizations for the SQLite database, you
can create any of the following: >
    Unix
        ~/.vim/syntax/sqlite.vim
        ~/.vim/indent/sqlite.vim
    Windows
        $VIM/vimfiles/syntax/sqlite.vim
        $VIM/vimfiles/indent/sqlite.vim
<
No changes are necessary to the SQLSetType function.  It will automatically
pickup the new SQL files and load them when you issue the SQLSetType command. 


==============================================================================
4. OMNI SQL Completion  		        *sql-completion* 
                                                *omni-sql-completion*

Vim 7 includes a code completion interface and functions which allows plugin
developers to build in code completion for any language.  Vim 7 includes 
code completion for the SQL language.

There are two modes to the SQL completion plugin, static and dynamic.  The
static mode populates the popups with the data generated from current syntax
highlight rules.  The dynamic mode populates the popups with data retrieved
directly from a database.  This includes, table lists, column lists,
procedures names and more.

4.1 Static Mode  		                *sql-completion-static*
---------------
The static popups created contain items defined by the active syntax rules
while editing a file with a filetype of SQL.  The plugin defines (by default)
various maps to help the user refine the list of items to be displayed.
The defaults static maps are: >
    imap <buffer> <C-C>a <C-\><C-O>:call sqlcomplete#Map('syntax')<CR><C-X><C-O>
    imap <buffer> <C-C>k <C-\><C-O>:call sqlcomplete#Map('sqlKeyword')<CR><C-X><C-O>
    imap <buffer> <C-C>f <C-\><C-O>:call sqlcomplete#Map('sqlFunction')<CR><C-X><C-O>
    imap <buffer> <C-C>o <C-\><C-O>:call sqlcomplete#Map('sqlOption')<CR><C-X><C-O>
    imap <buffer> <C-C>T <C-\><C-O>:call sqlcomplete#Map('sqlType')<CR><C-X><C-O>
    imap <buffer> <C-C>s <C-\><C-O>:call sqlcomplete#Map('sqlStatement')<CR><C-X><C-O>
< 
The static maps (which are based on the syntax highlight groups) follow this
format: >
    imap <buffer> <C-C>k <C-\><C-O>:call sqlcomplete#Map('sqlKeyword')<CR><C-X><C-O>
<
This command breaks down as: >
    imap                   - Create an insert map
    <buffer>               - Only for this buffer
    <C-C>k                 - Your choice of key map
    <C-\><C-O>             - Execute one command, return to Insert mode
    :call sqlcomplete#Map( - Allows the SQL completion plugin to perform some
                             housekeeping functions to allow it to be used in
                             conjunction with other completion plugins.
                             Indicate which item you want the SQL completion
                             plugin to complete.
                             In this case we are asking the plugin to display
                             items from the syntax highlight group
                             'sqlKeyword'.
                             You can view a list of highlight group names to
                             choose from by executing the
                                 :syntax list
                             command while editing a SQL file.
    'sqlKeyword'           - Display the items for the sqlKeyword highlight
                             group
    )<CR>                  - Execute the :let command
    <C-X><C-O>             - Trigger the standard omni completion key stroke.
                             Passing in 'sqlKeyword' instructs the SQL
                             completion plugin to populate the popup with
                             items from the sqlKeyword highlight group.  The
                             plugin will also cache this result until Vim is
                             restarted.  The syntax list is retrieved using
                             the syntaxcomplete plugin.
<
Using the 'syntax' keyword is a special case.  This instructs the
syntaxcomplete plugin to retrieve all syntax items.  So this will effectively
work for any of Vim's SQL syntax files.  At the time of writing this includes
10 different syntax files for the different dialects of SQL (see section 3
above, |sql-dialects|).

Here are some examples of the entries which are pulled from the syntax files: >
     All
         - Contains the contents of all syntax highlight groups
     Statements
         - Select, Insert, Update, Delete, Create, Alter, ...
     Functions
         - Min, Max, Trim, Round, Date, ...
     Keywords
         - Index, Database, Having, Group, With
     Options
         - Isolation_level, On_error, Qualify_owners, Fire_triggers, ...
     Types
         - Integer, Char, Varchar, Date, DateTime, Timestamp, ...
<
 
4.2 Dynamic Mode  		                *sql-completion-dynamic*
----------------
Dynamic mode populates the popups with data directly from a database.  In
order for the dynamic feature to be enabled you must have the dbext.vim
plugin installed, (http://vim.sourceforge.net/script.php?script_id=356).

Dynamic mode is used by several features of the SQL completion plugin.  
After installing the dbext plugin see the dbext-tutorial for additional
configuration and usage.  The dbext plugin allows the SQL completion plugin
to display a list of tables, procedures, views and columns. >
     Table List
         - All tables for all schema owners
     Procedure List
         - All stored procedures for all schema owners
     View List
         - All stored procedures for all schema owners
     Column List
         - For the selected table, the columns that are part of the table
<
To enable the popup, while in INSERT mode, use the following key combinations
for each group (where <C-C> means hold the CTRL key down while pressing 
the space bar):
     Table List             - <C-C>t
                            - <C-X><C-O> (the default map assumes tables)
     Stored Procedure List  - <C-C>p
     View List              - <C-C>v
     Column List            - <C-C>c
                            - Windows platform only
                            - When viewing a popup window displaying the list
                              of tables, you can press <C-Right>, this will
                              replace the table currently highlighted with
                              the column list for that table.
                            - When viewing a popup window displaying the list
                              of columns, you can press <C-Left>, this will
                              replace the column list with the list of tables.
 
The SQL completion plugin caches various lists that are displayed in
the popup window.  This makes the re-displaying of these lists very
fast.  If new tables or columns are added to the database it may become 
necessary to clear the plugins cache.  The default map for this is: >
    imap <buffer> <C-C>R <C-\><C-O>:call sqlcomplete#Map('ResetCache')<CR><C-X><C-O>
<
 
4.3 SQL Tutorial				*sql-completion-tutorial*
----------------
 
This tutorial is designed to take you through the common features of the SQL
completion plugin so that: >
     a) You gain familiarity with the plugin
     b) You are introduced to some of the more common features
     c) Show how to customize it to your preferences
     d) Demonstrate "Best of Use" of the plugin (easiest way to configure).
<
First, create a new buffer: >
     :e tutorial.sql
<

Static features
---------------
To take you through the various lists, simply enter insert mode, hit:
    <C-C>s   (show SQL statements)
At this point, you can page down through the list until you find "select".
If you are familiar with the item you are looking for, for example you know
the statement begins with the letter "s".  You can type ahead (without the
quotes) "se" then press: 
    <C-Spact>t 
Assuming "select" is highlighted in the popup list press <Enter> to choose
the entry.  Now type:
    * fr<C-C>a (show all syntax items)
choose "from" from the popup list.

When writing stored procedures using the "type" list is useful.  It contains
a list of all the database supported types.  This may or may not be true
depending on the syntax file you are using.  The SQL Anywhere syntax file
(sqlanywhere.vim) has support for this: >
     BEGIN
        DECLARE customer_id <C-C>T <-- Choose a type from the list
< 

Dynamic features
----------------
To take advantage of the dynamic features you must first install the 
dbext.vim plugin (http://vim.sourceforge.net/script.php?script_id=356).  It
also comes with a tutorial.  From the SQL completion plugin's perspective,
the main feature dbext provides is a connection to a database.  dbext
connection profiles are the most efficient mechanism to define connection
information.  Once connections have been setup, the SQL completion plugin
uses the features of dbext in the background to populate the popups.

What follows assumes dbext.vim has been correctly configured, a simple test
is to run the command, :DBListTable.  If a list of tables is shown, you know
dbext.vim is working as expected.  If not, please consult the dbext.txt 
documentation.

Assuming you have followed the dbext-tutorial you can press <C-C>t to
display a list of tables.  There is a delay while dbext is creating the table
list.  After the list is displayed press <C-W>.  This will remove both the 
popup window and the table name already chosen when the list became active. >
 
 4.3.1 Table Completion:			*sql-completion-tables*
<
Press <C-C>t to display a list of tables from within the database you
have connected via the dbext plugin.  
NOTE: All of the SQL completion popups support typing a prefix before pressing
the key map.  This will limit the contents of the popup window to just items
beginning with those characters.  >
 
 4.3.2 Column Completion:			*sql-completion-columns*
<
The SQL completion plugin can also display a list of columns for particular
tables.  The column completion is trigger via <C-C>c.

NOTE: The following example uses <C-Right> to trigger a column list while
the popup window is active.  This map is only available on the Windows
platforms since *nix does not recognize CTRL and the right arrow held down
together.  If you wish to enable this functionality on a *nix platform choose
a key and create this mapping (see |sql-completion-maps| for further 
details on where to create this imap): >
    imap <buffer> <your_keystroke> <CR><C-\><C-O>:call sqlcomplete#Map('column')<CR><C-X><C-O>
<
Example of using column completion:
     - Press <C-C>t again to display the list of tables.  
     - When the list is displayed in the completion window, press <C-Right>,
       this will replace the list of tables, with a list of columns for the
       table highlighted (after the same short delay).  
     - If you press <C-Left>, this will again replace the column list with the
       list of tables.  This allows you to drill into tables and column lists
       very quickly.  
     - Press <C-Right> again while the same table is highlighted.  You will
       notice there is no delay since the column list has been cached.  If you
       change the schema of a cached table you can press <C-C>R, which
       clears the SQL completion cache.  
     - NOTE: <C-Right> and <C-Left> have been designed to work while the
       completion window is active.  If you use these maps when the completion
       window is not active a carriage return will be inadvertently entered in
       your buffer.
 
Lets look how we can build a SQL statement dynamically.  A select statement
requires a list of columns.  There are two ways to build a column list using
the SQL completion plugin. >
    One column at a time:
<       1. After typing SELECT press <C-C>t to display a list of tables.
        2. Choose a table from the list.
        3. Press <C-Right> to display a list of columns.
        4. Choose the column from the list and press enter.
        5. Enter a "," and press <C-C>c.  Generating a column list
           generally requires having the cursor on a table name.  The plugin
           uses this name to determine what table to retrieve the column list.  
           In this step, since we are pressing <C-C>c without the cursor 
           on a table name the column list displayed will be for the previous 
           table.  Choose a different column and move on. 
        6. Repeat step 5 as often as necessary. >
    All columns for a table: 
<       1. After typing SELECT press <C-C>t to display a list of tables.
        2. Highlight the table you need the column list for.
        3. Press <Enter> to choose the table from the list.
        4. Press <C-C>l to request a comma separated list of all columns
           for this table.
        5. Based on the table name chosen in step 3, the plugin attempts to
           decide on a reasonable table alias.  You are then prompted to
           either accept of change the alias.  Press OK.
        6. The table name is replaced with the column list of the table is
           replaced with the comma separate list of columns with the alias
           prepended to each of the columns.
        7. Step 3 and 4 can be replaced by pressing <C-C>L, which has
           a <CR> embedded in the map to choose the currently highlighted 
           table in the list.

There is a special provision when writing select statements.  Consider the
following statement: >
     select * 
       from customer c,
            contact cn,
            department as dp,
            employee e,
            site_options so
      where c.
<
In INSERT mode after typing the final "c." which is an alias for the
"customer" table, you can press either <C-C>c or <C-X><C-O>.  This will
popup a list of columns for the customer table.  It does this by looking back
to the beginning of the select statement and finding a list of the tables
specified in the FROM clause.  In this case it notes that in the string
"customer c", "c" is an alias for the customer table.  The optional "AS"
keyword is also supported, "customer AS c". >
 
 
 4.3.3 Procedure Completion:			*sql-completion-procedures*
<
Similar to the table list, <C-C>p, will display a list of stored
procedures stored within the database. >
 
 4.3.4 View Completion:				*sql-completion-views*
<
Similar to the table list, <C-C>v, will display a list of views in the
database.

 
4.4 Completion Customization			*sql-completion-customization*
----------------------------

The SQL completion plugin can be customized through various options set in
your |vimrc|: >
    omni_sql_no_default_maps
<       - Default: This variable is not defined
        - If this variable is defined, no maps are created for OMNI
          completion.  See |sql-completion-maps| for further discussion.
>
    omni_sql_use_tbl_alias
<       - Default: a
        - This setting is only used when generating a comma separated
          column list.  By default the map is <C-C>l.  When generating
          a column list, an alias can be prepended to the beginning of each
          column, for example:  e.emp_id, e.emp_name.  This option has three 
          settings: >
                n - do not use an alias
                d - use the default (calculated) alias
                a - ask to confirm the alias name
<
          An alias is determined following a few rules:
               1.  If the table name has an '_', then use it as a separator: >
                   MY_TABLE_NAME --> MTN
                   my_table_name --> mtn
                   My_table_NAME --> MtN
<              2.  If the table name does NOT contain an '_', but DOES use
                   mixed case then the case is used as a separator: >
                   MyTableName --> MTN
<              3.  If the table name does NOT contain an '_', and does NOT 
                   use mixed case then the first letter of the table is used: >
                   mytablename --> m
                   MYTABLENAME --> M
<
 
4.5 SQL Maps	        			*sql-completion-maps*
------------

The default SQL maps have been described in other sections of this document in
greater detail.  Here is a list of the maps with a brief description of each.

Static Maps
-----------
These are maps which use populate the completion list using Vim's syntax
highlighting rules. >
    <C-C>a
<       - Displays all SQL syntax items. >
    <C-C>k 
<       - Displays all SQL syntax items defined as 'sqlKeyword'. >
    <C-C>f 
<       - Displays all SQL syntax items defined as 'sqlFunction. >
    <C-C>o
<       - Displays all SQL syntax items defined as 'sqlOption'. >
    <C-C>T
<       - Displays all SQL syntax items defined as 'sqlType'. >
    <C-C>s
<       - Displays all SQL syntax items defined as 'sqlStatement'. >

Dynamic Maps
------------
These are maps which use populate the completion list using the dbext.vim plugin. >
    <C-C>t  
<       - Displays a list of tables. >
    <C-C>p
<       - Displays a list of procedures. >
    <C-C>v
<       - Displays a list of views. >
    <C-C>c
<       - Displays a list of columns for a specific table. >
    <C-C>l
<       - Displays a comma separated list of columns for a specific table. >
    <C-C>L
<       - Displays a comma separated list of columns for a specific table.
          This should only be used when the completion window is active. >
    <C-Right>
<       - Displays a list of columns for the table currently highlighted in
          the completion window.  <C-Right> is not recognized on most Unix
          systems, so this maps is only created on the Windows platform.
          If you would like the same feature on Unix, choose a different key
          and make the same map in your vimrc.
          This should only be used when the completion window is active. >
    <C-Left>
<       - Displays the list of tables.
          <C-Left> is not recognized on most Unix systems, so this maps is
          only created on the Windows platform.  If you would like the same
          feature on Unix, choose a different key and make the same map in
          your vimrc.
          This should only be used when the completion window is active. >
    <C-C>R
<       - This maps removes all cached items and forces the SQL completion 
          to regenerate the list of items.

Customizing Maps
----------------
You can create as many additional key maps as you like.  Generally, the maps
will be specifying different syntax highlight groups.  

If you do not wish the default maps created or the key choices do not work on
your platform (often a case on *nix) you define the following variable in
your |vimrc|: >
    let g:omni_sql_no_default_maps = 1
< 
Do no edit ftplugin/sql.vim directly!  If you change this file your changes
will be over written on future updates.  Vim has a special directory structure
which allows you to make customizations without changing the files that are
included with the Vim distribution.  If you wish to customize the maps
create an after/ftplugin/sql.vim (see |after-directory|) and place the same
maps from the ftplugin/sql.vim in it using your own key strokes.  <C-C> was
chosen since it will work on both Windows and *nix platforms.  On the windows
platform you can also use <C-Space> or ALT keys.
 

4.6 Using with other filetypes		        *sql-completion-filetypes*
------------------------------

Many times SQL can be used with different filetypes.  For example Perl, Java,
PHP, Javascript can all interact with a database.  Often you need both the SQL
completion as well as the completion capabilities for the current language you
are editing.

This can be enabled easily with the following steps (assuming a Perl file): >
    1.  :e test.pl
    2.  :set filetype=sql
    3.  :set ft=perl

Step 1
------
Begins by editing a Perl file.  Vim automatically sets the filetype to
"perl".  By default, Vim runs the appropriate filetype file
ftplugin/perl.vim.  If you are using the syntax completion plugin by following
the directions at |ft-syntax-omni| then the |'omnifunc'| option has been set to
"syntax#Complete".  Pressing <C-X><C-O> will display the omni popup containing
the syntax items for Perl.

Step 2
------
Manually setting the filetype to 'sql' will also fire the appropriate filetype
files ftplugin/sql.vim.  This file will define a number of buffer specific
maps for SQL completion, see |sql-completion-maps|.  Now these maps have
been created and the SQL completion plugin has been initialized.  All SQL
syntax items have been cached in preparation.  The SQL filetype script detects
we are attempting to use two different completion plugins.  Since the SQL maps
begin with <C-C>, the maps will toggle the |'omnifunc'| when in use.  So you
can use <C-X><C-O> to continue using the completion for Perl (using the syntax
completion plugin) and <C-C> to use the SQL completion features.

Step 3
------
Setting the filetype back to Perl sets all the usual "perl" related items back
as they were.
     

vim:tw=78:ts=8:ft=help:norl:
