如何添加自动完成 Sublime Text 3

How to add auto-complete Sublime Text 3

我想添加自定义的自动完成键绑定,就像内置的一样:

示例:html+tab 自动完成 Doctype 块。

我尝试添加 html 自定义键绑定:键入 c + o + l + tab 以生成 <div class="col-">

首选项 > 键绑定 > 默认 (OSX).sublime-keymap -- 用户

{"keys": ["c+o+l+tab"], "command": "insert_snippet", "args": {"contents": "<div class=\"col-[=13=]\">"}},
但是,有两个问题:

  1. 新的键绑定覆盖所有其他自动完成
  2. 初始col或字符保留在前面 生成的标签。 col<div class="col-">

添加此类键绑定的正确方法是什么?

执行此类操作的正确方法是使用 snippets or completions。虽然有一些差异,但总的来说它们最终的工作方式是一样的,你选择哪一个取决于你想要创建多少这样的项目以及你希望它们有多复杂。

使用代码片段,您可以从菜单中 select Tools > Developer > New Snippet... 并填写代码片段模板,然后将其另存为 sublime-snippet 文件,保存在 Sublime 默认的位置(这是你的 User 包)。

例如,根据您问题中的示例,可能如下所示:

<snippet>
    <content><![CDATA[
<div class="col-[=10=]">
]]></content>
    <description>Insert DIV with column class</description>
    <tabTrigger>col</tabTrigger>
    <scope>text.html</scope>
</snippet>

片段采用 XML 格式,![CDATA[]] 之间的所有内容都被插入缓冲区(即使您认为自己不删除 CDATA,也不要删除'需要它;如果您需要,Sublime 将忽略该代码段​​)。

tabTrigger 指定您希望作为代码段触发器的文本,scope 说明代码段应在何种文件中触发,description 将显示在 auto-completions 面板中的片段旁边。

在代码片段中,tabTriggerscopedescription 都是可选的。如果您不指定 tabTrigger,您只能从命令面板或通过 insert_snippet 命令(例如在键绑定中)展开代码段。没有 scope 代码段适用于所有地方,没有 description 它在面板中没有描述。

如果您有很多这样的项目要为其添加代码段,您也可以改用补全。这些存储在扩展名为 sublime-completions 的 JSON 文件中,应该保存在您的 User 包中(如果您不知道它在哪里,请使用 Preferences > Browse Packages...

此类文件的示例为:

{
    "scope": "text.html",

    "completions": [
        { "trigger": "col\tInsert DIV with column class", "contents": "<div class=\"col-[=11=]\">" },
    ]
}

在这种格式中,trigger 始终是要触发的文本,并且描述(仍然是可选的)通过 trigger 键中的 \t 字符与触发器分隔。

在完成中,您只在顶部指定一次范围,而不是每次都指定范围,但是完成和片段之间存在一些功能差异。

  1. 每个 sublime-snippet 文件只能有一个片段,但是 sublime-completions 文件可以在一个文件中包含多个完成; completions 键是一个数组,因此您可以在同一个文件中放置多个补全。

  2. 补全是JSON,因此多行或包含JSON个特定字符(例如"字符)的内容更难输入;完成更适合较短的序列,而片段更适合更复杂的事情。

  3. 当自动完成触发时,如果有一个completion和一个snippet可以自动完成,snipptets总是"win"并被插入,而完成周期。这意味着例如在这个特定示例中,您需要按 Tab 两次,因为 col 也是标签的名称。

  4. 片段会自动出现在命令面板中(当它们应用时),但完成不会。在命令面板中,片段显示为类似 Snippet: Something 的命令,其中 Somethingdescription(如果存在),如果不存在则为文件名。

无论哪种情况,您都可以通过应用 scope 使 snippet/completion 仅适用于某些类型的文件;要确定适当的范围,请将光标定位在文件中适当的位置,然后 select Tools > Developer > Show Scope Name...;您使用的显示范围越多,它就变得越具体。通常只需要顶层,例如 text.html,除非您正在做一些特别的事情。