根据文件类型有条件地设置键绑定

时间:2017-10-26 15:34:38

标签: sublimetext3

我想使用相同的键映射来运行不同的命令,具体取决于Sublime Text 3中当前正在编辑的文件类型。我在context中使用.sublime-keymap来控制它?

例如:

{
   "keys": ["super+shift+h"],
   "context": ?????, // --> want this for .vue files
   "command": "htmlprettify"
},
{
   "keys": ["super+shift+h"],
   "context": ?????, // --> want this for all other files
   "command": "js_prettier"
}

......还是有比上下文更好/更简单的方法吗?

(我可以这样做,它会运行两个命令,但我需要它是一个或另一个。)

{
    "keys": ["super+shift+h"],
    "commands": [
        {"command": "htmlprettify"}, {"command": "js_prettier"}
    ]
},

1 个答案:

答案 0 :(得分:1)

是的,您需要使用context。也可以定义自己的自定义命令来检测您正在编辑的文件类型并执行不同的操作,但这仍然依赖于相同的检查机制并且更复杂,因此更容易,并且意图更清晰直接在键绑定中直接执行。

您想要的上下文将使用selector键来检查当前光标位置的范围是否与您当前正在编辑的文件类型相关。

例如,我在自定义键绑定中使用此键绑定,以便在编辑Markdown文件时包装文本的键始终包含在79列,即使我将标尺设置为80列。

{
    "keys": ["alt+q"], 
    "command": "wrap_lines", 
    "args": {"width": 79}, 
    "context": [
        { 
            "key": "selector", 
            "operator": "equal", 
            "operand": "text.html.markdown"
        }
    ]
},

为了知道在operand部分放置的范围,您可以使用菜单中的Tools > Developer > Show Scope Name命令(或相关的键绑定,您可以通过查看菜单看到)当光标位于您希望键绑定工作的位置时。

根据光标在文件中的位置,范围将更具体到文件中的特定位置,并且您使用的范围越多,键绑定就越具体。

例如,此处的范围是text.html.markdown;如果我只使用text,它将适用于所有文本文件(纯文本,任何HTML文件等),而使用text.html只会将其限制为HTML文件和降价文件。

对于希望命令在所有其他类型的文件中工作的情况,您根本不需要使用任何上下文。如果没有上下文,除非与上下文的另一个绑定更具体地针对当前情况,否则密钥绑定在全局始终可用

这就是为什么在上面的情况下我可以将 Alt + Q 键绑定到此命令,并使其在Markdown文件中的工作方式不同,但在所有其他情况下它只会执行它通常做什么。

[编辑]

正如您在下面的评论中所提到的,我忘了提及关键绑定的顺序是相关的,尽管这并不总是完全明显的(如上例所示)。

根据Unofficial Documentation上的Key Bindings

  

键盘映射文件中的键绑定从底部到顶部进行评估。第一个匹配的上下文获胜。

因此,如果您要使用相同键的多个绑定,则需要将最通用的一个放在文件中,最具体的放在最后一个,这样当Sublime遍历匹配绑定列表时,只有当没有更具体的适用时,它才能击中通用的。

作为一个人为的例子,下面的一组键绑定使得 Alt + F1 键在Lua源文件中插入的文本与所有其他文件中的文本不同。如果订单相反,则首先找到全局密钥(并始终匹配):

{
    "keys": ["alt+f1"], "command": "insert", "args": {
        "characters": "The Global Key Binding"
    }
},

{
    "keys": ["alt+f1"], "command": "insert", "args": {
        "characters": "The Lua Key Binding"
    },
    "context": [
        { "key": "selector", "operator": "equal", "operand": "source.lua" },
    ],
},

另请注意,Sublime中的许多资源(包括sublime-keymap)可以在多个包中指定,这会导致Sublime将所有类似命名的文件组合在一起。

这种情况发生in a specific order,大致概括为DefaultUser最后,以及其他所有内容(请参阅链接以获取完整详情)。

您的自定义键绑定始终位于User包中,因此最后加载,这意味着您可以始终安全地覆盖任何内容并使订单符合您的预期。

在某些情况下,您可能安装了一个软件包,其密钥的默认绑定包含一个上下文,并且您希望以更全局的方式重用该密钥,同时不会干扰软件包密钥绑定。

在这些情况下,您需要将默认绑定复制到您自己的用户键绑定以及进行自定义绑定,以便确保排序仍然正确。

然而,这可能是一种非常罕见的情况。