如何将范围分配给sublime text 3上下文菜单?

时间:2019-05-05 09:37:25

标签: sublimetext3 contextmenu

我添加了一个右键单击上下文菜单,通过使用以下配置在Context.sublime-menu文件夹中创建Packages/user文件来使文本3升华:

[
    {
        "caption": "wrap with try",
        "mnemonic": "t",
        "id": "try",
        "command": "insert_snippet",
        "args": { "name": "Packages/User/js-try.sublime-snippet" }
    }
]

这很好。但是我希望它仅在当前文件是javascript文件时显示,就像您可以通过配置<scope>source.js</scope>将范围分配给代码段一样。一方面,我没有找到任何文档,另一方面,我看到有以这种方式运行的上下文菜单,所以我知道它的可能。 有人知道如何实现这一目标吗?

1 个答案:

答案 0 :(得分:2)

菜单项的可见性由所引用的命令控制。请参见https://www.sublimetext.com/docs/3/api_reference.html#sublime_plugin.TextCommandis_visible方法。

由于内置的​​insert_snippet命令总是为此方法返回True,要实现此目的,您将需要编写一个(小型)自定义插件,该插件将充当所需命令的包装器:

  • 从“工具”菜单->开发人员->新插件...
  • 替换模板:
import sublime
import sublime_plugin


class ProxyCommand(sublime_plugin.TextCommand):
    def run(self, edit, command_name, scope_selector, **kwargs):
        self.view.run_command(command_name, kwargs)

    def is_visible(self, command_name, scope_selector, **kwargs):
        return self.view.match_selector(self.view.sel()[0].begin(), scope_selector)
  • 在用户包中将其保存为proxy_command.py之类的内容-基本文件名无关紧要,仅扩展名很重要
  • 现在,将上下文菜单项更改为:(请注意,我们现在要让菜单项指向我们刚刚创建的proxy命令,并传入参数以告诉它应将其作用域(选择器)活动,执行哪个实际命令以及带有哪些参数。)
[
    {
        "caption": "wrap with try",
        "mnemonic": "t",
        "id": "try",
        "command": "proxy",
        "args": {
            "command_name": "insert_snippet",
            "name": "Packages/User/js-try.sublime-snippet",
            "scope_selector": "source.js",
        },
    }
]

您可以更进一步,并构建通用的代码片段包装器命令,该命令可以读取代码片段文件(使用sublime.load_resource API,然后解析XML)以查看是否指定了<scope>匹配,而不是要求它在上下文菜单项中输入(或可能重复)。