代码补全

Sublime Text 提供了几种方法来节省输入时间,可以通过补全单词或插入样板代码来实现。代码补全包括以下来源:

  • 当前文件中的单词

  • 上下文感知建议 4050

  • 补全文件

  • 代码片段文件

  • 插件

存在各种设置来自定义代码补全的行为。用户可以编写自己的代码片段或补全文件,并且有许多第三方包可以提供代码补全。

用法🔗

默认情况下,当用户编辑源代码或标记时,Sublime Text 会自动显示代码补全弹出窗口,但在注释、字符串或标记中的散文内不会显示。

Esc 键将隐藏代码补全弹出窗口。要手动显示代码补全弹出窗口,请按 Ctrl+空格如果没有可用的代码补全,状态栏中将显示消息 无可用代码补全

上下文感知建议🔗

Sublime Text 中的代码补全引擎使用后台进程扫描项目中的所有文件,以构建代码补全索引。此索引用于根据现有代码中的模式向用户提供建议的代码补全。

一些例子

  • 如果某个属性经常被设置为布尔值,则建议将包括 truefalse

  • 如果标识符通常被“调用”,则会建议使用附加了 () 的名称。

提供的具体代码补全基于各种启发式方法,并来自项目中的现有代码。 由于代码补全是基于对现有代码的分析,因此不会建议项目中未使用的单词。

4050

补全元数据🔗

除了文本内容之外,代码补全还可以向用户提供其他详细信息。这些信息包括代码补全表示的元素的*类型*、一个简短的*注释*以帮助选择代码补全,以及可能包含指向其他资源的链接的*详细信息*。

类型信息
f apply()
s application
m absolute()
s acls 抽象类 注释
c agent
结构体 2 个定义 详细信息

类型信息🔗

代码补全可以提供*类型*信息,以便与代码补全触发器一起显示。这包括一个高级类别、一个标识字母和一个名称。以下是一些最常见的类型:

图标 名称
k 关键字
t 类型
f 函数
a 命名空间
n 导航
m 标记
v 变量
s 代码片段

在本说明文档和 Sublime Text 中,将鼠标悬停在类型字母上将显示一个包含完整名称的工具提示。类型元数据的颜色由主题决定,可能与上面显示的不同。

.sublime-completions 文件和插件可以使用上面列出的任何类别的组合,以及任何 Unicode 字符和名称来进行自定义显示。

注释🔗

注释显示在代码补全弹出窗口的右侧边缘,可能包含作者认为有用的任何信息。通常,注释只有一两个字。

详细信息🔗

代码补全的 details 字段可能包含带有链接的富文本描述。当选择代码补全时,代码补全的详细信息将显示在代码补全弹出窗口的底部。

4050

自定义🔗

有许多方法可以使用新的代码补全来增强引擎的功能:

完成文件🔗

向 Sublime Text 添加自动完成的最基本形式是创建一个 .sublime-completions 文件。自动完成文件使用 JSON 格式,并包含一个带有 "scope""completions" 键的对象。

"scope" 键的值是一个字符串,其中包含自动完成适用的语法的 选择器"completions" 值是一个自动完成数组。数组中的每个条目都表示一个自动完成,可以是字符串或对象。

简单格式🔗

当自动完成是一个字符串时,该字符串同时表示触发文本和自动完成内容。

一个基本的 .sublime-completions 文件

{
    "scope": "source.python",
    "completions": [
        "def",
        "class",
        "None",
        "True",
        "False"
    ]
}

丰富格式🔗

当自动完成是一个对象时,有效的键包括

"trigger" 字符串 (必填)🔗

用户必须输入以匹配自动完成的文本。

"contents" 字符串 (必填)🔗

将插入到文件中的内容。支持代码片段 字段变量

"annotation" 字符串🔗
4073

要为自动完成显示的注释。

"kind" 字符串, 3 个字符串的数组🔗
4073

自动完成的类型元数据。

如果该值是一个字符串,则它必须是以下之一

  • "ambiguous"

  • "function"

  • "keyword"

  • "markup"

  • "namespace"

  • "navigation"

  • "snippet"

  • "type"

  • "variable"

示例: "kind": "function"

如果该值是一个包含 3 个字符串的数组,则它们必须是

  1. 上面列表中的一个字符串,主题使用它来选择类型元数据的颜色

  2. 要显示在触发器左侧的单个 Unicode 字符

  3. 类型的描述,可在类型字母工具提示和详细信息窗格(可见时)中查看

示例: "kind": ["function", "m", "Method"]

"details" 字符串🔗
4073

自动完成的单行描述。可以包含以下 HTML 标签以进行基本格式化

除上面列出的内容外,不支持任何其他属性或标签。

示例: "details": "使用 <code>&lt;b&gt;</code> 标签包裹选区"

一个包含每个字段示例的 .sublime-completions 文件

{
    "scope": "source.python",
    "completions": [
        {
            "trigger": "def",
            "contents": "def",
            "kind": "keyword"
        },
        {
            "trigger": "fun",
            "annotation": "basic function",
            "contents": "def ${1:name}($2):\n    $0\n",
            "kind": "snippet",
            "details": "A simple, non-<code>async</code> function definition"
        }
    ]
}

代码片段🔗

代码片段通常用于样板类型的内容,这些内容由于跨越多行,因此不容易使用 .sublime-completions 格式编写。

代码片段是扩展名为 .sublime-snippet 的 XML 文件。它们有一个顶级标签 <snippet>,其中包含以下标签

scope

应为其启用代码段的语法的 选择器

tabTrigger

用于在完成弹出窗口中匹配代码段的文本

contents

应用代码段时要插入到文档中的文本。支持代码段 字段变量

通常,此标签的内容包含在 <![CDATA[]]> 中,因此内容不需要进行 XML 转义。

description

代码段的可选描述,显示在“命令面板”中。

示例 .sublime-snippet 文件

<snippet>
    <scope>source.python</scope>
    <tabTrigger>fun</tabTrigger>
    <content><![CDATA[def ${1:name}($2):
    ${0:pass}]]></content>
    <description>function, non-async</description>
</snippet>

字段🔗

代码片段支持“字段”,即用户在插入代码片段后可以按 Tab 键遍历的代码片段中的位置。字段可以是简单的位置,但也可以提供默认内容。

简单字段是一个 $ 后跟一个整数。字段 $0 是完成代码段后选择将放置的位置。字段 $1$n 在移动到 $0 之前都会被填充。

Name: $1
Email: $2
Description: $0

具有默认内容的字段使用格式 ${1:default text}。默认内容可以是文本,也可以包含 变量

Name: ${1:first} ${2:last}
Email: ${3:user}@${4:example.com}

如果代码段不包含字段 $0,则会在末尾隐式添加它。

变量🔗

以下变量可以添加到代码段中,以包含来自插入代码段的文件的信息

变量

描述

$SELECTION

当前选择

$TM_SELECTED_TEXT

当前选择

$TM_LINE_INDEX

当前行的从 0 开始的行号

$TM_LINE_NUMBER

当前行的从 1 开始的行号

$TM_DIRECTORY

包含文件的目录的路径

$TM_FILEPATH

文件的路径

$TM_FILENAME

文件的文件名

$TM_CURRENT_WORD

当前单词的内容

$TM_CURRENT_LINE

当前行的内容

$TM_TAB_SIZE

每个制表符的空格数

$TM_SOFT_TABS

YESNO - 如果制表符应转换为空格

$TM_SCOPE

文件语法的基本范围名称

除了上面命名的变量之外,字段也可以用作变量,允许用户输入单个值并在多个地方重复使用它。

Name: ${1:first} ${2:last}
Email: ${3:$1}@${4:example.com}

变量替换🔗

可以直接引用变量,也可以使用正则表达式修改变量。带有替换的变量以 ${name/regex/replace/flags} 格式编写。

“regex”段支持 正则表达式。“replace”段支持相应的 替换格式。“flags”段将包含以下字母中的零个:

  • g - 应替换所有匹配项,而不仅仅是第一个匹配项

  • i - 不区分大小写匹配

  • m - 多行模式,其中 ^ 匹配每行的开头

通常情况下,变量替换会与引用字段的数字变量结合使用。

以下示例使用第一个字段作为第二个字段的默认内容,删除第一个空格及其后的所有内容

Name: ${1:name}
Email: ${2:${1/\s.*//}}@${3:example.com}

转义🔗

由于代码片段可以包含以 $ 开头的变量,因此文本 $ 字符必须写成 \$

执行变量替换时,文本 / 字符必须写成 \/。*

插件🔗

添加补全的最强大的工具是 Python 插件。

编写插件以提供补全涉及实现 EventListener.on_query_completions()ViewEventListener.on_query_completions()

import sublime
import sublime_plugin


class MyCompletions(sublime_plugin.EventListener):
    def on_query_completions(self, view, prefix, locations):
        if not view.match_selector(locations[0], "source.python"):
            return []

        available_completions = [
            "def",
            "class",
            "None",
            "True",
            "False"
        ]

        prefix = prefix.lower()

        out = []
        for comp in available_completions:
            if comp.lower().startswith(prefix):
                out.append(comp)

        return out

on_query_completions() 可以通过返回 sublime.CompletionList 对象来提供异步补全。

补全详细信息(包括种类元数据)由 on_query_completions() 返回 sublime.CompletionItem 对象提供。

4050

设置🔗

"tab_completion" 布尔值🔗

启用后,按 Tab 键将插入最佳匹配的补全。禁用后,Tab 键将仅触发代码片段或插入制表符。启用 tab_completion 后,可以使用 Shift+Tab 插入显式制表符。

禁用此设置不会隐式禁用 auto_complete

"auto_complete" 布尔值🔗

键入时自动显示补全弹出窗口。

此行为不受设置 tab_completion 的影响。

"auto_complete_size_limit" 整数🔗

如果当前文件的字节大小大于此值,则不会自动显示补全弹出窗口。

"auto_complete_delay" 整数🔗

自动显示补全弹出窗口之前的等待时间(以毫秒为单位)。

"auto_complete_selector" 字符串🔗

选择器,用于限制自动显示补全弹出窗口的时间。

示例: "meta.tag, source - comment - string.quoted.double.block - string.quoted.single.block - string.unquoted.heredoc"

"auto_complete_triggers" 设置可用于在特定情况下重新启用自动补全弹出窗口。

"auto_complete_triggers" 对象数组🔗

提供何时自动显示自动完成弹出窗口的显式触发器。

每个对象必须包含键 "selector",其字符串值包含要与插入符号位置匹配的 选择器,以及一个 "characters" 键,其字符串值指定插入符号左侧必须存在的字符。

示例

[
    {
        "selector": "text.html",
        "characters": "<"
    }
]

触发器将覆盖设置 auto_complete_selector

"auto_complete_commit_on_tab" 布尔值🔗

默认情况下,自动完成功能在按下 Enter 时提交当前完成的内容。此设置可用于使其在按下 Tab 时完成。

Tab 上完成通常是更好的选择,因为它消除了提交完成内容和插入换行符之间的歧义。

"auto_complete_with_fields" 布尔值🔗

控制在代码段字段处于活动状态时是否自动显示自动完成弹出窗口。仅在启用 auto_complete_commit_on_tab 时才相关。

"auto_complete_cycle" 布尔值🔗

控制在选中自动完成弹出窗口中的第一项时按下 会发生什么:如果为 false,则隐藏弹出窗口,否则选中弹出窗口中的最后一项完成内容。

还会导致在最后一项完成内容上按下 时选中第一项完成内容。

"auto_complete_use_history" 布尔值🔗

是否应自动选择以前选择的完成内容。

"auto_complete_use_index" 布尔值🔗
4052

启用后,自动完成弹出窗口将根据项目中的其他文件显示上下文相关的建议。

"auto_complete_preserve_order" 字符串🔗
4052

控制在键入时如何对自动完成结果重新排序

  • "none" – 根据完成内容与键入文本的匹配程度完全重新排序结果

  • "some" – 部分重新排序结果,同时考虑完成内容与键入内容的匹配程度以及完成内容的可能性

  • "strict" – 从不重新排序结果

"auto_complete_trailing_symbols" 布尔值🔗
4050

如果完成引擎认为尾随符号(例如,.())的可能性足够大,则添加它们。

"auto_complete_trailing_spaces" 布尔值🔗
4050

如果完成引擎认为完成内容后跟空格的可能性足够大,则添加空格。

"auto_complete_include_snippets" 布尔值🔗
4050

控制是否在自动完成弹出窗口中包含代码段。

当禁用时,仍然可以通过键入代码段的触发器并在完成弹出窗口未显示时按 Tab 键来触发代码段。

"auto_complete_include_snippets_when_typing" 布尔值🔗
.. since:: 4052

当此设置为 false 时,代码段不会出现在自动触发的完成弹出窗口中。如果手动触发,它们将显示。

"ignored_snippets" 字符串 数组🔗
4050

文件模式 指定要忽略的代码段文件。

例如,要忽略所有默认的 C++ 代码段

[
    "C++/*"
]