12k
All articles

テキストエクスパンダーをGit、PR、AIプロンプトに活用する

Git、PR、AIプロンプト向けのEspansoスニペット。shell、クリップボード、カーソル指定で文脈対応のテキスト拡張を作れます。

OpenReplay Team
OpenReplay Team
テキストエクスパンダーをGit、PR、AIプロンプトに活用する

テキストエクスパンダーとは、:cm のような短いトリガーを入力すると、コミットメッセージ、PRの説明、LLMプロンプトなど、あらゆる入力フィールドで完全なテキストブロックに展開してくれるツールです。これにより、同じ定型文を一日に何十回も入力し直す手間がなくなります。開発者向けの最有力候補は Espanso です。Rustで書かれた無料のオープンソース・クロスプラットフォームエクスパンダーで、設定はすべてプレーンなYAMLで記述でき、gitでバージョン管理することができます。本記事はすぐに使えるクックブックとして構成されており、gitコマンド、PRのスケルトン、再利用可能なAIプロンプトのための実際のEspansoスニペットに加え、静的なテキストをコンテキスト対応のツールへと変える3つの動的な機能——シェル出力、クリップボードの注入、カーソル配置——についても解説します。

重要なポイント

  • Espansoは、Rustで書かれた無料のオープンソース・クロスプラットフォームテキストエクスパンダーです。macOSでは brew install --cask espanso(macOS 11以降)、Linuxでは .deb パッケージまたはAppImage、Windowsでは公式インストーラーを使ってインストールできます。
  • コミットスニペットをコンテキスト対応にするには、git rev-parse --abbrev-ref HEAD を実行するシェル変数を使って現在のブランチを注入します。これにより、トリガーを展開すると常に実際に作業中のブランチ名が挿入されます。
  • Espansoは展開後のカーソル位置を $|$ ヒントで指定できますが、1つのマッチに定義できるヒントは1つだけです。また、自動インデント機能を持つエディターでは誤動作することがあるため、PRのスケルトンはブラウザの説明欄で使用することを推奨します。
  • Espansoにはネイティブの「選択テキスト」変数がありません。そのため、まずコードをコピーしてから、{{clipboard}} を参照するスニペットをトリガーすることで、ハイライトした関数をLLMプロンプトにラップします。
  • 設定がプレーンなYAMLであるため、ディレクトリ全体をgitリポジトリでバージョン管理し、チームのスニペットをプライベートなEspansoパッケージとして共有することができます。

テキストエクスパンダーが開発ワークフローに必要な理由

テキストエクスパンダーとは、キーストロークを監視し、定義されたトリガーをより長い(オプションで動的な)テキストブロックにシステム全体で置き換えるツールの総称です。コンベンショナルコミット、PRの説明、定期的なプロンプトなど、同じテンプレートテキストを繰り返し入力する作業が多い場合、その効果はすぐに実感できます。テキストエクスパンダーはメールの署名で初めて使う人が多いですが、ターミナルとGitHubを行き来する作業の多くが定型文であるため、開発者にとってのメリットはさらに大きいと言えます。

主要なツールは3つあります:

ツールプラットフォーム特徴
Espansoクロスプラットフォーム、オープンソースプレーンYAML設定、シェルと動的変数によるスクリプト対応——本記事での採用ツール
Raycast SnippetsmacOS中心動的プレースホルダーを備えたランチャー機能
TextExpanderクロスプラットフォーム(有料)チーム向け、共有フィルイングループ対応

スクリプト対応かつ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 registerespanso start を実行します。なお、Waylandのサポートは実験的な段階です。Windowsではespanso.orgのインストーラーを使用します。スニペットの編集は espanso edit、設定の再読み込みは espanso restart で行います。

Gitスニペット:繰り返し入力するコマンドを展開する

マッチファイルにgitのトリガーを保存し、:cmConventional 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$|$ は括弧の間にカーソルを配置するため、スコープを入力してそのまま続けることができます。

次に、スニペットをコンテキスト対応にしましょう。Espansoの シェル拡張機能 はコマンドを実行してその出力を挿入するため、現在のブランチ名をテキストに埋め込むことができます:

  - trigger: ":br"
    replace: "{{branch}}"
    vars:
      - name: branch
        type: shell
        params:
          cmd: "git rev-parse --abbrev-ref HEAD"

コミット本文やPRのコメントで :br と入力すると、HEAD が指しているブランチ名に展開されます。コピー&ペーストも、古いブランチ名の混入も不要です。

PRテンプレート:穴埋め式のスケルトン

:pr トリガーを使えば、Summary / Changes / Testing / Screenshots という完全なスケルトンに展開し、$|$ で最初のフィールドにカーソルを配置することができます。これにより、空白のPR入力欄がフォームのように機能します:

  - trigger: ":pr"
    replace: |
      ## Summary
      $|$

      ## Changes
      -

      ## Testing
      -

      ## Screenshots

Espansoは $|$ カーソルヒントをサポート していますが、1つのマッチに定義できるヒントは1つだけで、追加のヒントは無視されます。また、Espansoが左矢印キーの押下をシミュレートして動作するため、自動インデント機能を持つコードエディターと競合し、複数行の展開で誤動作することがあるとドキュメントに記載されています。:pr はIDEではなくGitHubの説明欄のtextareaでトリガーすることで、カーソルが確実に正しい位置に配置されます。

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 と入力するだけで、任意のモデルにそのまま貼り付けられるフェンス付きコードレビュープロンプトが生成されます。上級ユーザーはシェル変数内でコピーをシミュレートすることもできます——コミュニティのワークアラウンド では、クリップボードを読み取る前に xdotool key --clearmodifiers ctrl+c を実行する方法が紹介されています——が、「コピーしてからトリガー」という2ステップの操作の方がシンプルで移植性も高いです。

Espansoの動的変数の仕組み

動的スニペットは拡張機能から値を読み取ります。タイムスタンプには type: date、コマンド出力には type: shell、クリップボードには {{clipboard}} を使う type: clipboard を指定します。Espansoは変数を上から下の順に評価するため、後の変数が前の変数の値を利用することができます。変数のドキュメント によると、シェルおよびスクリプト拡張機能は現在のスコープを環境変数として受け取るため、シェル変数がその上で定義されたクリップボード変数を参照することが可能です。

この順序付けにより、変数の組み合わせが可能になります。チェンジログエントリー用の日付フィールドの例:

  - trigger: ":today"
    replace: "{{today}}"
    vars:
      - name: today
        type: date
        params:
          format: "%Y-%m-%d"

Espanso 2.3.0では、任意のIANAタイムゾーンで時刻を生成するための tz パラメーター が日付拡張機能に追加されました。シェル、クリップボード、日付変数を1つのマッチに組み合わせることで、本格的なマイクロツールを実現できます。クリップボードの内容をフォーマッターに通し、タイムスタンプを付与し、続きを入力する位置にカーソルを配置するといったことが可能です。

設定を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

これにより、チーム全員がコマンド1つで同じ :cm:pr:review の規約を使えるようになります。TextExpanderも共有グループで同様の機能を提供していますが、EspansoはすでにチームでRunしているgitのツールを活用してこれを実現します。

まず git.ymlai.yml、PRスケルトンの3つのファイルから始め、それらをコミットし、何かを繰り返し入力していることに気づいたらスニペットを追加していきましょう。設定はあなたの習慣とともに成長していきます。そして「コピーしてから :トリガー」というクリップボードパターンこそが、静的なエクスパンダーをgitおよびAIワークフローのコンテキスト対応ツールへと変える決め手となります。

よくある質問

EspansoはRaycast SnippetsやTextExpanderとどう違いますか?

Espansoは無料のオープンソース・クロスプラットフォームツールで、プレーンなYAMLで設定を記述でき、gitでバージョン管理してシェルや動的変数でスクリプト化することができます。Raycast Snippetsは動的プレースホルダーを備えたmacOS中心のランチャー機能です。TextExpanderはチームや共有フィルイングループ向けの有料クロスプラットフォーム製品です。スクリプト対応かつgitでバージョン管理できる設定をすべてのマシンで共有したい場合はEspansoを選びましょう。

スニペット展開後に複数の場所にカーソルを配置することはできますか?

いいえ。Espansoでは1つのマッチに対してカーソルヒントを1つしか定義できず、同じ置換文字列内の追加の $|$ ヒントは無視されます。また、Espansoが左矢印キーの押下をシミュレートするため、自動インデント機能を持つコードエディターと競合し、複数行の展開でヒントが誤動作することがあるとドキュメントに記載されています。PRのスケルトンについては、IDEではなくブラウザの説明欄のtextareaでスニペットをトリガーすることで、単一のカーソルを確実に正しい位置に配置できます。

シェル拡張機能はプロジェクトディレクトリ内で実行されるため、gitコマンドは機能しますか?

はい。Espansoのシェル拡張機能は現在の作業コンテキストでコマンドを実行するため、git rev-parse --abbrev-ref HEAD を実行する type: shell は、現在入力しているリポジトリのブランチを返します。拡張機能はコマンドの標準出力を展開結果に挿入するため、:br のような単一のトリガーがコピー&ペーストなしに、かつ古い値なしに、ライブのブランチ名に解決されます。

gitでバージョン管理するために、Espansoはどこに設定を保存しますか?

espanso path を実行すると設定ディレクトリが表示されます。場所はOSによって異なるため、パスをハードコードするよりもこのコマンドを使うことを推奨します。Linuxでは通常 ~/.config/espanso、macOSではApplication Supportのパスが使用されます。このディレクトリにはプレーンなYAMLのマッチファイルが格納されているため、フォルダー全体を 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.