Несколько TabTriggers для сниппета Sublime Text

Sublime Text

Сниппеты — очень удобная и полезная вещь редактора Sublime Text. В большинстве случаев они работают без проблем. Но есть и ограничения: на одно действие нельзя «повесить» сразу несколько триггеров. Это не сработает в файлах *.sublime-snippet. Что делать в этом случае? Есть два способа решить проблему: использовать несколько сниппетов c одинаковым действием и разными триггерами либо создать специальный файл.

Очевидный способ

Используем несколько сниппетов. Никто не запрещает создать два сниппета с разными триггерами срабатывания и одинаковым кодом сниппета. В этом случае потребуется создать для каждого сниппета отдельный файл.

Менее очевидный способ

Используем *.sublime-completions. Вместо непосредственного создания сниппетов (*.sublime-snippet), создаём файл с расширением *.sublime-completions. Общий принцип здесь такой же, как и со сниппетами, только внутри должен быть JSON (вместо XML у сниппетов). Ключевое отличие от сниппетов состоит в том, что файлы этого типа могут хранить в себе множество инструкций и каждая из инструкций может содержать сразу несколько триггеров.

Чтобы показать, как это работает, напишем несложный пример, который разворачивает непонятные на первый взгляд выражения ищдв, ыекщтп,шефдшс и уь, набранные в «некорректной» русской раскладке в привычные теги <em> и <strong>:

{
  "scope": "text.html.basic",
    "completions":
    [
      {"trigger": "ищдв|ыекщтп", "contents": "<strong>$0</strong>"},
      {"trigger": "шефдшс|уь", "contents": "<em>$0</em>"}
    ]
}

Не забываем сохранить файл с расширением .sublime-completions и положить его в папку User [Preferences → Browse Packages… → User].

Обратите внимание, что в примере это будет работать только для файлов c расширением html. На это напрямую влияет значение параметра scope. В нём указывается нужная область видимости срабатывания триггеров. Другие возможные области видимости сниппетов Sublime Text можно посмотреть в специальном gist файле.

Несмотря на свою похожесть, у *.sublime-snippet и .sublime-completions есть серьёзные отличия.

Приоритет у *.sublime-completions ниже, чем у сниппетов. Сниппеты, в свою очередь, имеют высший приоритет.

Это означает, что если уже существует, например, стандартный автокомплит тега html, то сработает именно сниппет, а не стандартный автокомплит. А файл .sublime-completions так сделать не сможет и не сработает по-умолчанию.

На самом деле, это не значит, что инструкции с низким приоритетом, такие как .sublime-completions, вообще не работают при наличии более приоритетных. Они работают, просто для их корректного срабатывания, нужно повторно нажать TAB.


Какой способ создания сниппетов выбрать зависит напрямую от решаемой задачи. Если нужно «переписать» уже существующие стандартные команды автодополнения, рекомендуется использовать сниппеты, в ином случае можно создать файл *.sublime-completions и хранить в нём сразу все необходимые команды. Безусловно, никто не мешает комбинировать два подхода, главное, самому во всём этом не запутаться.