Как стать автором
Обновить

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

Время на прочтение 4 мин
Количество просмотров 24K

Вступление


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

4. Также есть возможность импортировать(File -> Import Settings) и экспортировать(File -> Export Settings) шаблоны и другие настройки в виде jar-файлов. Т к шаблоны экспортируются в виде xml-файлов, то при желании можно зайти в директорию .IntelliJIdea$VERSION$/config/templates и добавить туда свой xml. При этом нужно чтобы в файле указывалась группа шаблонов, иначе вы не увидите их в списке. Если же не указывать группу, то отдельные шаблоны можно добавить в один из имеющихся уже файлов, как вариант — user.xml.
Пример user.xml c логером и Table:
<templateSet group="user">
  <template name="log" value="private static final Logger LOGGER = Logger.getLogger($CLASS_NAME$.class.getName());" description="Logger Template" toReformat="false" toShortenFQNames="true">
    <variable name="CLASS_NAME" expression="className()" defaultValue="" alwaysStopAt="true" />
    <context>
      <option name="JAVA_DECLARATION" value="true" />
    </context>
  </template>
  <template name="tb" value="@Table(name = "$TABLE_NAME$")" description="" toReformat="false" toShortenFQNames="true">
    <variable name="TABLE_NAME" expression="capitalizeAndUnderscore(className)" defaultValue="" alwaysStopAt="true" />
    <context>
      <option name="JAVA_CODE" value="true" />
    </context>
  </template>
</templateSet>


Заключение


Надеюсь сегодняшняя статья будет полезна и поможет в ускорении разработки, тем кто ещё не пользовался своими шаблонами.

P.S.: При желании можно писать свои собственные плагины для IDE, в том числе расширения для шаблонов.

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

Ссылка на официальную документацию: ТУТ
За дополнение спасибо justboris
Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.
Была ли статья полезной?
80.82% Да 118
20.55% Нет 30
Проголосовали 146 пользователей. Воздержались 32 пользователя.
Теги:
Хабы:
+24
Комментарии 13
Комментарии Комментарии 13

Публикации

Истории

Работа

Ближайшие события

Московский туристический хакатон
Дата 23 марта – 7 апреля
Место
Москва Онлайн
Геймтон «DatsEdenSpace» от DatsTeam
Дата 5 – 6 апреля
Время 17:00 – 20:00
Место
Онлайн