Sublimetext3 如何为升华文本3上下文菜单指定范围?

Sublimetext3 如何为升华文本3上下文菜单指定范围?,sublimetext3,contextmenu,Sublimetext3,Contextmenu,我通过在Packages/user文件夹中创建一个context.sublime菜单文件,添加了一个右键单击上下文菜单来升华文本3,配置如下: [ { "caption": "wrap with try", "mnemonic": "t", "id": "try", "command": "insert_snippet", "args": { "name": "Packages/User/js-try.sub

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

[
    {
        "caption": "wrap with try",
        "mnemonic": "t",
        "id": "try",
        "command": "insert_snippet",
        "args": { "name": "Packages/User/js-try.sublime-snippet" }
    }
]
这个很好用。但我希望它只在当前文件是javascript文件时出现,就像您可以通过配置
source.js
为代码段分配范围一样。一方面,我没有找到任何关于这方面的文档,另一方面,我看到上下文菜单的行为是这样的,所以我知道这是可能的。
有人知道如何实现这一点吗?

菜单项的可见性由所引用的命令控制。请参阅位于的
is_visible
方法

由于此方法的内置
insert_snippet
命令始终返回
True
,为此,您需要编写一个(小型)自定义插件,作为所需命令的包装器:

  • 从工具菜单->开发者->新插件
  • 将模板替换为:
导入升华
导入升华插件
类ProxyCommand(升华插件.TextCommand):
def运行(自我、编辑、命令名、范围选择器、**kwargs):
self.view.run_命令(命令名称,kwargs)
def可见(自身、命令名称、范围选择器、**kwargs):
返回self.view.match_选择器(self.view.sel()[0].begin(),scope_选择器)
  • 将其保存在用户包中,类似于
    proxy\u command.py
    ——基本文件名不重要,只有扩展名重要
  • 现在,将上下文菜单项更改为:(注意,我们现在要求菜单项指向刚刚创建的
    proxy
    命令,并传入参数,告诉它应该为哪个作用域(选择器)激活,执行哪个实际命令以及使用什么参数。)
您可以更进一步,构建一个通用的代码段包装器命令,该命令可以读取代码段文件(使用
sublime.load\u resource
API,然后解析XML),查看其中指定的
是否匹配,而不是要求在上下文菜单项中输入(/可能重复)

[
    {
        "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",
        },
    }
]