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

问题描述 投票:0回答:2

我想使用相同的按键映射来运行不同的命令,具体取决于当前在 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"
}

...或者有没有比上下文更好/更简单的方法来做到这一点?

(我可以这样做,这将运行 both 命令,但我需要它是其中一个。)

{
    "keys": ["super+shift+h"],
    "commands": [
        {"command": "htmlprettify"}, {"command": "js_prettier"}
    ]
},
sublimetext3
2个回答
2
投票

是的,您需要使用

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
,它将在所有文本文件(纯文本、任何 HTML 文件等)中工作,而使用
text
只会将其限制为 HTML 文件和 Markdown 文件。

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

这就是为什么在上面的情况下,我可以将

Alt+Q

键绑定到此命令,并让它在 text.html 文件中以不同的方式工作,但在所有其他情况下,它只会执行通常的操作。


[编辑]

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

根据

非官方文档

关于按键绑定

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

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

作为一个人为的示例,以下一组键绑定使

Alt+F1

键在 Markdown 源文件中插入与所有其他文件中不同的文本。如果顺序相反,则首先找到全局密钥(并且始终匹配):


Lua

另请注意,Sublime 中的许多资源(包括 
{ "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,最后是

Default
,以及中间的所有其他内容(请参阅链接以获取完整的详细信息)。

您的自定义键绑定始终位于

User

包中,因此最后加载,这意味着您可能始终可以安全地覆盖任何内容并使顺序符合您的预期。


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

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

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


2
投票
Tools -> Developer -> Show Scope Name

让我很开心。这是我在 Preferences -> Key Bindings 中的做法(使用 Pretty JSON 在 json 文件上重新缩进) User

© www.soinside.com 2019 - 2024. All rights reserved.