【问题标题】:How to override Sublime Text 3 Package's (CSS3) completion syntax如何覆盖 Sublime Text 3 包的 (CSS3) 完成语法
【发布时间】:2020-01-07 20:28:36
【问题描述】:

我正在使用带有 Sublime Text 3 的 CSS3 包。

我试图在键入 CSS 属性时覆盖该行为。例如,给定以下内容:

body {
  | <- insertion point
}

如果我输入background 并按Tab,结果将是background:,这是我想要的。

如果我输入background:,在我输入冒号的那一刻,该行变为background: ;,插入点在分号之前。我不想要这个,因为我自己总是在冒号后面输入一个空格,最后在那里有两个空格。我不想重新训练我的肌肉记忆,因为我所有的其他编辑环境都不会自动添加空格。

我真的很想弄清楚如何覆盖这种完成行为。

我已尝试编辑 CSS3 包内的 completions/properties.py 文件,但这似乎不是此完成的来源。不幸的是,我不太了解 ST 包是如何组合在一起的。

【问题讨论】:

    标签: sublimetext3


    【解决方案1】:

    来自completions/properties.py 的补全被包的on_query_completions 处理程序使用,Sublime 使用它来填充自动补全弹出窗口。因此,修改那里的内容(并重新启动 Sublime 以便重新加载包)将改变自动完成弹出窗口中提供的内容(或者在正确的情况下可以自动选择作为最佳完成的内容)。

        ("background", "background: ${1};"),
    

    这指定background 的自动完成触发器应该扩展为属性名称后跟一个冒号和一个空格,并且光标留在${1},所以类似于backTab 扩展到background: |;;如果您想添加或修改这些类型的完成,这里就是修改的地方。

    另一方面,您遇到的问题是按下 : 是触发插入空间的原因。这实际上根本不是与自动完成相关的东西,尽管从外观上看并不完全明显。

    如果您打开命令日志记录(View &gt; Show Consolesublime.log_commands(True))并按照上述步骤操作,当您按 时: 您会在控制台中看到:

    command: insert_snippet {"contents": ": $0;"}
    

    这表明有一个键绑定可以为您执行此操作。使用命令面板中的View Package File 并使用css3 keymap 过滤将让您打开CSS3/Default.sublime-keymap,其中第一个键绑定就是这样做的:

        { "keys": [":"], "command": "insert_snippet", "args": {"contents": ": $0;"}, "context":
            [
                { "key": "setting.auto_match_enabled", "operator": "equal", "operand": true },
                { "key": "selection_empty", "operator": "equal", "operand": true, "match_all": true },
                { "key": "selector", "operator": "equal", "operand": "meta.declaration-list.css, meta.at-rule.color-profile.block.css, meta.at-rule.counter-style.block.css, meta.at-rule.font-face.block.css, meta.font-feature-type-block.css, meta.at-rule.font-palette-values.block.css, meta.at-rule.page.block.css -meta.page-margin-box.css, meta.at-rule.viewport.block.css", "match_all": true },
                { "key": "selector", "operator": "not_equal", "operand": "meta.selector.css", "match_all": true },
                { "key": "following_text", "operator": "regex_contains", "operand": "^(?:\t| |\\}|$)", "match_all": true }
            ]
        },
    

    应用于此绑定的context 确保它在这种特定情况下触发,并且它手动触发insert_snippet 命令为您插入空格和分号。

    为了阻止它执行此操作,请将该文件中的绑定复制到您自己的键绑定文件中,并将contents 更改为不包含您不想要的空间。

    我不使用这个包,但基于context 中的范围选择器,这可以在几个不同的实例中触发,而不仅仅是在这个实例中;在所有情况下,它也会导致插入空间。

    如果您的肌肉记忆总是在输入: 时插入空格,那么这没什么大不了的;如果是,那么您需要更改复制的绑定以更改 selector 上下文行,以便它们仅在您编辑属性时匹配。这将导致 Sublime 在这种情况下选择您的键绑定,但在其他情况下回退到包中的那个。

    【讨论】:

    • 是的!多么棒的答案——谢谢。 sublime.log_commands(True) 小费会派上用场的。
    • 巨大的答案,花了几个小时寻找解决方案。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-21
    • 2013-07-05
    • 1970-01-01
    相关资源
    最近更新 更多