我添加了一个右键单击上下文菜单,通过使用以下配置在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>
将范围分配给代码段一样。一方面,我没有找到任何文档,另一方面,我看到有以这种方式运行的上下文菜单,所以我知道它的可能。
有人知道如何实现这一目标吗?
答案 0 :(得分:2)
菜单项的可见性由所引用的命令控制。请参见https://www.sublimetext.com/docs/3/api_reference.html#sublime_plugin.TextCommand的is_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>
匹配,而不是要求它在上下文菜单项中输入(或可能重复)。