NeovimのIME戻し忘れ卒業――karabiner.tsでTypeScriptのキー設定!
プロンプトをeditprompt経由のNeovimで書いています。
以前よりも日本語を書く機会が増えたため、日本語関係の設定を見直しました。
「Neovim・VimでInsertモードを抜けた後、IMEが日本語のままになっていてあたふたするアレ」の対策をしました。
もともとKarabiner-Elementsで「<ESC>を押したら英数キーも送信される」という設定はしていました。が、今回を機にkarabiner.tsを使って TypeScriptで設定 を書くようにしました。
というわけでその備忘録です。
※editpromtの使い方はこちら:プロンプトを普段のエディタで書けるツールeditpromptの使い方
## karabiner.tsとは
karabiner.tsはKarabiner-Elementsの設定をTypeScriptで書けるツールです。
### メリット
筆者はKarabiner-Elementsの設定をGUIでポチポチするのが嫌だったんですが、そもそも設定は~/.config/karabiner/karabiner.jsonで管理されているようです。つまり、もともとJSONで設定はできます。
というわけでJSONと比較した時のTypeScriptのメリットは次のとおりです。
- コメントが書ける
- 関数とかで使い回せる
- 設定が大きくなっても分割可能
- 型がある
- 補完できる
- ビルド時にもチェックが走る!
### しくみ
TypeScriptに書いた設定をkarabiner.tsでJSONとしてビルドしてくれます。そいつを ~/.config/karabiner/karabiner.jsonに配置しよう、というしくみです。
## 使い方
筆者の設定は後半に書きます。まずはkarabiner.tsの使い方です。
### 既存の設定をバックアップ
念の為、もともとの設定を適当な場所にバックアップしておきます。
cp ~/.config/karabiner/karabiner.json foo### 設定を書く
karabiner.tsに従って設定を書きます。
import { map, rule, writeToProfile,} from "https://deno.land/x/karabinerts@1.37.0/deno.ts";
writeToProfile('Default', [ // 設定を書く])ここは公式ドキュメントを見るか、opensrcなどのツール経由でAIにリポジトリを見てもらうのがよいでしょう。
※opensrcについてはこちら:AIにコードを読ませるならopensrc!調査コードを一元管理
↓筆者が実際にAIに投げたプロンプトです。
https://github.com/evan-liu/karabiner.ts を使って karabinerの設定をTypeScript(Deno)化したい。opensrcで使い方と書き方(リポジトリの`docs/`とか`examples/`にある)を見てみて。移行したい設定は @~/.config/karabiner/karabiner.json に書いてある### ビルドして反映
TypeScriptの設定をビルドしてJSONを作ります。denoの場合は次のように実行します。
deno run --allow-env --allow-read --allow-write .config/karabiner/karabiner.config.tsこれで~/.config/karabiner/karabiner.jsonが更新されます。
## 筆者の設定
2026年5月30日時点での筆者の設定を書いておきます。<ESC>や<C-[>を押したときに英数キーも送信させます。
import { ifKeyboardType, map, rule, writeToProfile,} from "https://deno.land/x/karabinerts@1.37.0/deno.ts";
const karabinerJsonPath = `${import.meta.dirname}/karabiner.json`;
writeToProfile( { name: "Default profile", karabinerJsonPath, }, [ rule("Ctrl+[を押したときに、英数キーも送信する(vim用)").manipulators([ // ANSI/ISOキーボード: Ctrl+[ → Ctrl+[ + 英数キー map("[", "control") .to("[", "control") .to("japanese_eisuu") .condition(ifKeyboardType(["ansi", "iso"])), // JISキーボード: Ctrl+] → Ctrl+] + 英数キー map("]", "control") .to("]", "control") .to("japanese_eisuu") .condition(ifKeyboardType("jis")), ]),
rule("escキーを押したときに、英数キーも送信する(vim用)").manipulators([ map("escape").to("escape").to("japanese_eisuu"), ]), ],);設定内容はKarabiner-Elements complex_modifications rulesの内容の一部です。
### 解説
virtual_hid_keyboardなる設定があり、それがkarabiner.tsだと書けないようなので元のJSONとマージする形で設定してます。
dotfilesに対してシンボリックリンクを張ることで設定したい ため、ファイルの吐き出し場所もdotfiles内です。
そのため、ビルド成果物のJSONをシンボリックリンクで配置しています。
<C-o>なども対象にするかは悩み中です。
### リンク
設定全体を見たい方は次のリンクからどうぞ。
以上、karabiner.tsの使い方でした。
Karabiner-Elements本体をNixで管理できたらいいなと思ってまだ調べてないので、やったらたぶん記事書きます。