代码补全
版
Sublime Text 提供了几种方法来节省输入时间,可以通过补全单词或插入样板代码来实现。代码补全包括以下来源:
当前文件中的单词
上下文感知建议 4050
补全文件
代码片段文件
插件
存在各种设置来自定义代码补全的行为。用户可以编写自己的代码片段或补全文件,并且有许多第三方包可以提供代码补全。
用法🔗
默认情况下,当用户编辑源代码或标记时,Sublime Text 会自动显示代码补全弹出窗口,但在注释、字符串或标记中的散文内不会显示。
按 Esc 键将隐藏代码补全弹出窗口。要手动显示代码补全弹出窗口,请按 Ctrl+空格。 如果没有可用的代码补全,状态栏中将显示消息 无可用代码补全
。
上下文感知建议🔗
Sublime Text 中的代码补全引擎使用后台进程扫描项目中的所有文件,以构建代码补全索引。此索引用于根据现有代码中的模式向用户提供建议的代码补全。
一些例子
如果某个属性经常被设置为布尔值,则建议将包括
true
或false
。如果标识符通常被“调用”,则会建议使用附加了
()
的名称。
提供的具体代码补全基于各种启发式方法,并来自项目中的现有代码。 由于代码补全是基于对现有代码的分析,因此不会建议项目中未使用的单词。
补全元数据🔗
除了文本内容之外,代码补全还可以向用户提供其他详细信息。这些信息包括代码补全表示的元素的*类型*、一个简短的*注释*以帮助选择代码补全,以及可能包含指向其他资源的链接的*详细信息*。
类型信息 | |||
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
字段可能包含带有链接的富文本描述。当选择代码补全时,代码补全的详细信息将显示在代码补全弹出窗口的底部。
自定义🔗
有许多方法可以使用新的代码补全来增强引擎的功能:
完成文件🔗
向 Sublime Text 添加自动完成的最基本形式是创建一个 .sublime-completions 文件。自动完成文件使用 JSON 格式,并包含一个带有 "scope"
和 "completions"
键的对象。
"scope"
键的值是一个字符串,其中包含自动完成适用的语法的 选择器。"completions"
值是一个自动完成数组。数组中的每个条目都表示一个自动完成,可以是字符串或对象。
简单格式🔗
当自动完成是一个字符串时,该字符串同时表示触发文本和自动完成内容。
一个基本的 .sublime-completions 文件
{
"scope": "source.python",
"completions": [
"def",
"class",
"None",
"True",
"False"
]
}
丰富格式🔗
当自动完成是一个对象时,有效的键包括
- "trigger" 字符串 (必填)🔗
用户必须输入以匹配自动完成的文本。
- "annotation" 字符串🔗 4073
要为自动完成显示的注释。
- "kind" 字符串, 3 个字符串的数组🔗 4073
自动完成的类型元数据。
如果该值是一个字符串,则它必须是以下之一
"ambiguous"
"function"
"keyword"
"markup"
"namespace"
"navigation"
"snippet"
"type"
"variable"
示例:
"kind": "function"
如果该值是一个包含 3 个字符串的数组,则它们必须是
上面列表中的一个字符串,主题使用它来选择类型元数据的颜色
要显示在触发器左侧的单个 Unicode 字符
类型的描述,可在类型字母工具提示和详细信息窗格(可见时)中查看
示例:
"kind": ["function", "m", "Method"]
- "details" 字符串🔗 4073
自动完成的单行描述。可以包含以下 HTML 标签以进行基本格式化
<a href="">
– minihtml 协议<b>
<strong>
<i>
<em>
<u>
<tt>
<code>
除上面列出的内容外,不支持任何其他属性或标签。
示例:
"details": "使用 <code><b></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
用于在完成弹出窗口中匹配代码段的文本
- 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
,则会在末尾隐式添加它。
变量🔗
以下变量可以添加到代码段中,以包含来自插入代码段的文件的信息
变量 |
描述 |
---|---|
|
当前选择 |
|
当前选择 |
|
当前行的从 0 开始的行号 |
|
当前行的从 1 开始的行号 |
|
包含文件的目录的路径 |
|
文件的路径 |
|
文件的文件名 |
|
当前单词的内容 |
|
当前行的内容 |
|
每个制表符的空格数 |
|
|
|
文件语法的基本范围名称 |
除了上面命名的变量之外,字段也可以用作变量,允许用户输入单个值并在多个地方重复使用它。
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
对象提供。
设置🔗
- "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
时,代码段不会出现在自动触发的完成弹出窗口中。如果手动触发,它们将显示。