Как использовать живой шаблон для повышения производительности труда разработчиков

Живой шаблон - это функция JetBrains IDE, которая позволяет расширять ключевые слова в фрагменты кода с редактируемыми полями. Когда вы набираете текст в Android Studio, иногда вам будет предлагаться следующий вариант:

Живой шаблон очень полезен для повседневных задач программирования, в которых он:

  • Повышает продуктивность разработчика.
  • Обеспечивает автозаполнение для часто используемых кодов.
  • Предоставляет настраиваемые и редактируемые поля в зависимости от контекста вашего кода.
  • Снижает когнитивную нагрузку, потому что вам не нужно запоминать стандартные коды.

В этой статье я попытаюсь объяснить, как создавать и применять пользовательские живые шаблоны, а также 2 других шаблона, которые могут быть полезны для повышения вашей производительности: Завершение постфикса и Шаблоны файлов.

Эти шаблоны также доступны для других IDE JetBrains.

Живой шаблон

Есть несколько живых шаблонов, которые предоставляются Android Studio из коробки, но в основном они предназначены только для кодов Java. Например, если мы введем logd внутри функции в коде Java и выберем предложенное предложение, он завершит ваш код в Log.d(TAG, “functionName: “);.

Вы также можете использовать ярлык «Вставить живой шаблон» (по умолчанию ⌘J в MacOS и Ctrl + J в Windows / Linux) для завершения любого действительное сокращение Live Template, если вы его не помните. Например, на MacOs введите log и нажмите ⌘J, чтобы увидеть, что произойдет.

Чтобы просмотреть существующие или добавить новые действующие шаблоны, перейдите к Settings/Preferences, затем к Editor | Live Templates.

Создание собственного живого шаблона

Чтобы создать новый активный шаблон, нажмите Добавить (+) в правом верхнем углу окна активного шаблона, затем выберите Живой шаблон. В окне шаблона присвойте ему аббревиатура. Аббревиатура - это ключевое слово, которое вы будете использовать для вызова действующего шаблона и расширения его до текста шаблона.

Вы можете использовать группу шаблонов для организации пользовательских шаблонов в логические группы.

Несколько вещей, которые нам нужно знать перед созданием наших живых шаблонов:

Контекст

Когда вы создаете новый действующий шаблон, вам будет предложено предупреждающее сообщение, в котором говорится: «Применимых контекстов пока нет.», и будет вариант, в котором вы можете определить контекст. Этот контекст определит тип файлов, в которых будут доступны живые шаблоны.

Поскольку мы собираемся писать живые шаблоны для Android, мы обычно сосредоточимся на Kotlin и контексте XML.

Советы. Вы можете использовать одно и то же сокращение для разных действующих шаблонов, относящихся к разным контекстам. Например, вы можете определить сокращение logd в контексте Kotlin, и оно будет работать только при вводе текста в файле Kotlin.

Переменные

Переменные - это редактируемые поля, которые можно изменять во время использования. Эти переменные могут быть пользовательскими вводами или выражениями, которые оцениваются в среде IDE.

Чтобы добавить переменные в действующие шаблоны, введите $VARIABLE_NAME$ в поле текст шаблона, а затем нажмите Изменить переменные. Вы должны иметь возможность редактировать свои переменные.

Вот краткое объяснение каждого поля:

  • Имя: имя переменной.
  • Выражения: позволяет заменить переменную предопределенными функциями.
  • Значение по умолчанию: значение, которое будет использоваться, если выражение не удалось.
  • Пропустить, если определено: пропускает запрос пользователя на ввод, если выражение успешно вычислено.

Вы можете использовать две предопределенные переменные: $END$ и $SELECTION$.

  • $END$ - позиция курсора после раскрытия шаблона.
  • $SELECTION$ будет заменен кодом, который в данный момент выбирается при раскрытии шаблона. Это полезно, когда вы используете «Окружение с живым шаблоном».

Примеры пользовательских шаблонов

Вот несколько живых шаблонов, которые я считаю действительно полезными и регулярно использую:

Injectable lateinit var

Abbreviation:
inject
Context:
Kotlin: class
Template text:
@javax.inject.Inject 
lateinit var $VARIABLE_NAME$

Советы. Используйте полное имя и убедитесь, что параметр «Сокращать имена FQ» включен, чтобы Android Studio могла автоматически добавлять необходимые операторы импорта.

Свойство привязки Data Binding

Abbreviation:
bindf
Context:
Kotlin: class
Template text:
private lateinit var binding: $BINDING_CLASS$
override fun onCreateView(inflater: android.view.LayoutInflater, container: android.view.ViewGroup?, savedInstanceState: android.os.Bundle?): android.view.View? {
    binding = $BINDING_CLASS$.inflate(inflater, container, false)
    return binding.root
}
Variables:
BINDING_CLASS
  Expression: 
  classNameComplete()

Если вы хотите использовать его в Activity, вам нужно будет создать отдельный действующий шаблон.

Методы и параметры лесозаготовок с помощью Timber

Abbreviation:
timberm
Context:
Kotlin: statement
Template text:
timber.log.Timber.d($CONTENT$)
Variables:
CONTENT
  Expression: 
  groovyScript("def params = _2.collect {it + ' = [\$' + it + ']'}.join(', ');return '\"' + _1 + '() called' + (params.empty  ? '' : ' with: ' + params) + '\"'", kotlinFunctionName(), functionParameters())

Обязательно нажмите Enter после того, как закончите вводить выражение в поле, иначе оно не будет сохранено.

Android XML TextView с предопределенным стилем

Abbreviation:
textview
Context:
XML: XML text
Template text:
<TextView
    android:id="@+id/$ID$"
    style="@style/Widget.WantedlyUI.TextView.$STYLE$"
    android:layout_width="$VIEW_WIDTH$"
    android:layout_height="$VIEW_HEIGHT$"
    android:textAppearance="@style/TextAppearance.WantedlyUI.$STYLE$.$APPEARANCE$"$END$
    tools:text="@tools:sample/lorem"
    />
Variables:
ID
  Default value:
  "textView"
VIEW_WIDTH
  Expression:
  enum("wrap_content","match_parent","0dp")
  
VIEW_HEIGHT
  Expression:
  enum("wrap_content","match_parent","0dp")
  
STYLE
  Expression:
  enum("Body1","Body2","Caption",...,"Title")
  
APPEARANCE
  Expression:
  enum("Regular","Medium","SemiBold","Bold")

В Wantedly у нас есть система дизайна, которую мы можем использовать для стилизации нашего TextView в соответствии с некоторыми предопределенными стилями. Интеграция этого style в наш действующий шаблон упрощает для нас выбор правильного внешнего вида для наших элементов пользовательского интерфейса.

Ваш курсор будет следовать порядку параметров, определенному в Переменных, то есть в этом примере живого шаблона курсор переместится с ID, VIEW_WIDTH, VIEW_HEIGHT, затем STYLE, даже если STYLE был объявлен перед как VIEW_WIDTH, так и VIEW_HEIGHT в тексте шаблона. Это упрощает логический порядок переменных.

Завершение постфикса

Автозавершение Postfix очень похоже на живые шаблоны, но вызывается после выражения в вашем коде. Пример завершения постфикса - .when.

Чтобы увидеть существующие дополнения постфиксов, перейдите на Settings/Preferences, затем на Editor | General | Postfix Completion

К сожалению, хотя мы можем редактировать некоторые ключевые слова и поведение автозавершения постфиксов, в настоящий момент мы не можем добавить пользовательское завершение постфиксов для Kotlin. 😔

Шаблоны файлов

Еще одна функция, очень похожая на живой шаблон, - это шаблон файла. Шаблон файла доступен при создании нового файла с помощью опции File | New.

Чтобы просмотреть существующий или добавить новый шаблон файла, перейдите к Settings/Preference, затем перейдите к Editor | File and Code Templates и выберите вкладку Files.

Чтобы создать новый шаблон файла, нажмите кнопку + (Создать шаблон) в верхней части окна шаблонов файлов.

Если вы хотите использовать динамический шаблон в своем шаблоне файла, убедитесь, что установлен флажок «Включить динамические шаблоны» под текстом шаблона, и добавьте переменную динамического шаблона в формате #[[$Var$]]#.

Пример шаблона файла

Для нашего Android-приложения Visit мы используем класс UseCase, который объединяет бизнес-логику в единое место. Этот шаблон файла позволяет нам легко создать новый класс UseCase, который также является инъекционным.

#if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME}
#end
#parse("File Header.java")
class ${NAME} @javax.inject.Inject constructor() {
  
  operator fun invoke(): #[[$Return$]]# {
    #[[$END$]]#
  }
}

Файл Header.java - это шаблон заголовка файла, который можно найти на вкладке Включает.

Совместное использование ваших файловых шаблонов

Чтобы поделиться своими живыми шаблонами с вашей командой. Вы можете проверить свои файлы шаблонов, которые находятся в папке .idea / fileTemplates, в git. Затем установите для схемы файлов и шаблонов кода значение Проект, чтобы Android Studio использовала ваши шаблоны файлов.

Live Template - отличная функция, которая может легко повысить вашу продуктивность как разработчика. У меня был большой опыт их создания и использования, и я надеюсь, что обмен моим живым шаблоном может вдохновить вас на создание собственного живого шаблона. Дайте мне знать, если есть какой-нибудь интересный живой шаблон, о котором я должен знать!