隙間を埋めるソフトウェアを理解できる大きさで
2026年6月9日 公開
左右のCommandキーを単体で押したときに、macOSの英数/かなを切り替えられるようにする小さな道具として、enkaを作りました。
このユースケースにはKarabiner-Elementsというデファクトに近い道具がありますし、同じような入力切り替えを実現できる代替Appもいくつかあります。私も長らくKarabiner-Elementsを使ってきました。
ただ、私が必要としていたのはそれらのAppで提供されている機能の中の「左右Commandの単体タップを英数/かなにする」のみでした。それ以外のキーリマップやプロファイル管理や複雑な条件分岐は、少なくともここ10年近く必要なく、使っていない機能が大半になるなら、この用途だけに閉じた小さなAppとして作れないだろうか、と思ったのがenkaを作り始めた理由です。
作り始めて最初に、最近のmacOSなら標準機能で実現できるかと思って調べてみましたがこれは難しそうでした。macOSには入力ソースを切り替えるショートカット設定や、fn/Globeキーを入力ソース切り替えに使う設定があります。modifier keysの設定もありますが、そこできるのはCaps Lock、Control、Option、Command、Globeのような修飾キーの役割を別の修飾キーに置き換えることです。左Commandの単体タップを英数、右Commandの単体タップをかな、というように左右を分けて、押しっぱなしのCommandとしての役割を残しながらtapだけ別のキーイベントにする設定は用意されていません。
macOSの権限と付き合う
標準機能ではできないのならば、何かしらのAppを作り、App側でキーイベントを観測する必要があり、キーイベントを観測するにはmacOSがAppに対してAccessibility権限を許可する必要があります。
これは手動でも可能で、システム設定アプリのプライバシー&セキュリティからアクセシビリティに進み、「+」ボタンを押して、Appを選択すればOKです。ただ、これは手間ですね。せっかく自作するのだからもっと良い体験を目指したいです。
そこでenkaではCLIだけではなくEnka.appを同梱し、そのapp bundle identityをAccessibilityの対象にしています。こうすることで、インストールプロセスの中で、Accessibilityの許可を求めダイアログがmacOSの機能で表示され、そこからシステム設定アプリのアクセシビリティ許可画面を表示し、トグルボタンを押すだけで設定が完了できるようになりました。
インストールもアンインストールも1行で
未来の自分が新しいMacのセットアップをするときに困らないように1行でインストールできるようにしました。
このinstallerはrelease archiveとchecksumを取得し、標準では~/Applications/enkaにbin/enkaとEnka.appを配置します。その後、LaunchAgentを設定し、Accessibility権限のためにEnka.appを開いて、許可されたらagentを起動します。
状態確認や再起動、アンインストールもCLIからできます。
uninstallでは、LaunchAgentとinstalled filesとstate/log directoryのように、enkaが所有しているものだけを消します。Accessibilityの許可はmacOS側の管理なので、必要ならSystem Settingsからユーザーが外します。
ここも、作っていて気にしていたところです。常駐する道具は、入れるときよりも、状態を見るときと外すときに性格が出ます。installは短くしたい。でも、何が置かれたのか、どう止めるのか、どう消えるのかは、なるべく曖昧にしたくありませんでした。
隙間を埋めるソフトウェアを理解しながら作る
詳しい仕組みまではわからないけれど、なんとなく便利で、みんなが使っているから真似してみる。そういうはじめ方は、大切ですね。最初から全部を理解していなくても、手元の不便が少し減るなら、それだけで使う理由になります。
コーディングエージェントの登場は、そこに新しい選択肢を与えてくれました。自分のユースケースにぴったり合う、小さなソフトウェアを作ることです。大きな汎用ツールを否定するのではなく、その中で自分が本当に使っている一部分だけを、もう少し自分の手に馴染む形で作ってみる。
このときに大事なのは、生成されたコードを自分で理解できる状態に留めることだと思っています。enkaのdaemonは172行です。私はSwiftをほとんど書いたことがありませんが、それでも何を見て、どこで判定して、どのkey eventを送っているのかは追えます。常駐するAppとしては小さく、読める範囲に収まっている。そのくらいで十分だと思えたことが、今回作ってよかったところでした。