Вступление
Сегодня я хочу привести небольшой обзор-туториал темплейтов в ИСР от Jetbrains. Приведенные ниже примеры будут реализованы на Java в Intellij IDEA, но механизм создания одинаков и для других языков и продуктов компании. Думаю все программирующие в данной IDE пользовались встроенными шаблонами. Например когда вы пишете fori, нажимаете TAB или ENTER и у вас появляется цикл for в котором нужно указать имя переменной и условие, а остальной код генерируется за вас.
for (int i = 0; i < ; i++) {
}
Или же знакомый всем java-программистам sout -> System.out.println(). Так вот, в Intellij есть поддержка создания своих шаблонов кода. На удивление не нашёл практически никакой инфы на русском и довольно мало на английском(благо есть неплохая документация) когда наткнулся на эту фичу, хотя это сильно ускоряет и помогает в разработке. И сейчас когда дошли руки решил написать небольшую статью об этом. Возможно опытным программистам она мало чем поможет, они и сами смогут разобраться во всём или же уже давно это юзают, но для всех остальных считаю вполне подойдёт. Итак приступим.
Создание шаблона
Для начала сделаем простой пример, к примеру константу логгера. Заходим в Settings -> Editor -> Live Templates. Здесь есть возможность просмотреть уже готовые группы шаблонов и создать свою — нажав на плюсик в правой части панели. Также можно создать отдельный шаблон, тогда он добавится в группу user. После нажатия у вас снизу появится окошко, в котором нужно ввести аббревиатуру, описания и собственно сам текст шаблона. Также будет предупреждающая надпись "No applicable context" и кнопка Define рядом, кликнув на которую мы увидим список возможных контекстов — HTML, XML, Java, Javascript, CSS и тд. У некоторых есть подпункты, например в Java это возможность использовать шаблон в методе, в комментарии, на уровне класса, где то ещё или везде сразу. Выберем для примера весь пакет Java.
В качестве аббревиатуры напишем log, в качестве теста вот такую вот строку:
private static final Logger LOGGER = Logger.getLogger($CLASS_NAME$.class.getName());
Далее жмём на кнопку которая находится в правой части — Edit variables. В открывшемся окошке видим таблицу с одной записью — CLASS_NAME, которая соответствует переменной которую мы указали в тексте файла в качестве имени класса. У нее есть поля Expression, Default value, Skip if defined. Первое поле это селект в котором нам предлагаются всевозможные значения которые можно подставить. Второе это просто строка в которой мы можем написать что угодно взяв это в кавычки. Ну а третье поле предлагает нам пропустить редактирование переменной если она задана в одном из первых свойств. В нашем случае нам понадобится значение селекта className() из поля Expression. При желании можно выбрать пропуск редактирования. Жмём OK, после Apply и можно проверять. Создаём класс с любым именем, пишем внутри log, нажимает TAB и вуаля — у нас есть логгер у которого к вместо CLASS_NAME имя текущего класса.
Пример:
public class CodeTemplates {
private static final Logger LOGGER = Logger.getLogger(CodeTemplates.class.getName());
}
Особенности и возможности:
1. При создании шаблонов есть ключевая переменная $END$ указывающая на то где будет находиться курсор когда вы создадите шаблон (По умолчанию в конце кода шаблона).
System.out.println($END$);
2. Вторая ключевая переменная это $SELECTION$. Если она присутствует в вашем шаблоне, то он будет появляться в меню Surround With(Ctrl+Alt+T). Это нужно если хотите заключить ваш код в обёртку.
System.out.println("$SELECTION$");
Т е допустим у вас есть слово или предложение, например TEST — вы ставите курсор в конец слова, нажимаете Ctrl+Alt+T и среди шаблонов можете выбрать свой, и тогда получится:
System.out.println("TEST");
P.S.: для блока кода или текста, достаточно его сначала выделить.
3. Некоторые из расширений в Extentions могут принимать в аргументы значения различных типов, в том числе другие расширения. Чтобы было понятнее приведу пример. Возможно многие знакомы с аннотацией JPA Table, в которую можно среди прочего передавать имя таблицы соответствующей данному классу(сущности). Обычно имена таблицы и класса совпадают, с различием лишь в том что className становится CLASS_NAME. Шаблон для создания данной аннотации будет примерно таким:
@Table(name = "$TABLE NAME$")
В Extentions выбираем capitalizeAndUnderscore(String), только вместо String уже сами прописываем className:
capitalizeAndUnderscore(className)
Пример:
@Table(name = "CODE_TEMPLATES")
public class CodeTemplates {
...
}
PS:
В селекте поля Extentions можно прописать и свои значения, как в инпуте, но не вижу в этом смысла, ведь это можно сделать в поле Default value.
Заключение
Надеюсь сегодняшняя статья будет полезна и поможет в ускорении разработки, тем кто ещё не пользовался своими шаблонами.
P.S.: При желании можно писать свои собственные плагины для IDE, в том числе расширения для шаблонов.
Исправления или дополнения приветствуются.
Ссылка на официальную документацию: ТУТ
Автор: Rusya_2_0