【USキーボード】Karabiner-Elementsで「英数/かな」の日本語切り替えを同一キー連打に設定する。

Karabiner-ElementsでMacのキーボード設定を変更することができます。
自分好みのキーマップにしましょう。

当記事では、Karabiner-Elementsの設定の中でも、「英数/かな」の日本語切り替えを同一キー連打で実現したいと思います。
参考にしたのは「Karabiner-Elementsを使ってキーの2連打に処理を割り当てる方法」です。

Karabiner-Elementsのインストールはこちら→https://pqrs.org/osx/karabiner/
インストールについてはこの記事で触れています→https://pycarnival.com/semicolontocolon/

karabiner.jsonを編集する

Macのキーボードで;(セミコロン)を:(コロン)にする」という記事のように設定をインポートするだけでは同一キー連打による設定を加えることはできません。

Karabiner.jsonを直接編集します。

ターミナルを開いて、

cd ~/.config/karabiner

と打ち込み、karabinerへ移動して下さい。karabinerというフォルダの中身をlsコマンドで見てみると、karabiner.jsonが見つかります。(lsとだけ入力してください、その結果を>>>により示しています)

ls
>>> assets karabiner.json

このkarabiner.jsonを編集します。私はVimを使っているので、ターミナル上から直接Vimでkarabiner.jsonを編集しますが、どんなテキストエディタを使ってもらってもかまいませんし、ターミナルではなくiTermなどの人もいるでしょう。とにかくここまでcdの意味やターミナルなんかほとんど開いたことない人や、.configなんてFinderじゃ見つからないじゃん!という人も、がんばってこのファイルを編集できるところまで行き着いてください。

vim karabiner.json

vimでkarabiner.jsonを開きます。

karabiner.jsonで同一キー連打の設定を実現する部分

{
        "description": "左controlを2回連打したら英数日本語が切り替わる",
        "manipulators": [
            {
                "conditions": [
                    {
                        "name": "left_control_key",
                        "type": "variable_if",
                        "value": 1
                        }
                    ],
                "from": {
                    "key_code": "left_control"
                    },
                "to": [
                    {
                        "key_code": "spacebar",
                        "modifiers": [
                            "command"
                            ]
                        }
                    ],
                "type": "basic"
                },
            {
                "conditions": [
                    {
                        "name": "left_control_key",
                        "type": "variable_if",
                        "value": 0
                        }
                    ],
                "from": {
                    "key_code": "left_control",
                    "modifiers": {
                        "optional": [
                            "any"
                            ]
                        }
                    },
                "to": [
                    {
                        "set_variable": {
                            "name": "left_control_key",
                            "value": 1
                            }
                        },
                    {
                        "key_code": "left_control"
                        }
                    ],
                "to_delayed_action": {
                    "to_if_canceled": [
                        {
                            "set_variable": {
                                "name": "left_control_key",
                                "value": 0
                                }
                            }
                        ],
                    "to_if_invoked": [
                        {
                            "set_variable": {
                                "name": "left_control_key",
                                "value": 0
                                }
                            }
                        ]
                    },
                "type": "basic"
                }
            ]
 }

上のコードは例として、左コントロールキー連打により、「英数/かな」の日本語切り替えを実現しています。
「英数/かな」の切り替えにはinput_source_ifやinput_source_unlessというパラメータを利用することができますが、シンプルさと実用性としてはこちらがあるのではないかと思っています。入力方面のパラメータを軸にコードを書きたいと思うあなたの気持ち、よくわかります。

しかし設定を考える上での軸をキー連打とし、それによって実現するキー操作を「command + スペース」にしてみました。
これは上のコードで言うと左コントロールキー(left_control)を連打すると、「command + スペース」を入力したことになる、ということです。

karabiner.json、同一キー連打実現部分の解説

karabiner.jsonのファイルはどのようになっているか記します。
同一キー連打による設定を一個加えただけではjsonファイルのどこに書いたらよいのかわからない人もいると思うからです。
下のファイルでは、「Macのキーボードで;(セミコロン)を:(コロン)にする」の設定してから、今回の記事の内容を加えてみたkarabiner.jsonの内容です。

いちおうそのままコピペしたのですが、インデントが深くて少し見にくいですね。。。
参考になりそうなところを抽出してください。

{
    "global": {
        "check_for_updates_on_startup": true,
        "show_in_menu_bar": true,
        "show_profile_name_in_menu_bar": false
    },
    "profiles": [
        {
            "complex_modifications": {
                "parameters": {
                    "basic.simultaneous_threshold_milliseconds": 50,
                    "basic.to_delayed_action_delay_milliseconds": 500,
                    "basic.to_if_alone_timeout_milliseconds": 1000,
                    "basic.to_if_held_down_threshold_milliseconds": 500
                },
                "rules": [
                    {
                        "description": "Exchange semicolon and colon",
                        "manipulators": [
                            {
                                "from": {
                                    "key_code": "semicolon",
                                    "modifiers": {
                                        "optional": [
                                            "caps_lock"
                                        ]
                                    }
                                },
                                "to": [
                                    {
                                        "key_code": "semicolon",
                                        "modifiers": [
                                            "left_shift"
                                        ]
                                    }
                                ],
                                "type": "basic"
                            },
                            {
                                "from": {
                                    "key_code": "semicolon",
                                    "modifiers": {
                                        "mandatory": [
                                            "shift"
                                        ],
                                        "optional": [
                                            "caps_lock"
                                        ]
                                    }
                                },
                                "to": [
                                    {
                                        "key_code": "semicolon"
                                    }
                                ],
                                "type": "basic"
                            }
                        ]
                    },
                    {
                        "description": "左controlを2回連打したら英数日本語が切り替わる",
                        "manipulators": [
                            {
                                "conditions": [
                                    {
                                        "name": "left_control_key",
                                        "type": "variable_if",
                                        "value": 1
                                    }
                                ],
                                "from": {
                                    "key_code": "left_control"
                                },
                                "to": [
                                    {
                                        "key_code": "spacebar",
                                        "modifiers": [
                                            "command"
                                        ]
                                    }
                                ],
                                "type": "basic"
                            },
                            {
                                "conditions": [
                                    {
                                        "name": "left_control_key",
                                        "type": "variable_if",
                                        "value": 0
                                    }
                                ],
                                "from": {
                                    "key_code": "left_control",
                                    "modifiers": {
                                        "optional": [
                                            "any"
                                        ]
                                    }
                                },
                                "to": [
                                    {
                                        "set_variable": {
                                            "name": "left_control_key",
                                            "value": 1
                                        }
                                    },
                                    {
                                        "key_code": "left_control"
                                    }
                                ],
                                "to_delayed_action": {
                                    "to_if_canceled": [
                                        {
                                            "set_variable": {
                                                "name": "left_control_key",
                                                "value": 0
                                            }
                                        }
                                    ],
                                    "to_if_invoked": [
                                        {
                                            "set_variable": {
                                                "name": "left_control_key",
                                                "value": 0
                                            }
                                        }
                                    ]
                                },
                                "type": "basic"
                            }
                        ]
                    }
                ]
            },
            "devices": [
                {
                    "disable_built_in_keyboard_if_exists": false,
                    "fn_function_keys": [],
                    "identifiers": {
                        "is_keyboard": true,
                        "is_pointing_device": false,
                        "product_id": 594,
                        "vendor_id": 1452
                    },
                    "ignore": false,
                    "manipulate_caps_lock_led": true,
                    "simple_modifications": [
                        {
                            "from": {
                                "key_code": "caps_lock"
                            },
                            "to": {
                                "key_code": "left_control"
                            }
                        }
                    ]
                }
            ],
            "fn_function_keys": [
                {
                    "from": {
                        "key_code": "f1"
                    },
                    "to": {
                        "consumer_key_code": "display_brightness_decrement"
                    }
                },
                {
                    "from": {
                        "key_code": "f2"
                    },
                    "to": {
                        "consumer_key_code": "display_brightness_increment"
                    }
                },
                {
                    "from": {
                        "key_code": "f3"
                    },
                    "to": {
                        "key_code": "mission_control"
                    }
                },
                {
                    "from": {
                        "key_code": "f4"
                    },
                    "to": {
                        "key_code": "launchpad"
                    }
                },
                {
                    "from": {
                        "key_code": "f5"
                    },
                    "to": {
                        "key_code": "illumination_decrement"
                    }
                },
                {
                    "from": {
                        "key_code": "f6"
                    },
                    "to": {
                        "key_code": "illumination_increment"
                    }
                },
                {
                    "from": {
                        "key_code": "f7"
                    },
                    "to": {
                        "consumer_key_code": "rewind"
                    }
                },
                {
                    "from": {
                        "key_code": "f8"
                    },
                    "to": {
                        "consumer_key_code": "play_or_pause"
                    }
                },
                {
                    "from": {
                        "key_code": "f9"
                    },
                    "to": {
                        "consumer_key_code": "fastforward"
                    }
                },
                {
                    "from": {
                        "key_code": "f10"
                    },
                    "to": {
                        "consumer_key_code": "mute"
                    }
                },
                {
                    "from": {
                        "key_code": "f11"
                    },
                    "to": {
                        "consumer_key_code": "volume_decrement"
                    }
                },
                {
                    "from": {
                        "key_code": "f12"
                    },
                    "to": {
                        "consumer_key_code": "volume_increment"
                    }
                }
            ],
            "name": "Default profile",
            "selected": true,
            "simple_modifications": [],
            "virtual_hid_keyboard": {
                "caps_lock_delay_milliseconds": 0,
                "keyboard_type": "ansi"
            }
        }
    ]
}

rulesに書く

同一キー連打での設定はrulesの中に書きます
すでにcomplex_modificationsにはセミコロンとコロンを入れ替える設定を入れており、そこに加えるかたちとなっています。,(カンマ)で区切って並列に書いているところに注意して下さい。

要点

「left_control_key」という名前で左コントロールキー(left_control)の状態を管理しています。
"to"が結果的に実現して欲しいキーバインド。"modifiers"が"command"で、「commandキーを押しながら」という意味です。そして"key_code"が"spacebar"。すなわち、「commandキーを押しながらスペースを押す」という処理が書かれています。

注意としては、key_codeは正確に入力しなければなりません。たとえばkey_codeを"spacebar"ではなく単に"space"などと書いてしまうと、上手く動きません。正確な表記を心がけてください。
Simple Modificationsでも確認できるので、見てみましょう。下のような言葉をkey_codeに入れれば良いのです。

Karabiner-Elementsで同一キー連打での設定を思い立った経緯、全体像、補足

一般的にMacのUSキーボードは「command + スペース」か「control + スペース」で切り替えるものでしょうか。標準のMacのキーボードを使っているのか、他社のキーボードを使っているのかでも、キーマップが変わってきますよね。私はHHKBを使用しているので、標準の「command + スペース」で苦労しません。右のcommandキーを手のひらで押して、スペースキーを親指で押すと、非常にスムーズに英数切り替えが可能だからです。私のようにHHKBのようなキーボードを使っているなら他のキーボードとは事情がかなり変わってきます。

しかし、MacBook AirやMacBook Proを使うと、手のひらでキーボードを押すことはできないので、「英数/かな」の切り替えを工夫することになります。
どのようなキーバインドにするかは本当に人の好みで、なんとも言えません。
ただ、標準キーボードの「command + スペース」は特にプログラミングをする人にとっては効率の悪さを感じてしまうキーバインドだと思います。明らかに押しにくいのと、なにより両手のホームポジションの姿勢が崩れてしまいます。ホームポジションからいかに動かないかはプログラミングをする上でとても大事ですよね。

単一キーによる「英数/かな」日本語切り替えの設定は簡単だった

コマンドキーを単体で押したときに、英数・かなキーを送信する。(左コマンドキーは英数、右コマンドキーはかな)」というやつは単純にComplex Modificationsからインポートしてくればいいだけなので、すごく楽です。
Complex Modificationsのインポートの仕方がわからない人は「Macのキーボードで;(セミコロン)を:(コロン)にする」を参考にして下さい。

正直、「コマンドキーを単体で押したときに、英数・かなキーを送信する。(左コマンドキーは英数、右コマンドキーはかな)」という設定使う人はどれくらいいるのでしょうか?そもそも左コマンドキーや右コマンドキーが押しにくいから、従来の「command + スペース」を変えたいわけです。しかも、英数やかなを頻繁に変えるのに、その操作が1つの操作ではなく2つの操作に分散されてしまいます。「英数」→「かな」も「かな」→「英数」も同じキーバインドでないと、「かな」→「かな」などの動作をしてしまったときにうおーーーってなる気がします。そして何度もいいますが、ホームポジションの手の姿勢を崩したくない。わざわざ離れたところへ押しにいきたくないし、スピードを求めたいのが人情。
単一キーで「英数/かな」あるいは「半角/全角」といいましょうか、これをしたいとは私も思うのですが、現状でこれに当てはめることができる単一キーがホームポジションからすぐの場所にはないということです。たとえばcaps_lockは左コントロールに割り当て、タブキーは変更できない。左シフトキーも右シフトキーもよく使うから変更できない。そうやって自分なりに選択肢を絞ると、どこに割り当てたら良いかおぼろげにわかってきます。

Macのキーボード設定でキーバインドを変える

「英数/かな」「半角/全角」の切り替えを「left_cotrol + O」にしている人もいて、これけっこういいと思っています。ホームポジションが崩れません。(Oは大文字アルファベットのO。ゼロではない)
この設定ならKarabinerを使うまでもなく、Macの設定から変えるだけで実現可能です。
設定から「キーボード」を選ぶ。

「ショートカット」から「入力ソース」、「前の入力ソースを選択」をダブルクリックして、自分のキーバインドを入力。

たとえば、「control + O」を実現すると、

注意としては、たとえばさきほど参考に左コントロールキー連打によって「英数/かな」の切り替えを行いましたが、これは「command + スペース」で前の入力ソースを選択という設定にしていたから実現できていました。つまりここの設定をいじくれば、Karabinerの設定のほうもいじらないといけなくなるということです。

この記事の内容は、たくさん応用できます。同一キー連打はどのキーでも良いわけで、それをどんなキーに割り当てるかも自由です。

ここまでいろいろと書きましたが、自分が使うキーボードの性能や自分の指の性格などを考慮に入れ、自分だけのキー設定ができると一番いいですよね!
たとえ変な設定だとしても、自分が使いやすいならそれでいいんです!

KarabinerやMacのキーボード設定を駆使して、楽しいキーボードライフを送りましょう!