Link Search Menu Expand Document

Live templates

Во время разработки мы часто печатаем стандартные, повторяющиеся структуры, с небольшими отличиями: циклы, if-ы, объявляем методы, бросаем исключения и т.д. Live templates позволяет автоматизировать создание этих структур.

В PhpStorm есть ряд стандартных live темплейтов. Давайте рассмотрим один для примера. Expand "fore" template

Я напечатал fore, нажал Tab и получил готовый блок foreach. Более того, PhpStorm автоматически начал переносить каретку ввода сначала на iterable expression, затем за блок as, чтобы я мог задать свое название ключа/значения, и в конце перенес каретку ввода в тело цикла.

С помощью этой механики мы можем экономить массу времени при написании стандартных конструкций. Давайте разберем настройки “Live templates”, чтобы лучше разобраться в принципе работы этого механизма.

Переходим в Settings -> Editor -> Live Templates -> PHP -> fore: Screenshot of "fore" Live Template

Поле Описание
Abbreviation сокращение нашего темплейта, по сути шорткат, которым он вызывается
Description описание темплейта (отображается рядом с аббревиатурой в списке темплейтов и при выводе в списке completions)
Template text собственно сам темплейт
Options: expand with “горячая клавиша”, при нажатии которой будет разворачиваться темплейт
Options: reformat according to style после разворачивания темплейта он будет отформатирован согласно вашим настройкам Code Style
Applicable in *; statement. Chandge контекст, в котором этот темплейт может развернуться

Также у нас есть кнопка Edit Variables, которую мы рассмотрим позже.

Итак, содержание темплейта fore:

foreach ($ITERABLE$ as $VAR_VALUE$) {
    $END$
}

$ITERABLE$, $VAR_VALUE$ - это так называемые “пользовательские” переменные.
В процессе разворачивания темплейта каретка ввода будет поочередно подставляться на место каждой переменной, как это было продемонстрировано на гифке выше. Для перехода к следующей точке остановки, во время развертывания темплейта, нужно нажать Enter или Tab.

$END$ - это стандартная переменная. Она обозначает, что в этой точке нужно остановить каретку ввода, когда темплейт развернется.

На гифке можно наблюдать еще одну особенность - массив $users мы выбираем вручную, а значение $user на место пользовательской переменной $VAR_VALUE$, подставляется автоматически. Как это происходит?
Дело в настройках переменных, которые прячутся под кнопкой Edit Variables. Нажимаем на нее и видим следующее окно:
Screenshot of "fore" Live Template variables

Все пользовательские переменные добавляются в эту табличку автоматически. В табличке есть 4 колонки:

Название Описание
NAME название переменной
Expression спец. функция, которая будет применена к переменной. Их достаточно много, почитать про них можно тут. На примере переменной $VAR_VALUE$ можно увидеть, что для нее установлен expression phpSuggestVariableName(). Как следует из названия - при развертывании темплейта PhpStorm попытается угадать название переменной.
Важный нюанс: для работы phpSuggestVariableName() дефолтное значение должно быть заполнено именно так, как показано на скрине.
Default value Ничего особенного, но есть нюанс. Дефолтное значение также является выражением, которое может ссылаться на другой Live Template. Если ваше дефолтное значение - литерал, оно должно быть обернуто в двойные кавычки, напр. "$item"
Skip if defined PhpStorm не будет останавливаться на месте этой переменной, если ее значение уже заполнено (например, если phpSuggestVariableName смог ее предсказать).


Разберите самостоятельно еще парочку примеров стандартных темплейтов и сможете без проблем создавать свои.
Важно: при добавлении своих темплейтов не забывайте выбирать контекст Applicable in .... Иначе ваш темплейт не будет доступен ни в одном контексте (ни в одном “языке”).

Для примера, вот мой темплейт fore для HTML контекста

<? foreach ($ITERABLE$ as $VAR_VALUE$) { ?>
    $END$
<? }?>

Настройки переменных идентичны оригинальному fore. Этот темплейт я использую для написания foreach во вьюшках.
Также для HTML контекста у меня есть темплейты для вызова глобальных функций перевода, экранирования, установки layout, конструкции if и т.д. Это мощный инструмент, который ограничивается только вашей фантазией и желанием оптимизировать свой workflow. :nerd_face: