US配列HHKBライクなカーソル操作のショートカットをmacで自作する

この記事は、フラー株式会社 Advent Calendar 2021の2日目の記事です。 (昨年のAdvent Calenderのためにブログを開設したものの、一年間放置してしまいました... ) qiita.com

昨日は@chooblarinさんの「今年のJリーグのBar Chart Raceをつくった」でした。 Bar Chart Raceは学生さんたちに人気らしいです。Youtubeとかでよく動画になってるからでしょうか? 見てると途中で頭の中にユーロビートが流れ出します。

US配列のHHKBのカーソル操作を他のキーボードでも実現したい

職場でのタイピングにはUS配列のHappy Hacking Keyborad (HHKB)を使用しています。HHKBの感想やレビューはネット上に山ほどあるので特に書きませんが、HHKBはUS配列だとカーソルキーがないんです

f:id:kanterbury:20211128211102j:plain
US配列のHHKB(上記リンク、PFU 公式通販より引用)
じゃあどうやってカーソルを操作するのかというと、fnキーを押しながら、[, ;, ', /のいずれかを押すことで、対応する方向にカーソルが動きます。 これだけだと、どういうことか分かりづらいので、図示すると以下のようになります。
f:id:kanterbury:20211129185113p:plain
fnキーを押しながらだと、各方向へのカーソル操作ができるようになります。
このカーソル操作、初めは戸惑いますが、慣れるとかなり快適になります。 カーソルキーってホームポジションからやや離れた位置にあるので、通常のキー配置だとカーソル操作のために右手の移動が必要になりますが、HHKBのこの方式だと文字のタイピング中でも小指がfnキーに届くので、ほとんど右手を移動させることなく、タイピングができるようになります。

でも、これに慣れると逆に困るのが

他のキーボードでカーソルキーを押すのが面倒になる

ということです。

なので、他のキーボードでも、何かしらのキーと[, ;, ', /(以下、記号キー)の同時押しでカーソルを操作するショートカットを実現できるようにしました。

なお、今回は主にMac OSでの実現方法について説明します。Windows OSでの実現方法についても、最後に少しだけ触れます。

Karabiner-Elementsに自作ショートカットを追加する

目的のショートカットを実現するために、Macキーバインド設定ができるKarabiner-Elements(以下、Karabiner)を使用します。 使用している方も多いと思いますし、解説記事もたくさんあるので、インストール方法は割愛します。

Karabinerでは、単純なキー割り当てを変更するだけでなく、有志の方が作成したショートカットコマンドが公式サイトに公開されていて、簡単にインポートできるようになっています。

さらに、有志の方が作っているようなショートカットを自作することもできます。 この自作機能を使って、目的のショートカットを実現します。

どういうショートカットにするのか

今回は、右シフト + 記号キーで各方向のカーソル操作ができるようにします。

なぜ右シフトを採用したのかというと、以下の理由になります。

  • HHKBのFnキーが右シフトのすぐ隣にあるので、位置が似ている
  • 右シフトはほとんどのキーボードにありそうだし、位置も変わらなさそう
  • 既存のショートカットとバッティングしても、左シフトがあるから既存のショートカットが使えなくなることがない

commandキーやfnキーも候補に上がりましたが、前者はVScodeなどで/との同時押しでコメントアウトのショートカットに使われており、後者はキーボードによって配置位置が違うため、落選となりました。

自作ショートカット用ファイルを作成する

適当なテキストエディタで以下のJSONファイルを作成します。名前は適当でいいですが、今回はright_shift_arrow_shortcut.jsonとします。 同一のファイルをGithubにも上げました。 https://github.com/kanterbury/karabiner_custom_modifications/blob/main/right_shift_arrow_shortcut.json

{
  "title": "Right Shift Arrow Shortcut",
  "rules": [
    {
      "description": "Right Shift + [ to Up",
      "manipulators": [
        {
          "type": "basic",
          "from": {
            "key_code": "open_bracket",
            "modifiers": {
              "mandatory": ["right_shift"],
              "optional": ["left_shift"]
            }
          },
          "to": [
            {
              "key_code": "up_arrow"
            }
          ]
        }
      ]
    },
    {
      "description": "Right Shift + / to Down",
      "manipulators": [
        {
          "type": "basic",
          "from": {
            "key_code": "slash",
            "modifiers": {
              "mandatory": ["right_shift"],
              "optional": ["left_shift"]
            }
          },
          "to": [
            {
              "key_code": "down_arrow"
            }
          ]
        }
      ]
    },
    {
      "description": "Right Shift + ; to Left",
      "manipulators": [
        {
          "type": "basic",
          "from": {
            "key_code": "semicolon",
            "modifiers": {
              "mandatory": ["right_shift"],
              "optional": ["left_shift"]
            }
          },
          "to": [
            {
              "key_code": "left_arrow"
            }
          ]
        }
      ]
    },
    {
      "description": "Right Shift + ' to Right",
      "manipulators": [
        {
          "type": "basic",
          "from": {
            "key_code": "quote",
            "modifiers": {
              "mandatory": ["right_shift"],
              "optional": ["left_shift"]
            }
          },
          "to": [
            {
              "key_code": "right_arrow"
            }
          ]
        }
      ]
    }
  ]
}

rulesの配列に各ショートカットを登録していくことになります。 fromに実際に押すキー操作のルールを、toの割り当てたいキー操作(つまり、方向キー)のルールを記載します。 今回のポイントはfromのほうです。

key_codeに押す英字や記号のキーを登録します。今回は各記号キーが相当します。

modifierskey_codeで登録したキーと同時押しする装飾キーを登録します。登録方法は2種類あります。

mandatory

必ず押すキーを登録します。今回は右シフトキーが相当します。

optional

同時に押すことを可能とするキーを登録します。 optionalに登録したキーも同時に押している場合、変換後のキーとoptionalのキーが同時に押されたように処理されます。

今回の場合は、左シフトキーを登録しています。これは、Shift + カーソル操作によるテキスト選択を自作したショートカットでも実現するためです。 例えば、右シフト + [に相当しますが、optionalである左シフトも同時押しすると右シフト + [ + 左シフト↑ + 左シフトと認識されるようになり、カーソルを上に動かしながらのテキスト選択という操作になります。

作成したルールをkarabiner-Elementにインポートする

作成したJSONファイルを以下のリポジトリにコピーします

/Users/[ユーザ名]/.config/karabiner/assets/complex_modifications

その後、Karabiner-Elementsの設定画面にて、Complex modifications → Rules → Add ruleを選択します。

f:id:kanterbury:20211129212218p:plain

別ウィンドウが開くので、その中から先ほど追加したルール群Right Shift Arrow Shortcutを見つけて、Enable Allをクリック。

f:id:kanterbury:20211129212335p:plain

これで、独自ショートカットの登録が完了です。右シフト + 記号キーでカーソル移動ができるようになりました!

使ってみて

右シフトの押下がやや重い

今回のショートカットの場合、私は右シフトを右手の小指で押下していますが、fnキーに比べると大きいのでやや重みを感じます。

もっといい組み合わせがありかもしれない

カーソル移動のショートカットを考えだすと、今回の右シフト + 記号キーよりもいいかもと思える組み合わせが浮かんできます。 私は右シフトを通常のタイピングで全くと言っていいほど使わないので、右シフト + WASDでゲームライクなカーソル移動にするのも良さそうです。

備え付けのカーソルキーを使用してしまう

ここまで書いてそりゃないぜという感じもありますが、使っているキーボードにカーソルキーがついているとどうしてもそちらを使用してしまいます。HHKBを使っている時は、何も意識せずにショートカットを使用しているのに...

Windowsでも同様のショートカットを適用したい

私はMicrosoft PowerToysというツールを使っています。 Microsoftが開発しているユーティリティツールで、ショートカットやキーバインド設定だけでなく、ウィンドウの並列配置などもサポートしてくれて、いろいろ遊べそうです。

github.com

まとめ

今回は、Karabinerへの独自ショートカットの追加機能を行って、カーソル操作のショートカットを自作してみました。 意気揚々と作ってみたはいいものの、使ってみると思ったほどでもないっていうのは、効率化あるあるだと思います。 でも、ショートカットが自作できるというのは、何かと応用が効いて便利なはずです。

皆さんの考えた最強の独自ショートカットをぜひ教えてほしいです!

参考

complex_modifications manipulator definition | Karabiner-Elements

Karabiner-Elementsの独自ルールの作成方法 – Webrandum