Как назначить область видимости для контекстного меню 3 возвышенного текста? - PullRequest
2 голосов
/ 05 мая 2019

Я добавил контекстное меню правой кнопкой мыши к возвышенному тексту 3, создав файл Context.sublime-menu в папке Packages/user со следующей конфигурацией:

[
    {
        "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 Ответ

2 голосов
/ 05 мая 2019

Видимость пункта меню контролируется командой, на которую ссылаются.См. Метод 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> указантам есть совпадения, вместо того, чтобы требовать его (/ возможно дублирования) в пункте контекстного меню.

...