※使用環境: Goku 0.2.5, Karabiner-Elements 12.4.0, jq 1.5, macOS 10.13.6
インポート用の設定ファイルを作る理由
GUIのみでルールをON/OFFしたい
Karabiner-Elementsは、旧Karabinerと違い、設定画面から特定のルールをON/OFFする機能がありません。インポート用の設定ファイルを作って、~/.config/karabiner/assets/complex_modificationsに保存しておけば、擬似的にではありますが、設定画面からON/OFFを切り替えられるようになります。
特定のルール設定を共有したい
インポート用の設定ファイルを作っておけば、gistなどを使って簡単に設定を共有することができます。
設定ファイルの共有には、公式サイトを使う方法もありますが、結構重い手順を踏む必要があるのと、Karabiner-Elementsの以外の知識が必要になってくるため、ちょっとした設定をサクッと共有したい場合には向きません。
また複数のProfileで同じルールを共有したい場合にも活用できます。
Gokuからkarabiner.jsonを直接更新したくない
既存のルールをすべてGokuに移行するまでの間は、Gokuからkarabiner.jsonを直接更新してしまうと移行前のルールが消えて困ることになります。Gokuを使って記述したルールを、インポート用の設定ファイルに書き出して、Karabiner-Elementsの設定画面からルールを追加するようにすれば、そういった問題を避けられます。
手順
- Gokuでルールを記述
-
gokuの--dry-run-allオプションとjqを使って、インポート用設定ファイルを生成 -
assets/complex_modificationsに配置して、Karabiner-Elementsへ反映
1. Gokuでルールを記述
- インポート用設定ファイルにしたいルールを、Gokuを使って記述します
{:main [{:des "[Terminal] Cmd+S -> Ctrl+S" :rules [[:!Cs :!Ts :terminal]]}
{:des "[Terminal] Cmd+T -> Cmd+T, EISUU" :rules [[:!Ct [:!Ct :japanese_eisuu] :terminal]]}]
:applications {:terminal ["^com\\.googlecode\\.iterm2$" "^com\\.apple\\.Terminal$"]}}
2. goku --dry-run-allとjqを使って、インポート用設定ファイルを生成
-
goku --dry-run-allは、生成したkarabiner.jsonを標準出力に書き出します - その結果をpipeで
jqに渡して、インポート用設定ファイルを生成します
$ GOKU_EDN_CONFIG_FILE=sample_rules.edn
$ goku --dry-run-all \
| jq --arg profile "Default" '(.profiles | map(select(.name == $profile))[0] | .complex_modifications.rules)' \
| jq --arg title "Sample Rules" '{"title": $title, "rules": .}' \
> sample_rules.json
3. Karabiner-Elementsへの反映
-
assets/complex_modificationsにインポート用設定ファイルを配置して、Karabiner-Eelementsへ反映します。
$ cp -p sample_rules.json ~/.config/karabiner/assets/complex_modifications/
- Karabiner-Elementsの設定画面から「Complex Modifications」を選択し、左下の「Add rule」ボタンをクリックすると、作成したルールが追加可能になっていることが確認できます。
補足
シェルスクリプト
設定ファイル名とtitle名を渡して実行すれば、Karabiner-Elementsへ反映する簡易的なシェルスクリプトです。中身はこの記事で書いている内容と同じです。使い方は-hオプションで表示されるヘルプを確認してください。
$ ./generate_json.sh -h
インポート用設定ファイルの構造
公式サイトにあるインポート用設定ファイルの中身を確認すると、JSONの構造は以下のようになっています。1
{
"title": "Sample Rules",
"rules" : [ {
"description" : "Rule1",
"manipulators" : [ ... ]
}, {
"description" : "Rule2",
"manipulators" : [ ... ]
}]
}
-
"title"はインポート用設定ファイル特有の記述で、設定画面で「Add Rule」をクリックした時に表示される -
"rules"以下はkarabiner.jsonのcomplex_modifications.rulesと同じ
karabiner.jsonの構造
"complex_modifications"の"rules"のみがインポート用設定ファイルに必要な箇所です。
{
"global": { ... },
"profiles" : [ {
"name" : "Sample1",
"simple_modifications" : [ ... ],
"complex_modifications" : {
"rules" : [ { // <-- この"rules"だけが必要
"description" : "Rule1", //
"manipulators" : [ ... ] //
}, { //
"description" : "Rule2", //
"manipulators" : [ ... ] //
}] //
},
...
}, {
"name" : "Sample2",
"simple_modifications" : [ ... ],
...
}]
}
参考資料
- pqrs-org/KE-complex_modifications
- Karabiner-Elements単体で親指シフト定義ファイルを作るジェネレーター
- Karabiner-Elementsの設定項目をまとめました#設定ファイルの保存場所について
- Karabiner-Elementsの設定が超絶楽になるDSL「Goku」
- jq Manual
-
公式ドキュメントには、インポート用設定ファイルの定義についての記載はありませんでした。 ↩
