matchit 插件 (http://www.vim.org/scripts/script.php?script_id=39) 提供许多扩展
功能,并可针对不同语言进行定制。该插件通过定义缓冲区局部变量 "b:match_words"
进行配置。在某些关键字上按 % 键,可在匹配的关键字间跳转光标。例如,当光标位于
"if" 上时,按 % 可在 "else"、"elseif" 和 "end if" 等关键字之间循环跳转。
支持以下关键字:
if
elseif | elsif
else [if]
end if
[while 条件] loop
leave
break
continue
exit
end loop
for
leave
break
continue
exit
end loop
do
语句
doend
case
when
when
default
end case
merge
when not matched
when matched
create[ 或 replace] procedure|function|event
returns
1.2 文本对象动作 sql-object-motions
大多数关系型数据库都支持若干标准特性、例如表、索引、触发器和存储过程。每个供应
商也提供了自己的专有对象。为了方便在这些对象间快速移动,插件定义了一组映射。插
件已定义了许多标准和附加对象。根据所使用的数据库供应商,可用对象的列表必须可以
定制,为此,可在 vimrc 里自定义该列表:
let g:ftplugin_sql_objects = 'function,procedure,event,table,trigger' ..
\ ',schema,service,publication,database,datatype,domain' ..
\ ',index,subscription,synchronization,view,variable'
普通模式 Normal 和可视模式 Visual 提供以下使用该列表的映射:
]} 正向跳转到下一个 'create <对象名>'
[{ 反向跳转到前一个 'create <对象名>'
重复按 ]} 会在各个 create 语句之间循环跳转:
create table t1 (
...
);
create procedure p1
begin
...
end;
create index i1 on t1 (c1);
g:ftplugin_sql_objects 的缺省设置是:
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'
该设置也能处理以下形式的语句:
create table t1 (
...
);
create existing table t2 (
...
);
create global temporary table t3 (
...
);
插件缺省只寻找 CREATE 语句。要扩展到其他语句,可在 vimrc 里覆盖以下变量:
let g:ftplugin_sql_statements = 'create,alter'
插件定义了三种注释格式:
1. --
2. //
3. /*
*
*/
普通模式 Normal 和可视模式 Visual 提供以下注释跳转映射:
]" 正向跳转到下一个注释开始
[" 正向跳转到下一个注释结束
1.4 宏 sql-macros
插件支持 Vim 寻找宏定义的特性 'define'。用以下正则表达式识别宏:
\c\<\(VARIABLE\|DECLARE\|IN\|OUT\|INOUT\)\>
该设置可以处理下面的代码:
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;
先把光标置于此行的 "myVar1" 上:
WHERE c4 = myVar1;
^
然后按 [d 、 [D 或 [CTRL-D 之一,即可跳转到其定义处。
对于同时使用多个不同的数据库的用户,最好能够随时为每个缓冲区切换所使用的供应商
规则 (包括缩进、语法)。为此,ftplugin/sql.vim 文件定义了以下函数:
SQLSetType
不带任何参数调用时,会恢复缩进和语法脚本的缺省值,见 sql-type-default 。假定
已关闭 Vi 兼容模式 'compatible',则可通过 <Tab> 自动补全可选的参数。
先输入函数名和空格后,然后用补全就可以提供所需参数。该函数接受的参数是待执行的
Vim 脚本名。因此,它会利用 cmdline-completion 特性,在 'runtimepath' 里查找
所有名字包含 'sql' 的脚本。
此过程需要对名字的拼写进行猜测。下面是一些例子:
:SQLSetType
:SQLSetType sqloracle
:SQLSetType sqlanywhere
:SQLSetType sqlinformix
:SQLSetType mysql
最方便的方法是利用 <Tab> 字符,先用第一个 <Tab> 补全命令名 (SQLSetType),在空
格和另一个 <Tab> 之后,会显示可用的 Vim 脚本名组成的列表:
:SQL<Tab><space><Tab>
2.2 SQLGetType sqlgettype SQLGetType
随时可用 SQLGetType 命令查看正在使用的 SQL 方言。该函数在 ftplugin/sql.vim 中
定义:
SQLGetType
会显示:
Current SQL dialect in use:sqlanywhere
2.3 SQL 方言缺省值 sql-type-default
前面已经提到,Vim 语法规则缺省基于 Oracle (PL/SQL)。要覆盖所用言,可在 vimrc
里加上以下各行之一:
let g:sql_type_default = 'sqlanywhere'
let g:sql_type_default = 'sqlinformix'
let g:sql_type_default = 'mysql'
如果在 vimrc 里加入:
let g:sql_type_default = 'sqlinformix'
下次编辑 SQL 文件时,Vim 会自动载入以下脚本:
ftplugin/sql.vim
syntax/sqlinformix.vim
indent/sql.vim
注意 这里没有载入 indent/sqlinformix.sql,这时因为没有 Informix 专用的缩进文
件。如果方言专用文件不存在,Vim 会回退到载入缺省脚本。
如果系统自带的 Vim 发布尚未提供所需 SQL 方言的定制支持,可以先访问
https://www.vim.org 查看是否已有更新版本提供了相应方言。如果仍未提供,则可基于
现有脚本进行复制和适当修改,自行创建所需的方言支持。详见 filetype-plugins 。
为了帮助识别这些脚本,创建的新文件应使用 "sql" 前缀。例如,如果决定创建 SQLite
数据库的定制支持,可新建以下文件:
Unix
~/.vim/syntax/sqlite.vim
~/.vim/indent/sqlite.vim
Windows
$VIM/vimfiles/syntax/sqlite.vim
$VIM/vimfiles/indent/sqlite.vim
无需修改 SQLSetType 函数。在使用 SQLSetType 命令时,会自动检测到用户新建的 SQL
文件并加载。
omni-sql-completion
Vim 7 包含了全能补全接口和函数,以便插件开发者为任何语言提供代码补全。通过此接
口,Vim 7 自带了 SQL 语言代码补全。
SQL 补全插件提供两种模式,静态模式和动态模式。静态模式基于当前语法高亮规则提取
数据来构造补全项,而动态模式直接从数据库提取数据来构造补全项。这包括所有的表清
单、列清单、过程名等对象。
4.1 静态模式 sql-completion-static
编辑 SQL 文件时,静态补全使用激活的语法规则里定义的项目构建弹出菜单。插件缺省
定义了一些筛选显示项目清单的映射。缺省的静态映射是:
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\w*')<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>
(译者注: 定义插入模式下的以下映射
<C-C>a 显示所有语法项目
<C-C>k 显示 SQL 关键字
<C-C>f 显示 SQL 函数
<C-C>o 显示 SQL 选项
<C-C>T 显示 SQL 类型
<C-C>s 显示 SQL 语句
)
用户可在 .vimrc 里自定义触发键 "<C-C>",因为该键不是在所有平台下都可用:
let g:ftplugin_sql_omni_key = '<C-C>'
(基于语法高亮组的) 静态映射都使用以下格式:
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>
让我们把这行命令拆开来解释一下:
imap - 建立插入模式映射
<buffer> - 只用于此缓冲区
<C-C>k - 选择的待映射键
<C-\><C-O> - 执行单个命令,然后回到插入模式
:call sqlcomplete#Map( - 让 SQL 补全插件执行若干例程处理,以便于其他补全插
件协同工作。
同时指定需要补全的项目类型。
在本例中,要求插件显示语法高亮组 'sqlKeyword' 中
包含的项目。
编辑 SQL 文件时,可执行下面命令查看可选的高亮组名
清单
:syntax list
'sqlKeyword' - 显示 sqlKeyword 高亮组项目
'sqlKeyword\w*' - Vim 7.4 开始可用的另一个选项,使用正则表达式匹配
所用的语法高亮组
)<CR> - 执行 :let 命令
<C-X><C-O> - 激活全能补全的标准键击。之前传递的 'sqlKeyword'
参数会指示 SQL 补全插件用 sqlKeyword 高亮组的项目
来构造全能补全的弹出菜单。该插件同时会缓存结果直
到 Vim 重启为止。提取语法列表的功能由
syntaxcomplete 插件提供。
使用 "syntax" 关键字是个特例。此时会调用 syntaxcomplete 插件来提取所有语法项
目。从而能够有效用于 Vim 提供的全部 SQL 语法文件。编写此文档时,共包含了 10 种
不同 SQL 方言的语法文件 (参见上面第 3 节, sql-dialects )。
这里给出从语法文件提取的部分项目示例:
All
- 包含所有语法高亮组的内容
语句
- Select、Insert、Update、Delete、Create、Alter、...
函数
- Min、Max、Trim、Round、Date、...
关键字
- Index、Database、Having、Group、With
选项
- Isolation_level、On_error、Qualify_owners、Fire_triggers、...
类型
- Integer、Char、Varchar、Date、DateTime、Timestamp、...
4.2 动态模式 sql-completion-dynamic
动态模式实时获取数据库数据来构建弹出菜单。要打开动态功能,需要先安装 dbext.vim
插件 (https://www.vim.org/scripts/script.php?script_id=356)。
SQL 补全插件的部分功能依赖于动态模式。安装 dbext 插件后,请参阅 dbext-tutorial
教程以了解附加配置和使用说明。借助 dbext 插件,SQL 补全插件可以获取并显示数据
库中的表、存储过程、视图以及列的清单。
表清单
- 属于架构 (schema) 拥有者的所有表
存储过程清单
- 属于架构拥有者的所有存储过程
视图清单
- 属于模式拥有者的所有视图
列清单
- 所选表包含的所有列
在插入模式下,可用以下映射打开弹出菜单,并显示相应类型项目的清单 (其中 <C-C>
代表同时按下 CTRL 和 C 键):
<C-C>t 表清单
<C-X><C-O> (缺省的全能补全映射假定使用表)
<C-C>p 存储过程清单
<C-C>v 视图清单
<C-C>c 列清单
钻进 / 钻出 - 弹出窗口显示表清单时,按 <Right> 可将当前高亮的表替
换为该表的列清单。
- 弹出窗口显示列清单时,按 <Left> 可将列清单替换回表清
单。
- 这样就可以快速钻进表里查看其列,然后快速钻出返回表清
单。
- <Right> 和 <Left> 按键可在 .vimrc 中修改:
let g:ftplugin_sql_omni_key_right = '<Right>'
let g:ftplugin_sql_omni_key_left = '<Left>'
SQL 补全插件会缓存用于弹出窗口的各种显示清单。后续显著提升这些清单的显示速度。
如果数据库结构发生变化 (新增表或列),必须使用重置命令清除缓存。为此可用以下缺
省映射:
imap <buffer> <C-C>R <C-\><C-O>:call sqlcomplete#Map('ResetCache')<CR><C-X><C-O>
4.3 SQL 教程 sql-completion-tutorial
本教程的目的是为了帮助用户了解 SQL 补全插件的常用功能,以便:
a) 熟悉插件的使用
b) 了解一些常用功能
c) 说明如何定制用户的特定偏好
d) 展示插件 "最好用" 的方法 (最容易的配置方法)。
首先,请建立新缓冲区:
:e tutorial.sql
静态特性
要得到各种清单,只要进入插入模式,然后输入:
<C-C>s (显示 SQL 语句)
现在可以往下翻页查看清单,直到看到 "select" 为止。如果已经知道要找什么项目,比
如确定该语句以字母 "s" 开头,可以先预输入 (不输入引号) "se" 然后按:
<C-Space>t (译者注: 应为 <C-C>s)
假定在弹出清单中,高亮了 "select",按 <Enter> 选择该项目。现在输入:
* fr<C-C>a (显示所有语法项目)
然后选择弹出清单里的 "from"。
编写存储过程时,可用 "type" 清单。它包含数据库支持的所有类型的清单。这取决于用
户使用的具体语法文件,因此未必完全准确。例如,SQL Anywhere 语法文件
(sqlanywhere.vim) 支持以下语句:
BEGIN
DECLARE customer_id <C-C>T <-- 从清单里选择一个类型
动态特性
要使用动态特性,请先安装 dbext.vim 插件
(https://www.vim.org/scripts/script.php?script_id=356)。该插件自带教程。对于
SQL 补全插件而言,dbext 的主要功能是连接到数据库。要定义数据库的连接信息,最好
通过该插件的连接设置文件。一旦建立好连接,SQL 补全插件会在后台利用 dbext 功能
来为弹出菜单填充数据。
下面假设 dbext.vim 已正确配置。可以通过运行命令 :DBListTable 来测试。如果能够
显示表清单,说明 dbext.vim 工作正常。否则,请查询 dbext.txt 文档。
按照 dbext-tutorial 教程操作后,按 <C-C>t 可以显示表清单。此时因为 dbext 正在
生成表清单,可能会有短暂延迟。显示清单后,按 <C-W> 可以同时关闭弹出菜单,并清
除清单激活时选中的表名。
4.3.1 补全表: sql-completion-tables
按 <C-C>t 会显示通过 dbext 插件连接到的数据库中,所有表的清单。
注意: 所有 SQL 补全的弹出菜单都允许在按映射键前先输入前缀。以便只显示与该前缀
匹配的项目。
4.3.2 补全列: sql-completion-columns
SQL 补全插件也能显示特定表中所有列的清单。<C-C>c 激活列补全。
注意: 在弹出菜单激活时,下例用 <Right> 键来激活列清单。
使用列补全的示例:
- 再按一次 <C-C>t,显示表清单。
- 补全窗口显示清单时,按 <Right> 键,表清单会被替换为当前高亮的表中的列清
单 (在同样短暂的延迟后)。
- 按 <Left> 键,列清单又被替换为表清单。这样就可以快速钻进/钻出各种表和列
清单。
- 高亮同一个表时,如果又按 <Right> 键,会注意到延迟消失了,这是因为列清单
已被缓存。如果已缓存的表架构 (schema) 被更改,可用 <C-C>R 命令清除 SQL
补全缓存。
- 注意: <Right> 和 <Left> 设计仅在补全窗口激活时有特殊功能。未激活补全窗
口时,<Right> 或 <Left> 如常工作。
让我们看看如何动态构造 SQL 语句。select 语句需要一个列清单。SQL 补全插件提供两
种构造列清单的方法。
一次一列:
1. 输入 SELECT 后,按 <C-C>t 显示表清单。
2. 从清单里选择一个表。
3. 按 <Right> 显示列清单。
4. 从清单里选择列并按回车。
5. 输入 "," 并按 <C-C>c。要生成列清单,光标一般应先定位于表名上。插件
会使用该名来决定从哪个表提取列清单。在这一步,因为我们按 <C-C>c 时
光标不在表名上,会显示前次使用的表的列清单。选择另一列,然后继续。
6. 根据需要,反复进行第 5 步。
特定表的所有列:
1. 输入 SELECT 后,按 <C-C>t 显示表清单。
2. 高亮需要所有列的表。
3. 按 <Enter> 从清单里选择该表。
4. 按 <C-C>l 来请求该表中以逗号分隔的所有列的清单。
5. 插件会基于第 3 步选中的表名建议合适的表别名。用户会得到提示,接受该
别名或者提供其他别名。然后按 OK。
6. 表名会被该表用逗号分隔的列清单替换,每列前面都会加上表别名。
7. 可用 <C-C>L 替换步骤 3 和 4,它在映射里内嵌了 <C-Y> 以选择清单里当
前高亮的表。
编写 select 语句时,会进行一项特殊的准备工作。考虑下列语句:
select *
from customer c,
contact cn,
department as dp,
employee e,
site_options so
where c.
"c" 是 "customer" 表的别名。在插入模式下,输入最后一个 "c." 之后,按 <C-C>c 或
<C-X><C-O> 会相应弹出 customer 表的列清单。因为插件会往回查找到 select 语句开
始处,并从那里开始寻找 FROM 字句里定义的表清单。在此例中,它发现了字符串
"customer c" 并因此识别 "c" 是 customer 表的别名。也支持可选的 "AS" 关键字,如
"customer AS c"。
4.3.3 补全过程: sql-completion-procedures
和表清单类似,<C-C>p 会显示数据库中所有存储过程的清单。
4.3.4 补全视图: sql-completion-views
和表清单类似,<C-C>v 显示数据库中所有视图的清单。
4.4 定制补全 sql-completion-customization
在 vimrc 里,可以通过以下选项来定制 SQL 补全插件:
omni_sql_no_default_maps (无缺省映射)
- 缺省: 没有定义
- 给出时,不创建用于全能补全的缺省映射。详见 sql-completion-maps 。
omni_sql_use_tbl_alias (使用表别名)
- 缺省: a
- 仅当生成逗号分隔的列清单时 (缺省映射为 <C-C>l) 才使用此设置。生成列
清单时,在每列前面都会加上别名,例如: e.emp_id, c.emp_name。此选项
有三种设置:
n - 不使用别名
d - 使用缺省 (经过计算的) 别名
a - 要求用户确认别名
缺省别名的计算使用以下规则:
1. 表名包含 '_' 时,以其为分隔符,选取每个单词的首字母:
MY_TABLE_NAME --> MTN
my_table_name --> mtn
My_table_NAME --> MtN
2. 表名 不 包含 '_' 但 包含 混合大小写时,假定单词以大写字母开
头,选取单个单词的首字母:
MyTableName --> MTN
3. 表名 不 包含 '_' 也 不 包含混合大小写时,使用表名首字母:
mytablename --> m
MYTABLENAME --> M
omni_sql_ignorecase (忽略大小写)
- 缺省: 'ignorecase' 的当前设置
- 合法值为 0 或 1。
- 启动补全前,如果已经输入了若干字符,会对补全列表进行过滤,只显示以这
些字符开头的匹配项。本值为 0 则列表过滤时会考虑大小写。
omni_sql_include_owner (包含拥有者)
- 缺省: 安装了 dbext.vim 3.00 或更高版本时为 1,否则为 0
- 合法值为 0 或 1。
- 打开时,在补全表、存储过程或视图时,在对象清单里同时给出拥有者名称。
用这些对象补全时,会替换拥有者的名字。
嗯
omni_sql_precache_syntax_groups (预缓存语法组)
< - 缺省: ["syntax","sqlKeyword","sqlFunction","sqlOption","sqlType",
"sqlStatement"]
- sqlcomplete 可以和其它补全插件一起使用。 sql-completion-filetypes
提供简要说明。当文件类型暂时改为 SQL 时,sqlcomplete 插件会缓存本选
项列表列出的语法组。
4.5 SQL 映射 sql-completion-maps
缺省 SQL 映射在本文档的其它章节里已有更详细的描述。这里列出所有映射以及其简短
描述。
静态映射
这些映射使用 Vim 的语法高亮规则来填充补全清单。
<C-C>a
- 显示所有的 SQL 语法项目。
<C-C>k
- 显示所有 'sqlKeyword' 定义的 SQL 语法项目。
<C-C>f
- 显示所有 'sqlFunction' 定义的 SQL 语法项目。
<C-C>o
- 显示所有 'sqlOption' 定义的 SQL 语法项目。
<C-C>T
- 显示所有 'sqlType' 定义的 SQL 语法项目。
<C-C>s
- 显示所有 'sqlStatement' 定义的 SQL 语法项目。
动态映射
这些映射使用 dbext.vim 插件来填充补全清单。
<C-C>t
- 显示表清单。
<C-C>p
- 显示过程清单。
<C-C>v
- 显示视图清单。
<C-C>c
- 显示特定表中的列清单。
<C-C>l
- 显示特定表中用逗号分隔的列清单。
<C-C>L
- 显示特定表中用逗号分隔的列清单。仅当补全窗口激活时才使用。
<Right>
- 显示补全窗口当前高亮表的列清单。多数 Unix 系统无法识别 <Right> 键,
所以该映射默认仅在 Windows 平台上生效。如果希望在 Unix 上也使用此功
能,可以选择其他按键,并在 vimrc 里添加相应映射。
<Left>
- 显示表清单。多数 Unix 系统无法识别 <Left> 键,所以该映射默认仅在
Windows 平台上生效。如果希望在 Unix 上也使用此功能,可以选择其他按
键,并在 vimrc 里添加相应映射。
<C-C>R
- 清除所有缓存项目,强制重新生成所有的项目清单。
定制映射
根据需要,可以创建任意多个附加的键映射。一般会为不同语法高亮组指定不同映射。
如果不想使用缺省映射,或者选择的键不适用于特定平台 (在 *nix 上常见),可在
vimrc 里定义以下变量:
let g:omni_sql_no_default_maps = 1
请勿直接编辑 ftplugin/sql.vim!该文件的本地修改会被未来更新覆盖。Vim 有一个特
殊的目录结构,可以进行定制而无须修改 Vim 发布里包含的任何文件。如果希望定制映
射,可创建 after/ftplugin/sql.vim (见 after-directory ),并在其中放置和
ftplugin/sql.vim 相同的映射定义,但使用其他按键。之所以选择 <C-C>,是因为它在
Windows 和 *nix 平台上都能工作。Windows 平台上,也可用 <C-Space> 或 ALT 键。
4.6 使用其它文件类型 sql-completion-filetypes
SQL 也经常用于不同的文件类型。例如,Perl、Java、PHP 和 Javascript 都可以和数据
库进行交互。往往既需要 SQL 补全,也需要当前编辑所需语言的补全功能。
可以通过以下步骤轻松完成 (以 Perl 文件为例):
1. :e test.pl
2. :set filetype=sql
3. :set ft=perl
步骤 1
开始编辑 Perl 文件 时,Vim 会自动设置文件类型为 "perl"。Vim 缺省会执行合适的文
件类型插件 ftplugin/perl.vim。如果依照 ft-syntax-omni 的指示使用了语法补全插
件,'omnifunc' 选项会被设置为 "syntax#Complete"。此时按 <C-X><C-O> 会显示包含
Perl 语法项的全能补全弹出菜单。
步骤 2
手动将文件类型设置为 'sql' 会激活相应的文件类型插件 ftplugin/sql.vim。该文件定
义了多个特定于缓冲区的 SQL 补全的映射,见 sql-completion-maps 。映射创建的同
时,SQL 补全插件会被初始化。所有 SQL 语法项目也已缓存。SQL 文件类型脚本会检测
到同时使用了两个不同的补全插件。因为 SQL 映射都以 <C-C> 开头,而这些映射只在使
用时才会激活 'omnifunc'。因此,仍然可以继续使用 <C-X><C-O> 调用 Perl 补全 (由
Perl 语法补全插件定义),同时按 <C-C> 调用 SQL 补全功能。
步骤 3
将文件类型重新设回 Perl 后,所有与 "Perl" 相关的设置会恢复到原有状态。
vim:tw=78:ts=8:noet:ft=help:norl: