Tech Racho エンジニアの「?」を「!」に。
  • IT Tips

Espansoツールで定形テキストを爆速で入力する

最近導入したEspansoという定形テキスト入力ツールがとてもよかったので使い方も含めて記事にしました。TechRachoを始めとする文章の定型文やテンプレートを入力するうえでとても重宝しています。

espanso/espanso - GitHub


Espansoを使う前はDash for macOSというツールを使っていました。お急ぎの方は「そしてEspansoを見つけた」までスキップいただけます。

経緯: Dash for macOSを使っていた頃

かれこれ10年近く、Dash for macOSという有料ツールの定形テキストスニペット機能を使ってきました。Dash for macOSは本来はAPIドキュメントの串刺し検索ツールですが、私の場合はいつの頃からか付録的な定形テキストスニペット機能しか使わなくなりました。

当時Dash for macOSを選んだ理由は「特定のエディタやブラウザに縛られない」「長めの定型文も入力できる」「日付やクリップボードの内容を定型文に追加できる」「挿入後のカーソル位置も指定できる」といった理由でした。

他のツールじゃだめなの?

もちろんVimやVSCodeなどのエディタやRubyMineなどのIDEなら、テキストスニペットを作って使う方法は探せばいくらでもあります。その代わり、機能がそのエディタやIDEにロックインされるので、他のアプリケーションで利用できなくなってしまいます。

私の場合、WordPress、VSCode、iTerm2、ブラウザを問わずテキストスニペットを透過的に使いたいので、エディタやブラウザに依存するツールにはしたくありませんでした。

絵文字程度ならIMEに登録する方が早いのですが、今後IMEを乗り換えるときの手間が増えますし、IMEは記事テンプレートのような長いテキストを登録するには不向きです。

乗り換えを決意するまで

しかしここ数年、Dash for macOSをWordPressの入力画面で使っていると、記事の文字数がきっかり10,000字を超えたときに、そこから下の領域ではテキストスニペットがなぜかトリガーされなくなるという不具合がずっと生じていました。
お金を払っていたこともあって作者にも何度かフィードバックしたのですが、これについては返信がありませんでした(以前は問い合わせに返信をもらえていたのですが)。

また、Dash for macOSでは、テキストスニペットに挿入される現在日付や日時のフォーマットはグローバルにしか設定できません。スニペットごとに2023-11-17とか2023年11月17日とか20231117といった日付フォーマットを使い分けられないのも不満な点でした。これまでは仕方なく日付フォーマットを手動で書き直していました。

さらに、とうとう最近になってDash for macOSのダッシュボードで課金を促すメッセージが表示されるようになりました。どうやら1回売り切りから課金制に変わったようです。

そういうわけで、Dash for macOSに代わる定形テキスト入力ツールを探すことにしました。

ツールに求める条件

必須:

  • 定形テキスト入力に特化したツールであること
  • 修飾キーを使わずに利用できること
  • エディタやブラウザに依存せずに、あらゆるテキスト入力で使えること
    • Chrome拡張もブラウザに縛られるので不可
  • 日付やクリップボードやIPアドレスなどの自動入力が可能であること
  • 動作やセットアップがなるべくシンプルであること

できれば:

  • macOS以外でも使えると嬉しい
  • 日付フォーマットなどをカスタマイズできると嬉しい
  • オープンソースだと嬉しい
  • 軽量だと嬉しい

不要:

  • ランチャーのたぐい
  • GUIマクロやウィンドウ操作マクロのたぐい
  • AppleScript

🔗 そしてEspansoを見つけた

「keymacro macOS」や「Dash for macOS alternative」などのキーワードでググってもなかなかこれといったものが見つかりませんでしたが、ようやっと以下の記事で探し当てた「Espanso」というツールが自分の目的にピッタリだったので、Espansoに乗り換えることにしました。

参考: How to use a text expander: A definitive guide | OSlash

記事によると、どうやら私が探していたようなテキスト作成を支援するツールは、一般に"text expander"と呼ばれるようですね。今後ググる人の参考までに。

なお、Espansoはスペイン語で、英語でいう"expanded"に相当するようです。

Espansoの特徴

  • オープンソース(GPL)
    • 寄付ページがありますので、使う方はお心付けをどうぞ
  • Rustで書かれている(★8000超え)
    • フォーム表示やクリップボード周りはC++のGUIライブラリを使っているようです
  • Mac(M1含む)/Windows/Linuxを問わず使える
  • バイナリをダウンロードしてインストールすることも、Homebrewのcaskでインストールすることも可能
  • 設定はすべてyamlファイルで行う
    • GUIのコンフィグ画面はありません
  • カスタマイズ機能がめちゃくちゃ強力
    • フォームGUIを表示したりもできる
    • シェルコマンドを実行して結果を貼り付けたりもできる
  • 動作がきびきびしている
  • ドキュメントが充実している

インストール

macOSでのインストール方法のとおりにすればインストールできます。自分はHomebrew caskでインストールしました。

brew tap espanso/espanso
brew install espanso

インストールするとEspansoが常駐するので、権限の許可を求めるダイアログが表示されます。

使い方

Espansoの設定はひたすらyamlファイルで行います。
yaml記法に慣れている人ならすぐにでもカスタマイズできると思います。私はyamlに慣れていなかったので、インデントのずれやヒアドキュメント周りでハマりました。

参考: プログラマーのための YAML 入門 (初級編)

ドキュメントに一通りのことは書かれているので、ツールの目的に沿って使っていれば困ることはほぼないと思います。

設定ファイルであるbase.yml↓を見れば、だいたい何ができるかはわかると思います。

# espanso match file

# For a complete introduction, visit the official docs at: https://espanso.org/docs/

# You can use this file to define the base matches (aka snippets)
# that will be available in every application when using espanso.

# Matches are substitution rules: when you type the "trigger" string
# it gets replaced by the "replace" string.
matches:
  # Simple text replacement
  - trigger: ":espanso"
    replace: "Hi there!"

  # NOTE: espanso uses YAML to define matches, so pay attention to the indentation!

  # But matches can also be dynamic:

  # Print the current date
  - trigger: ":date"
    replace: "{{mydate}}"
    vars:
      - name: mydate
        type: date
        params:
          format: "%m/%d/%Y"

  # Print the output of a shell command
  - trigger: ":shell"
    replace: "{{output}}"
    vars:
      - name: output
        type: shell
        params:
          cmd: "echo 'Hello from your shell'"

  # And much more! For more information, visit the docs: https://espanso.org/docs/

yamlを更新すると即座に反映されるのもありがたい点です。yamlに構文エラーがある場合はその場でエラーがダイアログボックスで表示されます。

コツ: キーワードはセミコロンで開始しよう

Dash for macOSとEspanso両方で通用するテクニックとして、私は定型文のトリガーとなるキーワードを必ずセミコロン;で開始するようにしています。通常の文章ではセミコロン;で始まる文字列を入力することはないので、通常のテキスト入力の邪魔にならずに済みます。

たとえば;waraと入力すると😆に置き換えられるといった具合です。

シェルで;を使うときは、誤動作を防ぐため後ろにスペースを入れるようにしています。

使える機能の例

以下はほんの一部です。上述したように、自分はトリガー名を常にセミコロン;で始めるようにしています。

  • 現在の日付を定型文で利用する
  - trigger: ";date"
    replace: "{{mydate}}"
    vars:
      - name: mydate
        type: date
        params:
          format: "%m/%d/%Y"
  • 定型文置き換え後のカーソル位置を$|$で指定する
  - trigger: ";cite"
    replace: "> <cite>$|$より</cite>"
  • クリップボードを取り込んで定型文で利用する
  - trigger: ";api"
    replace: "参考: Rails API {{clipboard}}"
    vars:
      - name: "clipboard"
        type: "clipboard"
  • 定型文の可変要素をフォームで入力する
  - trigger: ";ikari"
    replace: "<a id='{{ikari1.num}}' href='#{{ikari1.num}}'>🔗</a> "
    vars:
      - name: "ikari1"
        type: form
        params:
          layout: "Enter the anchor: [[num]]"

  • 応用編: クリップボードにあるURLをsedなどで加工して定型文で利用する

これが最も欲しかった機能でした😂。

  - trigger: ";bn"
    replace: "([ウォッチ{{pubdate}}]({{shorturl}}))"
    vars:
      - name: "clipboard"
        type: "clipboard"
      - name: pubdate
        type: shell
        params:
          cmd: 'echo {{clipboard}}| sed "s/.*hachi8833\///" | sed "s/\/.*//"|tr -d "_"'
          shell: sh
      - name: shorturl
        type: shell
        params:
          cmd: 'echo {{clipboard}}| sed "s/^https:\/\/techracho.bpsinc.jp//"'
          shell: sh

上は、TechRachoのアンカー付きURLをクリップボードにコピーしてから;bnと入力すると、日付をURLから抽出してmarkdown形式のリンクに変換する設定です。

使ってみて

Espansoは動作はきびきびしていて大変快適です。macOSでは今のところ不安定な要素も見当たりません。Dash for macOSはGUIアプリでしたが、EspansoはRustで書かれたCLIツールである点が軽快さに貢献していそうです。

唯一、クリップボードにコピーしたテキストがあまりに長すぎると、挿入テキストで展開されたときに途中で途切れることがありましたが、これはEspansoが原因なのかmacOSのクリップボードAPIが原因なのかよくわかりません。

ちゃんと測定したわけではないので根拠はありませんが、Dash for macOSを常駐させていたときよりも心なしかMacbook全体の動作が少し軽快になったような気もします(特にコマンド+Tabによるアプリの切り替え)。

置き換え元のキーワードをdeleteで1文字ずつ削除できる

動画でどこまで伝わるかわかりませんが、ひとつ驚いたことがあります。

Espansoで入力したスニペットは、何と直後にdeleteキーを1回押せば元のキーワードに戻るので、そのまま1文字ずつ削除して別のキーワードに変更できます(Dash for macOSはこのような動作ではありませんでした)。

どうやらキーワード入力とEspansoによる置き換えも含めてエディタのUndoバッファが効いているようです(あるいはEspansoが置き換え後もしばらく監視しているのかもしれません)。



この操作性は地味ながらとても気に入りました😋。


なお、置き換えに続けて他の文字や定型文を入力したり、フォーカスが別のテキストフィールドやアプリに移動すると、deleteキーで削除してもキーワードには戻らなくなり、通常の文字として削除されます。これは自然な動作だと思います。

また、入力後のカーソル位置を$|$で変更した場合も、deleteキーで削除したときにキーワードに戻りません。これも自然な動作だと思います。

Espansoに向いてないと思われる作業

記事ではキーマクロで検索したと書きましたが、Espansoは、いわゆるマウスや修飾キーを使ったGUI操作のキーマクロ化まではあまり想定していないと思われます。少なくとも私は、あくまでテキスト定型文の自動入力用だと考えています。

GUI操作を自動化したい場合は、たとえば以下のようなツールの方が向いていると思います。

また、Espansoはシェルを呼び出してコマンドを実行することも可能なので、原理的にはシェルコマンドやAppleScriptなどを呼び出して各種自動化といったこともやろうと思えばできますが、自分はシェル呼び出しは止むを得ない場合を除いてなるべく使わないようにしています。AppleScriptはあまり速くないのとメンテナンスが意外に面倒なので、macOS固有のAPIを操作するときでもない限り使っていません。

ランチャー的な機能についても、自分は既にAlfredを使っているので、Espansoでやろうとは思いません。

GitHub CopilotなどのAI支援機能がどんどん強力になっている現在、ソースコードの定型文入力に使うこともあまりなさそうですね。

留意点

オープンソースでありユーザーが多い点は好材料ではありますが、この種の「ユーザーのキー操作イベントをインターセプトして差し替える」ツールはコンピュータ上でそれなりに強い権限を必要とするので、セキュリティ面ではEspansoのアップデート情報に一応気をつけておきたいと思います。

一応Homebrewのメッセージでは、更新のたびに必ず権限を再度許可しなければならないようになっているので、少なくとも自分の知らない間にEspansoが更新されることはないはずです。

espanso is not signed and requires Accessibility access,
so you will need to re-grant Accessibility access every time the app is updated.

Enable or re-enable it in:
  System Preferences → Security & Privacy → Privacy → Accessibility
To re-enable, untick and retick espanso.app.

関連記事

Mac: Coherence XでChromeブラウザを用途ごとにアプリ化する



CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。