Как выбрать команды на основе синтаксиса файла в Sublime Text
Я потратил слишком много времени на то, чтобы точно определить, как переопределить тот или иной инструмент форматирования кода в пользу другого при редактировании JavaScript, но оставить другой на месте для форматирования HTML и CSS.
Я не нашел полных инструкций здесь на SO или в других местах, поэтому я решил опубликовать Q&A здесь.
Проблема:
HTMLPrettify прослушивает привязку определенного ключа (super-shift-h) и затем запускает вариант сценария Prettify в зависимости от синтаксиса файла. Он обрабатывает HTML, CSS, JS и JSON.
Я хотел АОС
Я нашел JSCS и мне понравилось, что он легко подбирался и обрабатывал не только основы, но и имел множество вариантов стиля кодирования.
Для меня самая крутая вещь в этом заключается в том, что пользователь может просто выбрать хорошо известное руководство по стилю JS, такое как airbnb или jquery, и JSCS будет соответствовать стилю, в котором он форматирует код, в соответствии с этим стилем.
Во всяком случае, я хотел использовать это вместо. Но я хотел сохранить HTMLPrettify для HTML и CSS и не мог найти способ выбрать один для JS и JSON, а другой для HTML и CSS.
1 ответ
объяснение
HTMLPrettify фиксирует привязку ключа в своем собственном файле конфигурации, который загружается после и, следовательно, переопределяет привязки ключей по умолчанию и пользователя.
JSCS по умолчанию использует ту же привязку ключа, что и HTMLPrettify, поэтому в конечном итоге это борьба за вызов.
Чтобы решить эту проблему, необходимо удалить привязку ключа из HTMLPrettify в его настройках, а затем добавить некоторые пользовательские привязки ключей пользователя, которые используют условный контекст для просмотра типа синтаксиса.
Измените первый параметр в настройках HTMLPrettify на:
[{
"keys": [""],
"command": "htmlprettify"
},
Затем добавьте следующее в файл привязок ключей пользователя в SublimeText:
[
{
"keys": ["super+shift+h"],
"command": "format_javascript",
"context": [
{ "key": "selector", "operator": "equal", "operand": "source.js" },
{ "key": "selector", "operator": "equal", "operand": "source.json" },
]
},
{
"keys": ["super+shift+h"],
"command": "htmlprettify",
"context": [
{ "key": "selector", "operator": "not_equal", "operand": "source.js" },
{ "key": "selector", "operator": "not_equal", "operand": "source.json" },
]
}
]
Обратите внимание, что части "not_equal" необходимы, потому что Sublime Text (по крайней мере, в OSX), похоже, содержит ошибку, из-за которой необходимо явно исключить любые другие совпадения, или он просто (в этом случае) запускает JSCS против всего.
Я не проверял это, но я представляю, что если у вас есть другие форматеры, которые вы хотите включить, вы можете использовать шаблон "равный" для каждого из них, соответствующий типу источника, а затем использовать шаблон "not_equal" для соответствия на пустую команду.
Личная заметка
Форматирование кода является очень распространенной функцией. Определенные механизмы для форматирования определенных синтаксисов должны быть отделены от привязки клавиш, чтобы привязка одного ключа могла использоваться для всех команд "форматирования", и синтаксис определял бы, какой механизм использовать на основе того, какой из них назначил пользователь.
Скорее всего, это довольно легко сделать в плагине SublimeText. Или, по соглашению, разработчики плагинов могут просто быть осторожными, чтобы добавить контекст к своим привязкам клавиш и оставить "пространство имен" привязки открытым для других синтаксисов.