Karabinerで設定ファイルにJavaScriptが書けるようになっていた

ここしばらくはMacのKarabiner-ElementsをKeyのRemapツールとして利用しています。
MacのKey mapping変更にはKarabiner-Elementsが便利 - rochefort's blog
具体的には、vim likeなカーソル移動が好みなので ctrl + h/j/k/l を矢印にRemapしてたりします。

このアプリは対象外にしたというような場合、設定ファイルにJSONの定義を追加することで実現できたりするのですが、 似たような設定が冗長だなと思っていました。

久しぶりにこのJSONを変更する必要が出てきたので、どういうふうに書くんだっけとググると、なんとJSONでなくJavaScriptが書けるようになってました。

Add your own complex modifications (using JavaScript) | Karabiner-Elements
※ ただし、現時点では beta版のみ。

ということで早速使ってみます。

beta版自体は、設定画面の「Update」からインストールできます。
インストールすると、いつものアクセシビリティの許可をしてあげればOK。
余談ですが、Trackpadもremap対象になってそうです。

テンプレートコメントにもあるように「EcmaScript 5.1」と結構古い書き方でないとエラーとなるので要注意です。

例:iTerm2以外を対象にする

function main() {
    const keyMappings = [
        { from: "h", to: "left_arrow"},
        { from: "j", to: "down_arrow"},
        { from: "k", to: "up_arrow"},
        { from: "l", to: "right_arrow"},
    ]

    const disableBundleIdentifiers = [
        "^com\\.googlecode\\.iterm2$"
    ]

    var manipulators = keyMappings.map(function(mapping) {
        return {
            "conditions": [
                {
                    "input_sources": [{ "language": "ja" }],
                    "type": "input_source_unless"
                },
                {
                    "type": "frontmost_application_unless",
                    "bundle_identifiers": disableBundleIdentifiers
                }
            ],
            "from": {
                "key_code": mapping.from,
                "modifiers": {
                    "mandatory": ["control"],
                    "optional": ["caps_lock", "command", "option", "shift", "fn"]
                }
            },
            "to": [{ "key_code": mapping.to }],
            "type": "basic"
        }
    })

    return {
        "description": "Vi Mode [left_control + jkhl]",
        "manipulators": manipulators
    }
}

main()

keymapの設定4つ並べるより、大分見やすくなりました。