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つ並べるより、大分見やすくなりました。

vscodeのbeep音を止める(Mac)

いつからかvscodebeep音が頻繁に鳴るようになっていました。 Accessibility Support をオフにするといいらしいということで、その機能を止めていたのですが、
行を下に移動するショートカット(control + command + ↓)実行時にまだ音が鳴っていました。

このショートカットは割と頻繁に利用するので、なんとしてでも止めたいということで、再びググってみました。
(ちなみにMacのOSはSonoma 14.4)

結論

~/Library/KeyBindings/DefaultKeyBinding.dict ファイルを作成し、vscodeを再起動するとbeep音が消せる。

{
    "@^\UF701" = "noop:";
    "@^\UF702" = "noop:";
    "@^\UF703" = "noop:";
    "@~^\UF701" = "noop:";
}

DefaultKeyBinding.dict とは

ザリガニさんの記事が詳しいのですが、なんとMacではkeybindを変更できる機能が備わっていました。
テキスト編集のキー操作を自在にコントロールする - ザリガニが見ていた...。

~/Library/KeyBindings/DefaultKeyBinding.dict におくことでデフォルトを上書きしてくれるとのこと。

設定内容

こちらにコメント付きで紹介されています。 My DefaultKeyBinding.dict for Mac OS X

^ : Ctrl
$ : Shift
~ : Option (Alt)
@ : Command (Apple)

Down Arrow:   \UF701
Left Arrow:   \UF702 
Right Arrow:  \UF703

参考

keyboard shortcuts - How to stop macOS from making bell sound on moving line down in Visual Studio Code? - Super User

こちらに上記の内容が記載されています。
ただ、以下のkeybindingだと私の環境では、うまくいきませんでした。

{
  "^@\UF701" = "noop";
  "^@\UF702" = "noop";
  "^@\UF703" = "noop";
}

先に記載した、@^の順だと動作しました。sonoma用にはこうする必要があったと記載されています。

Macでspace2回押したら「.(ドット)」に変換されるのをやめる方法

いつからか記憶にないのですが、Macでtext書いててspace2回押したら「.(ドット)」に変換されてるのがうざいので、止めてみました。

f:id:rochefort:20220104213521p:plain

ここの「スペースバーを2回押してピリオドを入力」のチェックをoff。
英文書く人にはある方が嬉しいのだろうか?ほとんどの人いらんよね。