Видимость пункта меню контролируется командой, на которую ссылаются.См. Метод is_visible
в https://www.sublimetext.com/docs/3/api_reference.html#sublime_plugin.TextCommand.
Поскольку встроенная команда 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)
- сохраните его в пакете User как
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",
},
}
]
Вы могли бы пойти дальше и создать команду обертки сниппета общего назначения, которая могла бы читать файл сниппета (используя API sublime.load_resource
и затем анализировать XML) дляпосмотреть, если <scope>
указантам есть совпадения, вместо того, чтобы требовать его (/ возможно дублирования) в пункте контекстного меню.