[TextMate] Создаем сниппеты своими руками

4

Altrgeo


Icon

Разработчик: MacroMates

Текущая версия: 1.5.9

Стоимость: $58


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

Думаю, все пользовались и представляют себе что такое сниппет. На всякий случай — это небольшая текстовая заготовка, которую можно многократно использовать. Поскольку сниппеты, в основном, используются в программировании, так как там чаще всего встречаются повторяющиеся блоки текста, то дальше все примеры будут рассмотрены с точки зрения программирования и HTML верстки. Хотя, сниппеты могут быть использованы в любом месте где необходимо автоматизировать ввод текстовой информации.

Сегодня сниппеты есть во многих текстовых редакторах и IDE, но в TextMate существуют некоторые особенности их использования. Кроме феноменальной гибкости они имеют, так называемую, область срабатывания (scope selector). Она позволяет повесить на одно и тоже действие или сочетание клавиш различные сниппеты, в зависимости от того на каком языке мы пишем в данный момент.

Например, во всех языках программирования существует оператор условного перехода — if. Но синтаксис практически всегда отличается. Логично, что было бы удобно, если бы сниппет для него всегда активировался одинаково.

Попробуйте создать новый HTML-документ и набрать if⇥. Получатся две вставки на PHP.

<?php if (condition): ?>

<?php endif ?>

Теперь наберите php⇥ и не перемещая курсор if⇥. Тот же самый активатор сниппета, но сработал иначе.

<?php if (condition) {
# code...
} ?>

Различные варианты сниппетов

Условно их можно разделить на несколько видов.

Статические — к ним относятся неизменяемые во время использования сниппеты. Они ни чем не отличаются от действий копировать-вставить.

Динамические — в такой сниппет можно добавить переменную, которая будет меняться в зависимости от заданных факторов. Например, это могут быть текущие дата и время или имя редактируемого файла.

Интерактивные — при использовании такого сниппета, пользователь может модифицировать заданные участки кода. Имена переменных, названия функций, условия цикла и так далее.

Переменные

TextMate располагает набором переменных, которые могут содержать некоторую информацию.
Например, выделенный текст или имя редактируемого файла. Эти переменные можно использовать при работе со сниппетами.

Различные варианты использования переменных.

Как есть — в переменной будет строго определенное значение. Например: ${TM_SELECTED_TEXT} будет содержать выделенный в окне редактора текст.

Дополнительное значение — конструкция ${TM_SELECTED_TEXT:$TM_CURRENT_WORD} будет содержать выделенный текст или, если ничего не выделено, слово, которое находится под кареткой;

С заменой значений — конструкция ${TM_SELECTED_TEXT/<(.+?)>/&lt;$1&gt;/g} произведет замены в выделенном тексте согласно регулярному выражению. Этот сниппет заменит все нежелательные скобки на их HTML эквиваленты;

    Перечень некоторых переменных:

  • TM_SELECTED_TEXT — выделенный текст (объем текста не может превышать 64кб);
  • TM_CURRENT_WORD — слово, на котором находится курсор;
  • TM_CURRENT_LINE — строка, на которой находится курсор;
  • TM_DIRECTORY — полный путь к директории, в которой находится редактируемый файл;
  • TM_FILEPATH — полный путь к редактируемому файлу (включая имя файла);
  • TM_LINE_INDEX — позиция курсора в строке (отсчет с нуля);
  • TM_LINE_NUMBER — номер строки, на которой находится курсор (отсчет с единицы);
  • TM_PROJECT_DIRECTORY — полный путь к директории, в которой находится текущий проект;
  • TM_SCOPE — название текущей области срабатывания;
  • TM_SELECTED_FILE — полный путь к файлу или директории, выбранным в дереве проекта.

Существует возможность добавить свои собственные переменные, которые можно использовать в равной степени. Откройте настройки программы → раздел Advanced → закладка Shell Variables.

Textmate Custom Snippets 7

Использование заглавных букв или какого-либо префикса не обязательно, но если именовать переменные определенным образом, то в последствии их будет легче воспринимать, особенно если ваш сниппет будет занимать десяток строк.

Статические сниппеты

Например, при верстке HTML-документов часто приходится добавлять DOCTYPE. Он имеет несколько версий, но всегда статичен и не требует участия пользователя. Так зачем тратить время и вводить его вручную, когда этот процесс можно автоматизировать?

Переключим язык представления на HTML и наберем doctype⇥. TextMate предложит несколько вариантов.

Textmate Custom Snippets 1

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

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">

Попробуем добавить собственную заготовку. Откроем окно редактора сниппетов. Для этого выберем пункт меню Bundles → Bundle Editor → Show Bundle Editor или нажмем сочетание клавиш ⌃⌥⌘S. Для наших экспериментов лучше создать отдельную группу. Назовем ее «Custom».

Textmate Custom Snippets 2

Для начала предлагаю сделать что-нибудь простое. Например, подпись для HTML документа, которая бы размещалась по правому краю страницы. Добавим сниппет и введем в окно редактора:

<p style="text-align:right">Вася Пупкин</p>

Должно получиться примерно следующее:

Textmate Custom Snippets 3

Activation — условие срабатывания сниппета. Это может быть сочетание клавиш или нажатие табуляции во время набора текста. В нашем случае это второй вариант. Сниппет сработает после того как мы наберем sign⇥.

Scope Selector — область срабатывания. В нашем случае указано, что сниппет будет работать только для HTML кода. Если хочется, чтобы он также срабатывал для PHP, нужно через запятую добавить еще один селектор. Выглядеть это будет так: text.html, source.php.

Немного усложним задачу. Переименуем наш сниппет, чтобы название более очевидно отображало содержание. Cделаем его копию (кнопка Textmate Custom Snippets 4). Настройки оставим без изменений, но немного исправим текст.

<p style="text-align:right">Вера Синичкина</p>

Textmate Custom Snippets 5

Снова наберем sign⇥ и получим список возможных вариантов сниппета. Так получилось, потому что мы указали одно и тоже условие срабатывания.

Textmate Custom Snippets 6

Динамические сниппеты

Это уже поинтереснее. TextMate позволяет использовать всю мощь командной строки. Усовершенствуем наш сниппет:

<p style="text-align:right">Вася Пупкин, `date "+%d.%m.%Y %H:%M"`</p>

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

<p style="text-align:right">Вася Пупкин, 23.02.2010 12:52</p>

Интерактивные сниппеты

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

Действия могут быть нескольких типов.

Позиционирование — после каждого нажатия табуляции, каретка будет перескакивать на следующую отмеченную позицию ($1, $2 и так далее). Отметку $0 можно использовать в том случае, если мы хотим, чтобы каретка осталась в этом месте. В противном случае, после последней отметки она переместиться в конец сниппета.

if ($1) {
$2
}

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

if (${1:condition}) {
${0:# code...}
}

Отражение — вводимые значения будут дублироваться в другой части сниппета. Это полезно, например, при верстке HTML документов. Одновременно вводятся открывающий и закрывающий теги.

<${1:tag}>$2</$1>

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

/**
* ${3:Description}
* ${2/([$a-z]+)([,s]*)/(?1:n * @param $1)/g}
* @return ${4:unknown_type}
*/
function ${1:name}($2) {
${0:// code here..}
return;
}

При добавлении новой функции к ней автоматически примкнет комментарий PHPDoc. Сразу после того как сниппет активизируется, он предложит ввести имя функции. Далее, при добавлении переменных, они тут же будут отображаться в комментарии (сниппет рассчитан на PHP код, так что имена переменных должны начинаться со знака $). Следующим шагом будет ввод описания функции и возвращаемого значения, и, наконец, каретка переместиться внутрь функции для ввода основного кода.

Готовые заготовки

Вы можете легко передать кому-нибудь созданные вами сниппеты. Все они находятся в домашней директории вашего пользователя:
/Users/<user name>/Library/Application Support/TextMate/Bundles.

Помните, мы вначале добавили группу для наших экспериментов? Custom.tmbundle — это и есть все наши сниппеты. Добавить их в TextMate очень просто. Достаточно запустить этот файл как любую программу и редактор их подхватит. Либо самим скопировать его в указанную выше папку.

При желании можно передать сниппеты выборочно. Вызвав контекстное меню для нашего файла, выберите пункт «Показать содержание пакета». В папке Snippets вы найдете все свои заготовки.

Поделиться
Сохранить