Ft_sql

Nvim :help 页面,生成 使用 tree-sitter-vimdoc 解析器。


作者:David Fishburn
这是一个用于处理 SQL 文件的文件类型插件。
结构化查询语言 (SQL) 是一种标准,它指定了允许用户与关系数据库交互的语句。Vim 包含用于导航、缩进和语法高亮的功能。
1. 导航 sql-navigation 1.1 Matchit sql-matchit 1.2 文本对象移动 sql-object-motions 1.3 预定义的对象移动 sql-predefined-objects 1.4 宏 sql-macros 2. SQL 方言 sql-dialects 2.1 SQLSetType SQLSetType 2.2 SQLGetType SQLGetType 2.3 SQL 方言默认值 sql-type-default 3. 添加新的 SQL 方言 sql-adding-dialects 4. OMNI SQL 完成 sql-completion 4.1 静态模式 sql-completion-static 4.2 动态模式 sql-completion-dynamic 4.3 教程 sql-completion-tutorial 4.3.1 完成表格 sql-completion-tables 4.3.2 完成列 sql-completion-columns 4.3.3 完成过程 sql-completion-procedures 4.3.4 完成视图 sql-completion-views 4.4 完成自定义 sql-completion-customization 4.5 SQL 映射 sql-completion-maps 4.6 与其他文件类型一起使用 sql-completion-filetypes

1. 导航

SQL ftplugin 提供了许多选项来帮助文件导航。

1.1 Matchit sql-matchit

matchit 插件 (https://www.vim.org/scripts/script.php?script_id=39) 提供了许多额外的功能,并且可以针对不同的语言进行自定义。matchit 插件通过定义一个局部缓冲区变量 b:match_words 来配置。在各种关键字上按下 % 键将把光标移动到其匹配项。例如,如果光标在 "if" 上,按下 % 将在 "else"、"elseif" 和 "end if" 关键字之间循环。
以下关键字受支持
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 文本对象移动 sql-object-motions

Vim 有一系列用于处理文本的预定义键 object-motions。此文件类型插件尝试将这些键转换为对 SQL 语言有意义的映射。
以下 Normal 模式和 Visual 模式映射存在(当您编辑 SQL 文件时)
]]                    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 预定义的对象移动 sql-predefined-objects

大多数关系数据库都支持各种标准功能、表、索引、触发器和存储过程。每个供应商也有一系列专有对象。下一组映射是为了帮助在这些对象之间移动而创建的。取决于您使用的数据库供应商,对象列表必须是可配置的。文件类型插件尝试定义许多标准对象,以及许多其他对象。为了尽可能地灵活,您可以在您的 vimrc 中使用以下命令覆盖对象列表
let g:ftplugin_sql_objects = 'function,procedure,event,table,trigger' ..
            \ ',schema,service,publication,database,datatype,domain' ..
            \ ',index,subscription,synchronization,view,variable'
以下 Normal 模式和 Visual 模式映射已创建,它们使用上面的列表
]}                    move forward to the next 'create <object name>'
[{                    move backward to the previous 'create <object name>'
重复按下 ]} 将遍历每个这些创建语句
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 (
    ...
);
默认情况下,ftplugin 仅搜索 CREATE 语句。您也可以通过您的 init.vim 中的以下命令覆盖此设置
let g:ftplugin_sql_statements = 'create,alter'
文件类型插件定义了三种类型的注释
1.  --
2.  //
3.  /*
     *
     */
以下 Normal 模式和 Visual 模式映射已创建以用于注释
]"                    move forward to the beginning of a comment
["                    move forward to the end of a comment

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

2. SQL 方言 sql-dialects sql-types

sybase TSQL Transact-SQL sqlanywhere
oracle plsql sqlj sqlserver
mysql postgresql psql informix
所有关系数据库都支持 SQL。SQL 中有一部分是跨供应商可移植的(例如 CREATE TABLE、CREATE INDEX),但 SQL 中有大量的供应商特定扩展。Oracle 支持 "CREATE OR REPLACE" 语法、在 CREATE TABLE 语句中指定的列默认值以及过程语言(用于存储过程和触发器)。
默认的 Vim 发行版附带基于 Oracle 的 PL/SQL 的语法高亮。默认的 SQL 缩进脚本适用于 Oracle 和 SQL Anywhere。默认的文件类型插件适用于所有供应商,应该保持供应商中立,但可扩展。
Vim 目前支持各种不同的供应商,目前这是通过语法脚本实现的。不幸的是,要切换不同的语法规则,您必须创建:1. 新的文件类型 2. 自定义 autocmds 3. 手动步骤/命令
大多数人只使用一家供应商的数据库产品,最好在您的 init.vim 中指定一个默认值。

2.1 SQLSetType sqlsettype SQLSetType

对于那些使用许多不同数据库的人来说,能够在每个缓冲区的基础上随时切换各种供应商规则(缩进、语法)是件好事。ftplugin/sql.vim 文件定义了此函数
SQLSetType
执行此函数而不带任何参数将把缩进和语法脚本设置回它们的默认值,请参见 sql-type-default。您可以使用 <Tab> 键来完成可选参数。
在键入函数名称和空格后,您可以使用完成来提供参数。该函数接受您要引用的 Vim 脚本的名称。使用 cmdline-completion 功能,SQLSetType 函数将在 'runtimepath' 中搜索所有名称包含 "sql" 的 Vim 脚本。这消除了名称拼写上的猜测工作。以下是示例
:SQLSetType
:SQLSetType sqloracle
:SQLSetType sqlanywhere
:SQLSetType sqlinformix
:SQLSetType mysql
最简单的方法是使用 <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)。您可以通过将以下内容之一放在您的 init.vim 中来覆盖此默认值
let g:sql_type_default = 'sqlanywhere'
let g:sql_type_default = 'sqlinformix'
let g:sql_type_default = 'mysql'
如果您将以下内容添加到您的 init.vim
let g:sql_type_default = 'sqlinformix'
下次编辑 SQL 文件时,Vim 将自动加载以下脚本
ftplugin/sql.vim
syntax/sqlinformix.vim
indent/sql.vim
请注意,indent/sqlinformix.sql 未加载。Informix 没有缩进文件,如果指定的缩进文件不存在,Vim 将加载默认文件。

3. 添加新的 SQL 方言 sql-adding-dialects

如果您开始使用没有默认 Vim 发行版提供的任何自定义项的 SQL 方言,您可以查看 https://www.vim.org 看看是否当前存在任何自定义项。如果没有,您可以从克隆现有脚本开始。有关更多详细信息,请阅读 filetype-plugins
为了帮助识别这些脚本,请尝试使用 "sql" 前缀创建文件。如果您决定要为 SQLite 数据库创建自定义项,您可以创建以下任何内容
Unix
    ~/.config/nvim/syntax/sqlite.vim
    ~/.config/nvim/indent/sqlite.vim
SQLSetType 函数无需进行任何更改。当您发出 SQLSetType 命令时,它将自动拾取新的 SQL 文件并加载它们。
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')<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>
可以使用您的 init.vim 中的以下内容选择使用 "<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                   - 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.
使用 'syntax' 关键字是一个特殊情况。这指示 syntaxcomplete 插件检索所有语法项。因此,这将有效地适用于 Vim 的任何 SQL 语法文件。在撰写本文时,这包括针对 SQL 的不同方言的 10 个不同的语法文件(请参见上面的第 3 节,sql-dialects)。
以下是从语法文件中提取的条目示例
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 动态模式 sql-completion-dynamic

动态模式使用直接来自数据库的数据填充弹出窗口。为了启用动态功能,您必须安装 dbext.vim 插件,(https://vim.sourceforge.net/script.php?script_id=356)。
SQL 完成插件的几个功能都使用动态模式。在安装 dbext 插件后,请参阅 dbext-tutorial 以获取更多配置和使用信息。dbext 插件允许 SQL 完成插件显示表格、过程、视图和列的列表。
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
要在 INSERT 模式下启用弹出窗口,请使用以下键组合来访问各个组(其中<C-C>表示按住 CTRL 键的同时按下空格键):表列表 - <C-C>t
<C-X><C-O>(默认映射假设为表)存储过程列表 - <C-C>p 视图列表 - <C-C>v 列列表 - <C-C>c
向下/向上钻取 - 当查看显示表列表的弹出窗口时,您可以按<Right>,这将用该表的列列表替换当前突出显示的表。
当查看显示列列表的弹出窗口时,您可以按<Left>,这将用表列表替换列列表。
这使您可以快速向下钻取到表以查看其列,然后再返回。
<Right><Left> 也可以通过您的 init.vim 选择。
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) 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).
首先,创建一个新的缓冲区。
:e tutorial.sql
静态功能
为了让您浏览各种列表,只需进入插入模式,然后按:<C-C>s(显示 SQL 语句)此时,您可以向下翻页浏览列表,直到找到“select”。如果您熟悉要查找的项目,例如您知道该语句以字母“s”开头。您可以提前键入(不带引号)“se”,然后按:<C-Space>t 假设“select”在弹出列表中突出显示,按<Enter> 选择该条目。现在输入:* fr<C-C>a(显示所有语法项)从弹出列表中选择“from”。
在编写存储过程时,使用“type”列表非常有用。它包含所有数据库支持类型的列表。这可能是真的,也可能不是真的,具体取决于您使用的语法文件。SQL Anywhere 语法文件 (sqlanywhere.vim) 支持此功能。
BEGIN
   DECLARE customer_id <C-C>T <-- Choose a type from the list
动态功能
要利用动态功能,您必须首先安装 dbext.vim 插件 (https://vim.sourceforge.net/script.php?script_id=356)。它还附带了一个教程。从 SQL 完成插件的角度来看,dbext 提供的主要功能是与数据库的连接。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>。您会注意到没有延迟,因为列列表已缓存。如果您更改了缓存表的模式,您可以按<C-C>R,这将清除 SQL 完成缓存。
注意:<Right><Left> 旨在在完成窗口处于活动状态时工作。如果完成弹出窗口未处于活动状态,则将执行正常的<Right><Left>
让我们看看如何动态构建 SQL 语句。select 语句需要一个列列表。有两种方法可以使用 SQL 完成插件构建列列表。
One column at a time:
1. 键入 SELECT 后,按<C-C>t 以显示表列表。 2. 从列表中选择一个表。 3. 按<Right> 以显示列列表。 4. 从列表中选择列,然后按回车键。 5. 输入“,” 并按<C-C>c。生成列列表通常需要将光标放在表名上。插件使用此名称来确定要检索哪个表的列列表。在此步骤中,因为我们是在没有将光标放在表名上的情况下按<C-C>c,所以显示的列列表将是前一个表的。选择另一个列,然后继续。 6. 根据需要重复步骤 5。
All columns for a table:
1. 键入 SELECT 后,按<C-C>t 以显示表列表。 2. 突出显示您需要列列表的表。 3. 按<Enter> 从列表中选择该表。 4. 按<C-C>l 以请求该表的全部列的逗号分隔列表。 5. 基于步骤 3 中选择的表名,插件尝试确定一个合理的表别名。然后系统会提示您接受或更改别名。按确定。 6. 表名将替换为该表的列列表,将替换为逗号分隔的列列表,每个列前面都有别名。 7. 步骤 3 和 4 可以用按<C-C>L 替换,该映射中嵌入<C-Y> 以选择列表中当前突出显示的表。
编写 select 语句时有一个特殊规定。考虑以下语句。
select *
  from customer c,
       contact cn,
       department as dp,
       employee e,
       site_options so
 where c.
在 INSERT 模式下键入最后一个“c.”(它是“customer”表的别名)之后,您可以按<C-C>c 或<C-X><C-O>。这将弹出客户表列列表。它是通过回顾 select 语句的开头并找到在 FROM 子句中指定的表的列表来实现的。在本例中,它注意到在字符串“customer c”中,“c”是客户表的别名。可选的“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

SQL 完成插件可以通过在您的 init.vim 中设置的各种选项来自定义。
omni_sql_no_default_maps
默认值:此变量未定义。
如果定义了此变量,则不会为 OMNI 完成创建任何映射。有关更详细的讨论,请参阅 sql-completion-maps。> omni_sql_use_tbl_alias
默认值:a
此设置仅在生成逗号分隔的列列表时使用。默认情况下,映射是<C-C>l。在生成列列表时,可以在每个列的开头加上别名,例如:e.emp_id、e.emp_name。此选项有三个设置。
n - do not use an alias
d - use the default (calculated) alias
a - ask to confirm the alias name
别名是根据以下几个规则确定的: 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
默认值:0,除非安装了 dbext.vim 3.00。
有效设置是 0 或 1。
在完成表、过程或视图并使用 dbext.vim 3.00 或更高版本时,对象列表中还将包含所有者名称。在完成这些对象并启用 omni_sql_include_owner 时,将替换所有者名称。
omni_sql_precache_syntax_groups
默认值:['syntax','sqlKeyword','sqlFunction','sqlOption','sqlType','sqlStatement']
sqlcomplete 可以与其他完成插件一起使用。这在 sql-completion-filetypes 中有说明。当文件类型暂时更改为 SQL 时,sqlcompletion 插件将缓存在此选项中指定的列表中列出的语法组。

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>
显示完成窗口中当前突出显示表的列列表。<Right> 在大多数 Unix 系统上不被识别,因此此映射仅在 Windows 平台上创建。如果您想在 Unix 上拥有相同的功能,请选择不同的键并在您的 vimrc 中创建相同的映射。
<Left>
显示表格列表。<Left> 在大多数 Unix 系统上不被识别,因此此映射仅在 Windows 平台上创建。如果你希望在 Unix 上使用相同的功能,请选择一个不同的键并在你的 vimrc 中创建相同的映射。
<C-C>R
此映射删除所有缓存项并强制 SQL 完成重新生成项目列表。
自定义映射
你可以创建任意数量的额外键映射。通常,这些映射将指定不同的语法高亮组。
如果你不希望创建默认映射或键选择不适用于你的平台(通常在 unix 上),你可以在你的 init.vim 中定义以下变量
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 和 unix 平台上都能正常工作。在 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 语法项目的 omni 弹出窗口。
步骤 2
手动将文件类型设置为“sql”也会触发相应的文件类型文件 ftplugin/sql.vim。此文件将定义许多针对 SQL 完成的缓冲区特定映射,参见 sql-completion-maps。现在,这些映射已经创建,并且 SQL 完成插件已初始化。所有 SQL 语法项目已缓存以备使用。SQL 文件类型脚本检测到我们正在尝试使用两个不同的完成插件。由于 SQL 映射以 <C-C> 开头,因此这些映射将在使用时切换 'omnifunc'。因此,你可以使用 <C-X><C-O> 继续使用 Perl 的完成(使用语法完成插件)和 <C-C> 来使用 SQL 完成功能。
步骤 3
将文件类型设置回 Perl 会将所有通常与“perl”相关的项目恢复到最初状态。
主要
命令索引
快速参考