如何取消映射 sublime text 键绑定以便发生标准 os 操作?

How to unmap sublime text keybinding so standard os action happens?

command+shift+?的正常mac行为是打开帮助菜单搜索,无需鼠标即可执行菜单命令非常方便。

不幸的是,我安装的一个 sublime 文本包将该键绑定映射到设置菜单。这是包 Default (OSX).sublime-keymap 文件

的相关部分
[
    {  "keys": ["super+shift+/"], "command": "open_settings" }
]

基于与 How to unbind a key binding in Sublime Text 2? 相关 我继续并在我的用户键绑定中覆盖了他们的键绑定。这是我的用户 Default (OSX).sublime-keymap 文件。

[
    { "keys": ["super+shift+/"], "command": "noop" }
]

这会在我按下按键序列时阻止程序包打开设置。如果我对命令使用 unbound,则行为相同,不包括命令文件包键绑定。但是,它不会冒泡到打开帮助搜索菜单的 Mac 层。

我可以通过直接修改包的键绑定文件让事情按照我想要的方式工作,但是下次包升级时它会被覆盖。

是否有支持的方法来删除键绑定而不阻止它冒泡到操作系统?

以 Sublime 不会以任何方式反应的方式完全删除键绑定的唯一方法是将其从 sublime-keymap 文件中删除。无论你想从 Sublime 附带的 Default/Default (PLATFORM).sublime-keymap(每个平台都有一个)中完全删除一个文件以删除默认键绑定以及任何可能由第三方包添加的文件,都是如此。

只要密钥保留在任何地方的 sublime-keymap 中,Sublime 就会看到它并尝试用它做一些事情,即使密钥绑定到一个不存在的命令,例如 noop(尽管这是阻止默认密钥执行任何操作的好方法,如果这是您的最终目标)。

正在编辑包文件

解决问题的一种方法是直接修改打包文件本身,正如您已经提到的。在大多数情况下,这意味着解压缩相关的 sublime-package 文件(这只是一个 zip 文件),修改文件的内容,然后重新打包它。

正如您已经注意到的那样,这不是一个好方法,因为当更新包时,整个 sublime-package 文件会被破坏,因此您的更改也将被丢弃。

覆盖包文件

一个更安全的方法是创建一个包覆盖文件。这仅在相关包作为 sublime-package 文件安装时有效,该文件涵盖了 Sublime 附带的所有包以及大多数第三方包。

为此,您将在 Sublime Packages 文件夹中创建一个与包同名的文件夹,您可以通过首选项菜单项 Browse Packages... 访问该文件夹。完成后,仅提取要覆盖的文件并将其放入该文件夹,然后根据需要进行编辑。

当 Sublime 从 sublime-package 文件加载包时,它会在加载每个文件时检查 Packages/PackageName/ 文件夹中是否存在名称相似的 "unpacked" 文件。如果存在这样的文件,sublime-package 文件中的版本将被忽略,而是使用解压后的文件。

这意味着即使更新了包,由于您的解压版本仍然存在,它仍将被使用,因此您的更改将保留在原地。

创建此类文件的最简单方法是使用 PackageResourceViewer 程序包。您可以使用命令面板中的 PackageResourceViewer: Open Resource 命令来查找并打开有问题的文件。如果您对文件进行更改并保存,PRV 将自动为您创建覆盖。

这个过程有几个注意事项:

  1. 如果安装的有问题的包已经解压在 Packages 文件夹中,则无法创建覆盖。在这种情况下,除了在文件更新时小心地重新修改文件之外,您无能为力。

    大多数包不会受到此限制,因为实际上很少需要以这种方式安装(只有包含需要在 Sublime 之外公开的文件的包才需要以这种方式安装)。

    另请注意,Sublime Text 2 仅安装未打包的包,因此在这种情况下您也不能这样做。

  2. 当包覆盖存在时,它总是用于代替同名的打包文件,无论如何。这有一个不幸的副作用,如果包更新实际上以任何方式修改了您正在更新的文件,那么这些更改将在没有警告的情况下对您隐藏。

    完整的caveat/disclosure我是写这个包的人吗,Sublime 的 OverrideAudit 包可以在发生这种情况时通过检查每次包更新时是否警告你打包文件的版本比您覆盖的版本更新,因此您知道正在发生这种情况并可以采取适当的措施。

Sublime Text 2 笔记

您的问题是标记 Sublime Text 2 和 Sublime Text 3。在 Sublime Text 2 的情况下,上面关于需要完全删除键绑定以允许 OS 看到它的信息持有。

然而,据我所知,Sublime Text 2 不支持包覆盖的想法,因为它总是安装所有解压的包。因此,在该特定情况下,唯一的解决方案是修改打包文件并留意变化。

此时 Sublime Text 3 正式发布,没有太多令人信服的理由继续使用 ST2。如果您在 2013 年 mid/late 或之后的某个时间购买了 ST2 许可证,则您的许可证应该对 ST3 有效。

这一点尤其重要,因为 ST2 不再受支持,并且从 High Sierra 开始,当 Apple 删除 Python 2.6 时,各种 Sublime 包现在将不再有效。