Создание шаблонов в IDE от Jetbrains

habr.png

Вступление


Сегодня я хочу привести небольшой обзор-туториал темплейтов в ИСР от 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, в том числе расширения для шаблонов.

Исправления или дополнения приветствуются.

Ссылка на официальную документацию: ТУТ

© Habrahabr.ru