2017-03-21 09:08:19 -07:00
|
|
|
*ft_sql.txt* Nvim
|
2014-07-10 21:05:51 -07:00
|
|
|
|
|
|
|
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 SQLGetType |SQLGetType|
|
|
|
|
2.3 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: >
|
2022-02-27 03:56:30 -07:00
|
|
|
let g:ftplugin_sql_objects = 'function,procedure,event,table,trigger' ..
|
|
|
|
\ ',schema,service,publication,database,datatype,domain' ..
|
2014-07-10 21:05:51 -07:00
|
|
|
\ ',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: >
|
2022-02-27 03:56:30 -07:00
|
|
|
let g:ftplugin_sql_objects = 'function,procedure,event,' ..
|
|
|
|
\ '\\(existing\\\\|global\\s\\+temporary\\s\\+\\)\\\{,1}' ..
|
|
|
|
\ 'table,trigger' ..
|
|
|
|
\ ',schema,service,publication,database,datatype,domain' ..
|
2014-07-10 21:05:51 -07:00
|
|
|
\ ',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
|
2015-10-17 07:25:53 -07:00
|
|
|
override this via your |init.vim| with the following: >
|
2014-07-10 21:05:51 -07:00
|
|
|
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* *postgresql* *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
|
2015-10-17 07:25:53 -07:00
|
|
|
be nice to specify a default in your |init.vim|.
|
2014-07-10 21:05:51 -07:00
|
|
|
|
|
|
|
|
|
|
|
2.1 SQLSetType *sqlsettype* *SQLSetType*
|
|
|
|
--------------
|
|
|
|
For the people that work with many different databases, it is 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
|
2015-03-23 20:29:21 -07:00
|
|
|
scripts back to their defaults, see |sql-type-default|. You can use the <Tab>
|
|
|
|
key to complete the optional parameter.
|
2014-07-10 21:05:51 -07:00
|
|
|
|
|
|
|
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
|
2022-09-25 16:58:27 -07:00
|
|
|
search the |'runtimepath'| for all Vim scripts with a name containing "sql".
|
2014-07-10 21:05:51 -07:00
|
|
|
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 SQLGetType *sqlgettype* *SQLGetType*
|
|
|
|
--------------
|
|
|
|
At anytime you can determine which SQL dialect you are using by calling the
|
|
|
|
SQLGetType command. The ftplugin/sql.vim file defines this function: >
|
|
|
|
SQLGetType
|
|
|
|
|
|
|
|
This will echo: >
|
|
|
|
Current SQL dialect in use:sqlanywhere
|
|
|
|
|
|
|
|
|
|
|
|
2.3 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
|
2015-10-17 07:25:53 -07:00
|
|
|
your |init.vim|: >
|
2014-07-10 21:05:51 -07:00
|
|
|
let g:sql_type_default = 'sqlanywhere'
|
|
|
|
let g:sql_type_default = 'sqlinformix'
|
|
|
|
let g:sql_type_default = 'mysql'
|
|
|
|
|
2015-10-17 07:25:53 -07:00
|
|
|
If you added the following to your |init.vim|: >
|
2014-07-10 21:05:51 -07:00
|
|
|
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
|
2015-10-17 07:25:53 -07:00
|
|
|
~/.config/nvim/syntax/sqlite.vim
|
|
|
|
~/.config/nvim/indent/sqlite.vim
|
2014-07-10 21:05:51 -07:00
|
|
|
|
|
|
|
No changes are necessary to the SQLSetType function. It will automatically
|
2021-04-29 05:54:38 -07:00
|
|
|
pick up the new SQL files and load them when you issue the SQLSetType command.
|
2014-07-10 21:05:51 -07:00
|
|
|
|
|
|
|
|
|
|
|
==============================================================================
|
|
|
|
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>
|
|
|
|
|
2021-04-24 16:03:31 -07:00
|
|
|
The use of "<C-C>" can be user chosen by using the following in your |init.vim|
|
|
|
|
as it may not work properly on all platforms: >
|
2014-07-10 21:05:51 -07:00
|
|
|
let g:ftplugin_sql_omni_key = '<C-C>'
|
|
|
|
>
|
|
|
|
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>
|
|
|
|
imap <buffer> <C-C>k <C-\><C-O>:call sqlcomplete#Map('sqlKeyword\w*')<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
|
|
|
|
'sqlKeyword\w*' - A second option available with Vim 7.4 which
|
|
|
|
uses a regular expression to determine which
|
|
|
|
syntax groups to use
|
|
|
|
)<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
|
|
|
|
|
|
|
|
Drilling In / Out - When viewing a popup window displaying the list
|
|
|
|
of tables, you can press <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 <Left>, this will
|
|
|
|
replace the column list with the list of tables.
|
|
|
|
- This allows you to quickly drill down into a
|
|
|
|
table to view its columns and back again.
|
2021-09-08 07:24:12 -07:00
|
|
|
- <Right> and <Left> can also be chosen via
|
2015-10-17 07:25:53 -07:00
|
|
|
your |init.vim| >
|
2014-07-10 21:05:51 -07:00
|
|
|
let g:ftplugin_sql_omni_key_right = '<Right>'
|
|
|
|
let g:ftplugin_sql_omni_key_left = '<Left>'
|
|
|
|
|
|
|
|
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-Space>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
|
2022-07-26 02:26:23 -07:00
|
|
|
popup window and the table name already chosen when the list became active.
|
2014-07-10 21:05:51 -07:00
|
|
|
|
|
|
|
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
|
2022-07-26 02:26:23 -07:00
|
|
|
beginning with those characters.
|
2014-07-10 21:05:51 -07:00
|
|
|
|
|
|
|
4.3.2 Column Completion: *sql-completion-columns*
|
|
|
|
|
|
|
|
The SQL completion plugin can also display a list of columns for particular
|
2021-04-29 05:54:38 -07:00
|
|
|
tables. The column completion is triggered via <C-C>c.
|
2014-07-10 21:05:51 -07:00
|
|
|
|
|
|
|
NOTE: The following example uses <Right> to trigger a column list while
|
2021-04-24 16:03:31 -07:00
|
|
|
the popup window is active.
|
2014-07-10 21:05:51 -07:00
|
|
|
|
|
|
|
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 <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 <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 <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: <Right> and <Left> have been designed to work while the
|
|
|
|
completion window is active. If the completion popup window is
|
|
|
|
not active, a normal <Right> or <Left> will be executed.
|
|
|
|
|
|
|
|
Let's look at 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 <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.
|
2022-04-08 13:40:56 -07:00
|
|
|
4. Press <C-C>l to request a comma-separated list of all columns
|
2014-07-10 21:05:51 -07:00
|
|
|
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 <C-Y> 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"
|
2022-07-26 02:26:23 -07:00
|
|
|
keyword is also supported, "customer AS c".
|
2014-07-10 21:05:51 -07:00
|
|
|
|
|
|
|
|
|
|
|
4.3.3 Procedure Completion: *sql-completion-procedures*
|
|
|
|
|
|
|
|
Similar to the table list, <C-C>p, will display a list of stored
|
2022-07-26 02:26:23 -07:00
|
|
|
procedures stored within the database.
|
2014-07-10 21:05:51 -07:00
|
|
|
|
|
|
|
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
|
2015-10-17 07:25:53 -07:00
|
|
|
your |init.vim|: >
|
2014-07-10 21:05:51 -07:00
|
|
|
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
|
2022-04-08 13:40:56 -07:00
|
|
|
- This setting is only used when generating a comma-separated
|
2014-07-10 21:05:51 -07:00
|
|
|
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
|
|
|
|
|
|
|
|
omni_sql_ignorecase
|
|
|
|
< - Default: Current setting for 'ignorecase'
|
|
|
|
- Valid settings are 0 or 1.
|
|
|
|
- When entering a few letters before initiating completion, the list
|
|
|
|
will be filtered to display only the entries which begin with the
|
|
|
|
list of characters. When this option is set to 0, the list will be
|
|
|
|
filtered using case sensitivity. >
|
|
|
|
|
|
|
|
omni_sql_include_owner
|
|
|
|
< - Default: 0, unless dbext.vim 3.00 has been installed
|
|
|
|
- Valid settings are 0 or 1.
|
|
|
|
- When completing tables, procedure or views and using dbext.vim 3.00
|
|
|
|
or higher the list of objects will also include the owner name.
|
|
|
|
When completing these objects and omni_sql_include_owner is enabled
|
|
|
|
the owner name will be replaced. >
|
|
|
|
|
|
|
|
omni_sql_precache_syntax_groups
|
|
|
|
< - Default:
|
|
|
|
['syntax','sqlKeyword','sqlFunction','sqlOption','sqlType','sqlStatement']
|
|
|
|
- sqlcomplete can be used in conjunction with other completion
|
|
|
|
plugins. This is outlined at |sql-completion-filetypes|. When the
|
|
|
|
filetype is changed temporarily to SQL, the sqlcompletion plugin
|
|
|
|
will cache the syntax groups listed in the List specified in this
|
|
|
|
option.
|
|
|
|
>
|
|
|
|
|
|
|
|
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
|
2022-04-08 13:40:56 -07:00
|
|
|
< - Displays a comma-separated list of columns for a specific table. >
|
2014-07-10 21:05:51 -07:00
|
|
|
<C-C>L
|
2022-04-08 13:40:56 -07:00
|
|
|
< - Displays a comma-separated list of columns for a specific table.
|
2014-07-10 21:05:51 -07:00
|
|
|
This should only be used when the completion window is active. >
|
|
|
|
<Right>
|
|
|
|
< - Displays a list of columns for the table currently highlighted in
|
|
|
|
the completion window. <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. >
|
|
|
|
<Left>
|
|
|
|
< - Displays the list of tables.
|
|
|
|
<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. >
|
|
|
|
<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
|
2015-10-17 07:25:53 -07:00
|
|
|
your |init.vim|: >
|
2014-07-10 21:05:51 -07:00
|
|
|
let g:omni_sql_no_default_maps = 1
|
|
|
|
|
2021-04-29 05:54:38 -07:00
|
|
|
Do not edit ftplugin/sql.vim directly! If you change this file your changes
|
2014-07-10 21:05:51 -07:00
|
|
|
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 and 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.
|
|
|
|
|
|
|
|
|
2018-10-29 01:50:39 -07:00
|
|
|
vim:tw=78:ts=8:noet:ft=help:norl:
|