⌨️

macOSのIntelliJ IDEAでDead keysのホットキーを使った後にタイプした文字にアクセント記号がつくのを防ぐ方法

2022/06/05に公開

Backgrounds

IntelliJで

  • option+n を "Clone Caret Below" actionにマップする。
  • エディタで option+n 押す(とキャレットが下に1つ増える)
  • "a" をタイプするとキャレットの数だけ "ã" が入力される

という現象が起きて余計なアクセント記号が付くのが面倒なので、なんとかしたい。

How to

そもそもこのアクセント記号がつくのはDead Keysと言う機能らしい。

そして、macOSの英字keyboard layout(com.apple.keylayout.ABC)にはこのDead Keys機能が入っていて、なんでか知らんけどIntelliJでホットキーに使うと中途半端に発動してしまうらしい。
調べた限りだとDead Keysの無いkeyboard layoutを自前で作って使うしかなさそうなので、そうする。

Ukeleleと言うアプリケーションを使ってDead Keysのないkeyboard layoutを作成する。

解説する前に作成済みのkeyboard layoutを共有するので、同じ問題を持ってて解決さえできれば良いと言う人は持ってってください。Dropboxがやたらユーザ登録 or ログインをしろとせがんでくると思いますが、どちらもやらずにダウンロードできます。

でやり方は

  • 現在の入力ソースを普通の英字入力に使ってる入力ソースにする。私の場合 "ABC"。
  • Ukeleleを起動 → File → New From Current Input Source を選択。これで "ABC" をコピーしたkeyboard layoutが作成される。
  • “ABC copy” のような "ABC" をコピーした項目が表示される。これをダブルクリックすると、このkeyboard layoutの詳細が表示される。
  • 表示させたままOptionをホールドすると、Dead Keysが赤くなる。
  • その状態で右クリック→Make Output→適当に違う出力を入れる。私の場合 "n" には "n" のように同じキーにした。
  • これを無効にしたいDead Keys全部に対して行う。
  • (必要があれば)keyboard layoutの名前を変更する。私の場合 "ABC_no_dead" にした。
  • (必要があれば)アイコンを設定する。私の場合以下のサイトでてきとうに作成した。
  • Command+sで保存する。
  • 保存したファイルをダブルクリックしてインストールする。
  • macOSのPreference → Keyboard → インプットソース → インストールしたkeyboard layoutをaddする。

これで追加した入力ソースを選択してホットキーを使うと、アクセント記号が付与されてしまう現象を防げる。

で、まだ微妙に問題が残っている。基本的に一度 ABC_no_dead を選択すると英数キーを押したときに ABC_no_dead が選択されるのだけれど、知らない間にこれが普通の ABC に戻ってることがある(何がトリガになっているのか分からない)。これを普通のシステム設定で防ぐやり方は見つからなかったため、さらにアプリケーションを用いて解決する。

ホットキーで特定の入力ソースを選択できるkawaと言うアプリをインストールする。

brew update
brew install --cask kawa

kawaを起動し、ABC_no_deadに英数キーを割り当て、たかったのだけれど英数キーは受け付けてくれなかった。ので、

  • kawaでABC_no_deadに「このホットキーは他で使わんやろ」と言うホットキーを割り当てる
  • Karabiner-Elementsで英数キーにkawaに設定したホットキーを設定する

と言う戦略を取った。
もうちょっと正確には私の場合USキーボードを普段使っていて、左コマンドキーに「一度押したら英数キーだけど長押ししたらコマンドキー」と言う設定を入れていたので、「一度押したら『このホットキーは他でも使わんやろ』のホットキーだけど長押ししたらコマンドキー」と言う設定を入れた。具体的には command+option+shift+control+1 を割り当てた。必要な人がいるかわからないけれど、設定jsonはこんな感じ。

    {
      "description": "left_command to control+option+command+shift+1 if not hold",
      "manipulators": [
        {
          "from": {
            "key_code": "left_command",
            "modifiers": {
              "optional": [
                "any"
              ]
            }
          },
          "to": [
            {
              "key_code": "left_command"
            }
          ],
          "to_if_alone": [
            {
              "key_code": "1",
              "modifiers": [
                "right_option",
                "right_shift",
                "right_control",
                "right_command"
              ]
            }
          ],
          "type": "basic"
        }
      ]
    }

これで、左コマンドを押したら ABC ではなく ABC_no_dead が必ず選択されるようになった。

で、ここまでやってさらに問題が発生し、私のキー操作の癖で日本語入力している間しょっちゅう右コマンドキー(例によって「一度押したらかなキーだけど長押しで右コマンド」設定)を押しているっぽいのだけれど、これが原因でしょっちゅう入力した文字が再変換されるようになってしまった。macOSのかなキーには2回押すと確定済みの文字列を再変換する機能があり、それが発動しているようだった。ちゃんと調べてないけど、かなキーを1回押した後に英数キー押したら1度リセットされ、次にかなキーを押しても2回押した判定にならないが、英数ではなく別のホットキーが発動するようにしたため、リセットされずにかなキーを2回押した判定になってしまうようだった。

なので、上述のABC_no_deadを設定したように、日本語入力ソースの選択もkawa経由で行うようにして解決した。手順はほぼ同じなので省略。

余談

IntelliJで control+shift+r のホットキーが今まで反応してくれなかったんだけど、ABC_no_deadを選択していると発動するようになった。原因はちゃんと調べてなくて不明。

正直問題に対して解決法がかなり無理やりなので、もっとシンプルな解決方法があれば誰か教えてください。

参考

Discussion