Использование текстовых экспандеров для Git, PR и AI-промптов
Сниппеты Espanso для Git, PR и AI-промптов: используйте shell, буфер обмена и курсор для контекстных расширений текста.
Текстовый экспандер превращает короткий триггер вроде :cm в полный блок текста в любом месте, где вы печатаете — будь то сообщения коммитов, описания PR или промпты для LLM — избавляя вас от необходимости десятки раз в день набирать один и тот же шаблонный текст. Лучший выбор для разработчиков — Espanso: бесплатный, open-source, кроссплатформенный экспандер, написанный на Rust, вся конфигурация которого представляет собой обычный YAML, поддающийся версионированию в git. Эта статья — готовый к использованию сборник рецептов: реальные сниппеты Espanso для git-команд, шаблоны PR и переиспользуемые AI-промпты, а также три динамических инструмента — вывод shell-команд, вставка содержимого буфера обмена и позиционирование курсора — которые превращают статический текст в контекстно-зависимый инструментарий.
Ключевые выводы
- Espanso — бесплатный, open-source, кроссплатформенный текстовый экспандер, написанный на Rust; устанавливается на macOS командой
brew install --cask espanso(macOS 11+), на Linux — через пакет.debили AppImage, на Windows — через официальный установщик. - Чтобы сниппет для коммита учитывал контекст, используйте shell-переменную с командой
git rev-parse --abbrev-ref HEADдля подстановки текущей ветки — триггер всегда будет раскрываться с именем той ветки, в которой вы работаете. - Espanso позиционирует курсор после раскрытия сниппета с помощью подсказки
$|$, однако на один match допускается только одна такая подсказка, и она может некорректно работать в редакторах с автоотступами — поэтому используйте шаблоны PR в поле описания в браузере. - В Espanso нет встроенной переменной для выделенного текста: сначала скопируйте код, затем активируйте сниппет, который читает
{{clipboard}}, чтобы обернуть выделенную функцию в LLM-промпт. - Поскольку конфигурация представляет собой обычный YAML, вы можете версионировать весь каталог в git-репозитории и распространять командные сниппеты как приватный пакет Espanso.
Почему текстовый экспандер должен быть частью вашего рабочего процесса разработчика
Текстовый экспандер — это любой инструмент, который отслеживает нажатия клавиш и заменяет заданный триггер более длинным, опционально динамическим блоком текста на системном уровне. Если ваша работа предполагает многократный ввод одних и тех же шаблонных текстов — conventional commits, описания PR, повторяющиеся промпты — он окупается немедленно. Большинство людей впервые сталкиваются с экспандерами через подписи в электронной почте; для разработчиков выгода значительно больше, поскольку значительная часть работы в терминале и на GitHub — это шаблонный текст.
На рынке доминируют три инструмента:
| Инструмент | Платформы | Преимущество |
|---|---|---|
| Espanso | Кроссплатформенный, open-source | Конфигурация в YAML, поддержка скриптов через shell и динамические переменные — наш выбор |
| Raycast Snippets | Ориентирован на macOS | Функция лаунчера с динамическими плейсхолдерами |
| TextExpander | Кроссплатформенный (платный) | Ориентирован на команды, поддержка общих групп с заполняемыми полями |
Выбирайте Espanso, если вам нужна конфигурация с поддержкой скриптов и версионирования в git, которую можно перенести на любую машину.
Установите Espanso и зарегистрируйте фоновый сервис:
# macOS (macOS 11+)
brew install --cask espanso
espanso service register
espanso start
На Linux официальная документация по установке рекомендует использовать пакет .deb (скачайте через wget, затем выполните sudo apt install ./espanso-debian-x11-amd64.deb) или AppImage, после чего запустить espanso service register и espanso start; поддержка Wayland находится в экспериментальном статусе. На Windows используется установщик с espanso.org. Редактируйте сниппеты в любое время командой espanso edit, перезагружайте конфигурацию командой espanso restart.
Discover how at OpenReplay.com.
Git-сниппеты: раскрывайте команды, которые приходится набирать снова и снова
Храните git-триггеры в отдельном match-файле и позвольте :cm формировать сообщение в стиле Conventional Commits, а :undo — раскрываться в команду, которую вы никак не можете запомнить. Вот базовый статический набор:
# ~/.config/espanso/match/git.yml
matches:
- trigger: ":cm"
replace: "feat($|$): "
- trigger: ":undo"
replace: "git reset --soft HEAD~1"
- trigger: ":unstage"
replace: "git restore --staged ."
- trigger: ":wip"
replace: "chore: wip [skip ci]"
$|$ в триггере :cm помещает курсор между скобками, чтобы вы могли сразу ввести scope и продолжить работу.
Теперь сделаем сниппет контекстно-зависимым. Shell-расширение Espanso выполняет команду и вставляет её вывод, что позволяет подставлять имя текущей ветки в текст:
- trigger: ":br"
replace: "{{branch}}"
vars:
- name: branch
type: shell
params:
cmd: "git rev-parse --abbrev-ref HEAD"
Введите :br в теле коммита или комментарии к PR — и триггер раскроется в имя ветки, на которую указывает HEAD, без копирования и без риска вставить устаревшее имя.
Шаблоны PR: скелет с заполняемыми полями
Триггер :pr может раскрываться в полный шаблон с разделами Summary / Changes / Testing / Screenshots, при этом курсор через $|$ помещается в первое поле, превращая пустое поле PR в готовую форму:
- trigger: ":pr"
replace: |
## Summary
$|$
## Changes
-
## Testing
-
## Screenshots
Espanso поддерживает подсказку курсора $|$, однако на один match допускается только одна такая подсказка — дополнительные игнорируются. Документация предупреждает, что в многострочных раскрытиях подсказка может работать некорректно, поскольку Espanso симулирует нажатия клавиши со стрелкой влево, что конфликтует с автоотступами в редакторах кода. Активируйте :pr в поле описания на GitHub, а не в IDE — и поведение будет предсказуемым.
Сниппеты для AI-промптов: переиспользуемые шаблоны для LLM
Относитесь к промптам как к шаблонам коммитов: определите :review, :explain и :tests один раз и перестаньте переписывать их заново. Статические версии — это просто текст:
# ~/.config/espanso/match/ai.yml
matches:
- trigger: ":explain"
replace: "Explain the following code line by line, then note any bugs or edge cases:\n\n"
- trigger: ":tests"
replace: "Write unit tests for the following code. Cover happy path and edge cases:\n\n"
Ключевой приём — вставка только что скопированного кода. В Espanso нет встроенной переменной для выделенного текста, поэтому схема работы такова: сначала скопировать, затем активировать сниппет, который читает {{clipboard}} через расширение буфера обмена:
- trigger: ":review"
replace: "Review this code for bugs, security, and readability:\n\n```\n{{clipboard}}\n```"
vars:
- name: clipboard
type: clipboard
Выделите функцию, нажмите копировать, введите :review — и получите готовый промпт для code review в виде блока кода, который можно вставить в любую модель. Опытные пользователи могут симулировать копирование внутри shell-переменной — обходное решение от сообщества выполняет xdotool key --clearmodifiers ctrl+c перед чтением буфера обмена — однако двухшаговый подход «скопировать, затем активировать триггер» проще и переносимее.
Как работают динамические переменные Espanso
Динамический сниппет получает значение из расширения: type: date — для временных меток, type: shell — для вывода команд, type: clipboard — для {{clipboard}}. Espanso вычисляет переменные сверху вниз, поэтому последующие переменные могут использовать значения предыдущих. Согласно документации по переменным, расширения shell и script получают текущую область видимости в виде переменных окружения — именно поэтому shell-переменная может читать clipboard-переменную, определённую выше.
Такой порядок открывает возможности для композиции. Поле с датой для записи в changelog:
- trigger: ":today"
replace: "{{today}}"
vars:
- name: today
type: date
params:
format: "%Y-%m-%d"
В Espanso 2.3.0 добавлен параметр tz для расширения date, позволяющий генерировать время в любом часовом поясе IANA. Объедините shell-, clipboard- и date-переменные в одном match — и получите полноценный микроинструмент: пропустите содержимое буфера обмена через форматтер, добавьте временну́ю метку и поместите курсор туда, где продолжите ввод.
Версионируйте конфигурацию в git и делитесь ею
Поскольку конфигурация Espanso — это обычный YAML (выполните espanso path, чтобы найти каталог; на Linux это обычно ~/.config/espanso), вы можете выполнить git init для всей папки, запушить её и склонировать на каждую машину, с которой работаете. Ваши сниппеты становятся версионируемым, проверяемым артефактом, а не случайным набором настроек на конкретном ноутбуке.
Для команд публикуйте общие сниппеты для коммитов и PR в виде пакета. Espanso устанавливает пакеты из любого git-репозитория с помощью опции --git, получая их напрямую с вашего хостинга:
espanso install team-snippets --git https://github.com/your-org/espanso-snippets --external
Все участники команды получат одинаковые соглашения :cm, :pr и :review одной командой. TextExpander предоставляет аналогичную возможность через общие группы; Espanso реализует её с помощью git-инструментария, который вы уже используете.
Начните с трёх файлов — git.yml, ai.yml и шаблона PR — закоммитьте их и добавляйте новый сниппет каждый раз, когда ловите себя на повторном наборе одного и того же текста. Конфигурация будет расти вместе с вашими привычками, а паттерн «скопировать, затем активировать :trigger» — это тот единственный приём, который превращает статический экспандер в контекстно-зависимый элемент вашего рабочего процесса с git и AI.
Часто задаваемые вопросы
Чем Espanso отличается от Raycast Snippets и TextExpander?
Espanso бесплатен, имеет открытый исходный код, является кроссплатформенным и настраивается через обычный YAML, который можно версионировать в git и расширять с помощью shell-скриптов и динамических переменных. Raycast Snippets — это функция macOS-ориентированного лаунчера с динамическими плейсхолдерами. TextExpander — платный кроссплатформенный продукт, ориентированный на команды и общие группы с заполняемыми полями. Выбирайте Espanso, если вам нужна конфигурация с поддержкой скриптов и версионирования в git, которую можно перенести на любую машину.
Можно ли разместить курсор в нескольких местах после раскрытия сниппета?
Нет. Espanso допускает только одну подсказку курсора на match; любые дополнительные подсказки $|$ в той же замене игнорируются. Документация также предупреждает, что подсказка может некорректно работать в многострочных раскрытиях, поскольку Espanso симулирует нажатия клавиши со стрелкой влево, что конфликтует с автоотступами в редакторах кода. Для шаблонов PR активируйте сниппет в поле описания в браузере, а не в IDE — тогда единственный курсор будет позиционироваться предсказуемо.
Выполняется ли shell-расширение в каталоге текущего проекта, чтобы git-команды работали корректно?
Да. Shell-расширение Espanso выполняет команду в текущем рабочем контексте, поэтому type: shell с cmd, выполняющей git rev-parse --abbrev-ref HEAD, вернёт ветку того репозитория, в котором вы печатаете. Расширение вставляет стандартный вывод команды в раскрытый текст, позволяя единственному триггеру вроде :br разрешаться в актуальное имя ветки без копирования и без риска получить устаревшее значение.
Где Espanso хранит конфигурацию, чтобы я мог версионировать её в git?
Выполните espanso path, чтобы вывести каталог конфигурации, вместо того чтобы прописывать путь вручную — он различается в зависимости от операционной системы. На Linux это обычно ~/.config/espanso, на macOS используется путь в Application Support. Каталог содержит обычные YAML-файлы с match-правилами, поэтому вы можете выполнить git init для всей папки, запушить её и склонировать на другие машины. Редактируйте файлы командой espanso edit и перезагружайте конфигурацию командой espanso restart.