はじめに
hkob の雑記録の第197回目は、Karabiner-Elements の Complex Modifications で私が追加した3つの機能を説明します。
alt-z to @a for vim
私はエディタに vim を使っていましたが、最近は VSCode だったり、RubyMine, PyCharm などの IDE を使うことも増えました。当然ながらそれらにも Vim 機能拡張や IdeaVim などの Vim プラグインを利用しています。最近のこれらのプラグインのできはかなりよく、オリジナルの vim を使っているのと遜色ないものが多いです。
そんな中でよく利用しているのが q+キー で記録するキーボードマクロです。私は使い捨てのマクロを a に定義することが多く、qa 一連の作業 q とすることで a にマクロを記録します。a に設定したマクロを実行するには、 @a とすることで、一連の作業を再度実行することができます。vim なので、連続してマクロを実行するのであれば、 10@a のようにすればいいのですが、条件によってマクロ実行するしないを切り替えたいこともあり、 @a のタイプが面倒に感じることがあります。そこで、alt(option) + z に @a をマッピングしました。コードはこんな感じです。
{ "description": "alt-z to @a for vim", "manipulators": [ { "from": { "key_code": "z", "modifiers": { "mandatory": ["left_alt"], "optional": ["any"] } }, "to": [ { "key_code": "2", "modifiers": ["left_shift"] }, { "key_code": "a", "modifiers": [] } ], "type": "basic" } ] }
本来は、それぞれのエディタのキーバインドで設定すればいいのですが、vim, VSCode, RubyMine, PyCharm などそれぞれで設定するのは面倒です。そこで、Karabiner-Elements 側で一斉に設定することにしました。
実際の利用例ですが、Rubymine などでプロジェクト内検索を行い、エディタ画面で Opt-z とすることでキーボードマクロを実行できます。一方、検索された部分でマクロ実行の必要がなければ、昨日設定した Opt-j とすることで、次の検索結果に飛びます。この結果、Opt を押したまま、z と j を切り替えるだけで、実行とスキップを選ぶことができます。z と j は遠いので、Opt-m あたりと交換した方がいいかもしれませんね。こういう場合でも、ここだけ変更すればいいだけなので簡単です。
f12 → click and mouse down
次は主に採点に利用する機能です。タイトルには f12 のことだけ書いてありますが、f11 にも別の定義をしています。
{ "description": "f12 -> click and mouse down", "manipulators": [ { "from": { "key_code": "f12", "modifiers": {} }, "to": [ { "pointing_button": "button1" }, { "mouse_key": { "y": 2000 } } ], "type": "basic" }, { "from": { "key_code": "f11", "modifiers": {} }, "to": [ { "pointing_button": "button1" }, { "key_code": "return_or_enter" } ], "type": "basic" } ] }
f12 については、マウスの左ボタンを押すと同時にマウスカーソルを少し下にずらしています。これは、moodle のルーブリックの採点時に利用するものです。クリックした後にマウスを下にずらして、再度クリックする作業が多いため、これをキーボードでできるようにしたということです。ここで 2000 というのはルーブリックの次のラインに移る程度の値になっており、その移動量に合わせてブラウザの拡大率を調整しています。うまく行くと、f12 を押しまくるだけで採点が完了するということです。

もう一つの f11 のキーは、やはりマウスクリックと return キーを押す作業を行なっています。こちらは、試験の採点に利用しているものです。スキャンした試験の解答用紙は学生人数分のページ数の PDF ファイルになっています。こちらは Adobe Reader のアノテーション機能を使って、クリック時に赤字で ✔︎ を記述するようにしています。同じ問題を全学生分チェックしたいので、Return キーで次の解答用紙に移動します。f11 にクリック + Return を設定しているので、正解時には f11、不正解時には Return を押すことで採点が効率的に行えます。その後、最初の学生に戻り、不正解者に対してだけ × を減点箇所にマーキングするだけで採点が終了します。最後に、moodle のルーブリック表を埋めることで配点も完了します。Karabiner-Elements のおかげで採点が非常に早く終わるようになりました。
Map ctrl-m,i,[ to return, tab, and escape for Notion.app
最後は、今回一番解説したかった機能です。Notion を使っていて一番気になっていたことは、改行やインデントのたびに、Return や tab キーまで手を伸ばさなければいけないことでした。普段の処理では、改行の代わりに ctrl-m、タブの代わりに ctrl-i をタイプしており、Notion でもタイプごとに反応しないことに気づいて、Return や tab まで手を伸ばすことが多々ありました。
これまで Arc ブラウザのおかげで、Notion をブラウザで利用することが多かったです。しかし、タブの固定化や Meeting note などブラウザ版の方が機能が増えてきたこともあり、Notion をアプリ版で利用することが多くなりました。そこで、Notion アプリの時だけキーマッピングを変更するという技を使うことで、Return, tab 問題を解決できるとも思いました。今回、conditions で bundle_identifiers が notion である時だけ、ctrl-m → Return, ctrl-i → tab, ctrl-[ → esc のマッピングを実行する JSON を記載しました。これによって、Notion を使っていてイライラすることがなくなりました。
{ "description": "Map ctrl-m,i,[ to return, tab, and escape for Notion.app", "manipulators": [ { "conditions": [ { "bundle_identifiers": [ "^notion\\.id$" ], "type": "frontmost_application_if" } ], "from": { "key_code": "m", "modifiers": { "mandatory": ["left_control"], "optional": ["any"] } }, "to": [ { "key_code": "return_or_enter", "modifiers": [] } ], "type": "basic" }, { "conditions": [ { "bundle_identifiers": [ "^notion\\.id$" ], "type": "frontmost_application_if" } ], "from": { "key_code": "i", "modifiers": { "mandatory": ["left_control"], "optional": ["any"] } }, "to": [ { "key_code": "tab", "modifiers": [] } ], "type": "basic" }, { "conditions": [ { "bundle_identifiers": [ "^notion\\.id$" ], "type": "frontmost_application_if" } ], "from": { "key_code": "open_bracket", "modifiers": { "mandatory": ["left_control"], "optional": ["any"] } }, "to": [ { "key_code": "escape", "modifiers": [] } ], "type": "basic" } ] }
おわりに
最後のマッピングについては、一般人にはあまり伝わらないですかね。ただ、昔からコードを書いていた人なら、わかってもらえるのではないかなと思っています。