Espanso の設定ファイル base.yml を直接編集するのは面倒だったので、ブラウザ上で直感的に管理できる Web アプリ Espanso Manager を作りました。

この記事では、開発に至った経緯と技術的なポイントを紹介します。


    Espanso Manager とは

    Espanso は、テキスト展開(スニペット)ツールです。:date; と入力すると今日の日付に展開される、といった使い方ができます。

    無料で使えるオープンソースのスニペットツール「Espanso」|導入から使い方 PhraseExpressやaTextの代替に最適な、無料・オープンソースのテキスト展開ツール「Espanso」を紹介。インストール方法、基本的な使い方、YAMLでのスニペット登録、特殊文字(n, t, rn)の書き方、macOS/Windowsでのト...  続きを読む

    ただ、スニペットが増えてくると YAML ファイルの直接編集 が辛くなってきます。

    • 数百件のスニペットから登録したスニペットを検索したいことがある
    • GUI上でスニペットを編集・追加・削除したい

    Espanso Manager は、これらの問題を解決するために作った GUI ツールです。


    作成のきっかけ

    aText からの移行で感じた不便さ

    以前は Mac で aText を使っていました。
    Espanso に移行したとき、機能自体には満足したものの、管理面での不便さ を感じました。
    「aText みたいな GUI があれば...」と思い、作ることにしました。

    Espanso 自体にも espanso edit コマンドがありますが、結局はテキストエディタが開くだけです。

    grep や sed で検索・置換する方法もありますが、日常的なスニペット管理 にはオーバーキル。もっとカジュアルに「あのスニペットどこだっけ?」「ちょっと直したい」ができる環境が欲しかったのです。


    主な機能

    2ペイン構成のエディタ

    左ペインにスニペット一覧、右ペインに編集エリア。aText や Alfred のスニペット管理画面に近い構成です。

    検索・ソート・カテゴリフィルタ

    • 検索なtrigger と replace の両方を対象に部分一致検索
    • ソートなA→Z / Z→A / 元の順序 を切り替え
    • カテゴリフィルタなトリガーのプレフィックス(:, ::, <?, <, $ など)で自動分類

    カテゴリは Espanso の一般的な命名規則に基づいて自動判定されます。例えば :ai; は CSS Property、::bef; は Pseudo Element、<?php は PHP といった具合です。

    YAML / CSV のインポート・エクスポート

    • YAMLなEspanso の base.yml をそのまま読み込み・書き出し可能
    • CSVなタブ区切りの独自形式。Excel やスプレッドシートでの一括編集に便利

    キーボードショートカット

    • Cmd + S / Ctrl + S: 保存
    • Tab: テキストエリア内でタブ文字を挿入(フォーカス移動ではなく)

    技術的なポイント

    技術スタック

    React 18 + TypeScript (strict)
    Vite(ビルド / 開発サーバー)
    Vitest(テストフレームワーク)
    lucide-react(アイコン)
    

    状態管理は React hooks のみで完結。小規模なアプリなので、Redux や Zustand は使っていません。

    自前の YAML パーサー

    最大のこだわりポイント です。

    一般的な YAML パーサー(js-yaml など)を使うと、改行コードが正規化 されてしまいます。rnn に変換されたり、末尾の改行が消えたりする。

    Espanso のスニペットでは、置換テキストに 意図的な rn を含めることがあります。Windows 環境向けのテンプレートや、特定のアプリに貼り付ける定型文など。

    これを壊さないために、Espanso 固有の YAML 形式に特化した自前パーサー を実装しました。

    // リテラルブロック(|)の正確なパース
    // rn を含む複数行テキストをそのまま保持
    

    ラウンドトリップテスト(読み込み → 書き出し → 再読み込み)で、元ファイルと完全一致 することを確認しています。

    カテゴリ自動判定

    トリガーのプレフィックスを見て、14 種類のカテゴリに自動分類します。

    const CATEGORY_RULES = [
      { prefix: '::', category: 'Pseudo' },
      { prefix: ':', category: 'CSS Prop' },
      { prefix: '.', category: 'CSS Class' },
      { prefix: '<?wp', category: 'WordPress' },
      { prefix: '<?', category: 'PHP' },
      { prefix: '<', category: 'HTML' },
      { prefix: '___PRE_BLOCK_2___#39;, category: 'JavaScript' },
      { prefix: '%', category: 'Bash' },
      { prefix: '#@', category: 'Markdown' },
      { prefix: '#!', category: 'Python' },
      { prefix: '#', category: 'Shell' },
      { prefix: '&', category: 'Symbol' },
      { prefix: '@', category: 'At-rule' },
    ];
    

    どのルールにもマッチしない場合は General に分類。自分の使い方に合わせたルールですが、多くの Espanso ユーザーにも使いやすいはずです。

    未保存インジケーター

    編集中に変更があると「● 未保存」と表示。別のスニペットを選択すると自動保存されるので、保存忘れの心配がありません。


    使い方

    セットアップ

    git clone https://github.com/sarap422/tool-espanso-manager.git
    cd tool-espanso-manager
    npm install
    npm run dev
    

    ブラウザで http://localhost:5173 が開きます。

    基本的な流れ

    1. Import ボタンで base.yml を読み込む
    2. 左ペインで検索・フィルタして目的のスニペットを探す
    3. 右ペインで編集して保存
    4. .yml ボタンでエクスポート
    5. エクスポートした base.yml を Espanso の設定フォルダ(/Users/user-name/Library/Application Support/espanso/match/base.yml)に配置

    今後の予定

    • スニペットの重複チェック
    • Electron でのデスクトップアプリ化

    まとめ

    Espanso Manager を使えば、ブラウザ上で aText のように直感的にスニペットを管理できます。特に以下のような方におすすめです。

    • スニペットが 100 件を超えている
    • 複数行の置換テキストをよく使う
    • カテゴリ別に整理したい

    試してみてください。


    関連記事

    無料で使えるオープンソースのスニペットツール「Espanso」|導入から使い方 PhraseExpressやaTextの代替に最適な、無料・オープンソースのテキスト展開ツール「Espanso」を紹介。インストール方法、基本的な使い方、YAMLでのスニペット登録、特殊文字(n, t, rn)の書き方、macOS/Windowsでのト...  続きを読む

    関連リンク