😊

Karabiner-ElementsでXcodeのOpen Quicklyを[Shift]+[Shift]で開く

2023/09/02に公開

この記事でやること

Xcodeでも[Shift]+[Shift]でSearch Everywhereしたい
→ Karabiner-Elementsを使用して、[Shift]+[Shift]を押した際、[Command]+[Shift]+[O]と同じ動作にする

ニッチな内容です。

背景

JetBrains製のIDEでは [Shift]+[Shift] を押すと、Search Everywhereでファイルを検索できる。
Android StudioやGoLandなどの製品にどっぷり浸かっている身としては、息を吸うようにShiftキーを連打しがち。
そのため、Search Everywhereに相当するXcodeの機能(Open Quickly)も[Shift]+[Shift]で使えるようにしたい。

無難な解決策

JetBrains製のIDE側のショートカットキーをXcodeに寄せるのが無難。
XcodeのOpen Quicklyは [Command]+[Shift]+[O] なので、JetBrains製のIDEもそちらに合わせれば「XcodeでもAndroid Studioでも同じショートカットキーが使える」という状態にはなる。

しかし、自分はあくまでIntelliJ系がメインで、Xcodeは必要に迫られて使っているだけなので、この解決策は採りたくない。

AppCode、今からでも終了撤回してくれないかな……多少高くても全然買うのですが……

Xcodeのショートカットキーを変更する(失敗)

Xcodeのメニューから、Xcode > Preferences > Key Bindings を開く。
この画面から変更できる……らしいのだが、Ventura + Xcode 14.2では変更できなかった。
同じことを言っている方もいる模様。
https://teratail.com/questions/me6xddga242bc4

OSの設定画面からショートカットの割り当てができるようだが、[Shift]+[Shift]は設定できないので、今回やりたいことは実現できそうにない。

Karabiner-Elementsで対応する

Karabiner-Elementsを使って、[Shift]+[Shift]を[Command]+[Shift]+[O]に変換する。

インストール

https://karabiner-elements.pqrs.org/

勝手にUSキーボード判定に変わってしまうことがあるので、JISキーボード使いは気合いで直すこと。
(割とクセのあるソフトウェアな気がするので、個人的には[Shift]+[Shift]のためだけにインストールするのはコスパが悪い気がする)
触るのは確かこの辺り。

  • Karabiner-Elementsの Virtual Keyboard で、JISキーボードを選択する
  • Macのシステム設定 > キーボード > キーボードの種類の変更
  • PC再起動
  • 外付けキーボードなら再起動、ケーブルの抜き差しなども

設定ファイルを作成する

https://qiita.com/s-show/items/c991327a5317c3e0cf4b
https://karabiner-elements.pqrs.org/docs/json/

~/.config/karabiner/assets/complex_modifications 配下にJSONファイルを作成する。

{
  "title": "Xcode",
  "rules": [
    {
      "description": "Double tap 'left_shift' to 'command + shift + o'",
      "manipulators": [
        {
          "type": "basic",
          "from": {
            "key_code": "left_shift"
          },
          "to": [
            {
              "key_code": "o",
              "modifiers": [
                "command",
                "shift"
              ]
            }
          ],
          "conditions": [
            {
              "type": "variable_if",
              "name": "left_shift_key",
              "value": 1
            },
            {
              "bundle_identifiers": [
                "^com\\.apple\\.dt.Xcode$"
              ],
              "type": "frontmost_application_if"
            }
          ]
        },
        {
          "type": "basic",
          "from": {
            "key_code": "left_shift",
            "modifiers": {
              "optional": [
                "any"
              ]
            }
          },
          "to": [
            {
              "set_variable": {
                "name": "left_shift_key",
                "value": 1
              }
            },
            {
              "key_code": "left_shift"
            }
          ],
          "to_delayed_action": {
            "to_if_invoked": [
              {
                "set_variable": {
                  "name": "left_shift_key",
                  "value": 0
                }
              }
            ],
            "to_if_canceled": [
              {
                "set_variable": {
                  "name": "left_shift_key",
                  "value": 0
                }
              }
            ]
          },
          "conditions": [
            {
              "type": "variable_if",
              "name": "left_shift_key",
              "value": 0
            },
            {
              "bundle_identifiers": [
                "^com\\.apple\\.dt.Xcode$"
              ],
              "type": "frontmost_application_if"
            }
          ]
        }
      ]
    }
  ]
}

Karabiner-Elementsで設定を有効にする

Complex Modifications > Add rule に先ほどの設定が表示されるので、Enableにする。
https://karabiner-elements.pqrs.org/docs/manual/configuration/configure-complex-modifications/

以上!

うまく動かない場合

  • Karabiner-Elementsを再起動してみる
  • Devices から、自分が使っている入力機器の Modify events にチェックが入っていることを確認する
  • Karabiner-EventViewerを起動して、デバッグログを見てみる

設定を拡張する

他のショートカットキーも色々設定したいので、リポジトリを作成した。自分で設定した分はここで公開するつもり。
https://github.com/75py/karabiner-xcode-to-intellij-shortcuts

Discussion