【问题标题】:How to make Sublime Text 3 indent newlines when caret is inside brackets (or other symbols)当插入符号在括号(或其他符号)内时如何使 Sublime Text 3 缩进换行符
【发布时间】:2017-02-05 15:37:44
【问题描述】:

要自定义 Sublime Text 关于何时缩进换行符的行为,根据当前行,可以更改 whatever.tmPreferences 文件,适当地设置 increaseIndentPatterndecreaseIndentPattern 选项,如 this other answer 中所示。

但是,我似乎无法弄清楚如何生成以下行为:给定一行

[<cursor here>]

光标在方括号之间,按enter 我想要以下结果:

[
    <cursor here>
]

例如,当修改 xml 文件时,在两个括号之间按 Enter 键时会发生这种情况,例如在 &lt;sometag&gt;&lt;cursor here&gt;&lt;/sometag&gt; 中。

我试图查看 tmPreferences 文件中的 xml,但无济于事。

here 也有人问过类似的问题,但由于以下几个原因,现在的问题有所不同:

  1. 我希望此行为仅针对特定文件扩展名实现, 随包一起提供。所以我也在问我应该把这个自定义键绑定的说明放在哪里。
  2. 在链接的问题中,问题更简单:在某种大括号之间正确添加和缩进换行符。 (对我来说)如何概括这种行为并不简单,就像上面引用的示例一样,我们希望在类似 XML 的标签之间有一个换行符,因为在这种情况下,我们将不得不以某种方式处理正则表达式 验证左右模式是否匹配。

如何实现这种行为?

【问题讨论】:

  • @KeithHall 感谢您的链接。这确实非常相关,但并不是一个直接的答案。例如,在帖子中显示的xml 的情况下,我在PackagesXML 文件夹中找不到任何.sublime-keymap 文件,所以我不确定该键绑定的设置位置。
  • 您的用户键绑定始终在您的 User 包中,它们不在与您要使用它们的位置相关的包中。为了使绑定作为链接仅适用于 XML 文件,您只需要添加一个额外的上下文来检查它是否是 XML 文件。以默认键绑定文件中的最后一个绑定为例。
  • @OdatNurd 很好,但这并不总是正确的,是吗?只需查看为某些目标文件类型集成了许多自定义键绑定的任何已安装包。
  • 是的,但您最初并没有提到您想将它与插件一起发布。 ;)

标签: sublimetext3 sublime-text-plugin


【解决方案1】:

要制作将随包一起提供的键绑定,请创建 a Default.sublime-keymap file in your package

通常,Sublime Text 会查看用于突出显示文档的语法,而不是使用的文件扩展名,以确定键绑定/插件是否应该处于活动状态等。这主要是为了它可以在没有的文件上工作还没有被保存。如果您想遵循此指南,可以使用 selector 键绑定上下文。对于 XML 文件,您可能希望使用 source.xml。否则,您将需要创建一个EventListener,它定义了一个on_query_context 方法来检查view.file_name()。您可以使用os.path.splitext 方法来检索文件扩展名。

如果您真的在处理 XML,那么您可以使用默认的 auto_indent_tag 键绑定作为灵感:

{ "keys": ["enter"], "command": "auto_indent_tag", "context":
    [
        { "key": "setting.auto_indent", "operator": "equal", "operand": true },
        { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true },
        { "key": "selector", "operator": "equal", "operand": "punctuation.definition.tag.begin", "match_all": true },
        { "key": "preceding_text", "operator": "regex_contains", "operand": ">$", "match_all": true },
        { "key": "following_text", "operator": "regex_contains", "operand": "^</", "match_all": true },
    ]
},

构建类似的东西:

{ "keys": ["enter"], "command": "insert_snippet", "args": { "contents": "\n\t$1\n" }, "context":
    [
        { "key": "setting.auto_indent", "operator": "equal", "operand": true },
        { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true },
        { "key": "selector", "operator": "equal", "operand": "text.xml punctuation.definition.tag.begin", "match_all": true },
        { "key": "preceding_text", "operator": "regex_contains", "operand": ">$", "match_all": true },
        { "key": "following_text", "operator": "regex_contains", "operand": "^</", "match_all": true },
    ]
},

这里使用的正则表达式非常简单,只检查插入符号之前的文本是&gt;,插入符号之后的文本是&lt;/。这是可能的,因为selector 会检查 a) 我们使用的是 XML 语法,并且 b) 插入符号之后的文本的作用域为 punctuation.definition.tag.begin。 (您可以从工具菜单 -> 开发人员 -> 显示范围名称立即手动检查插入符号右侧的范围。)如果您使用自定义语法,则需要确保相应地调整这些。

在这种情况下,因为我们在 Enter 键上使用了键绑定,所以 tmPreferences 文件中指定的缩进规则将被忽略。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-02
    • 2015-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多