12k
All articles

Использование текстовых экспандеров для Git, PR и AI-промптов

Сниппеты Espanso для Git, PR и AI-промптов: используйте shell, буфер обмена и курсор для контекстных расширений текста.

OpenReplay Team
OpenReplay Team
Использование текстовых экспандеров для Git, PR и AI-промптов

Текстовый экспандер превращает короткий триггер вроде :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.

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.

Understand every bug

Uncover frustrations, understand bugs and fix slowdowns like never before with OpenReplay — self-hosted, with full data ownership.

Star on GitHub

We use cookies to improve your experience. By using our site, you accept cookies.