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の使い方です。

### 既存の設定をバックアップ

念の為、もともとの設定を適当な場所にバックアップしておきます。

Terminal window
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の場合は次のように実行します。

Terminal window
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で管理できたらいいなと思ってまだ調べてないので、やったらたぶん記事書きます。