はじめに
背景
私のMacbookはJIS配列なのですが、US配列のHHKBキーボードも使用しています。接続するたびにKarabiner-Elementsを開きvirtual keyboardでUSに設定するのが面倒くさかったため、ショートカットで変更できる情報を探し以下の記事を見つけました。
しかし私のKarabinerの設定は、cmdの押下時間で英数/かな切り替えのKarabiner-ElementsのComplex Modifications(https://gist.github.com/zumikiti/9b484fb551f8b482251d075733ac86c4 )も適用していたので、先の記事のやり方をそのまま行うとコンフリクトを起こし、こっちが立つとあっちが立たないということになっていました。これを解決したいと思います。
動作環境
- PC: MacBook Air (15-inch、M2、2023)
- OS: macOS Sequoia 15.6.1
- キーボード:
- 内蔵: JIS配列
- 外付け:HHKB Professional HYBRID Type-S US配列 / 墨
- Karabiner-Elements: Version 15.5.0
想定読者
この記事は、以下のような悩みを持つMacユーザーに向けて書いています。
- 内蔵キーボード(JIS)と外付けキーボード(US)を併用している人
- 特に、HHKBなどのUS配列キーボードと、MacBook本体のJIS配列を行き来している人
- Karabiner-Elementsの設定沼にハマっている人
- 「プロファイルを切り替えると、Commandキーでの英数/かな変換が効かなくなる」現象に悩んでいる人
-
karabiner.jsonを直接編集したり、スクリプトで無理やり設定を書き換えようとして疲弊している人
TL;DR
以下の手順で解決できました。
~/.config/karabiner/karabiner.jsonからの編集をやめ、GUIからの設定に一本化し、プロファイルの設定はGUIから行います。
Karabiner-ElementsのComplex Modificationsは、プロファイルごとに設定されているので、GUIからJISとUSを作成後、それぞれのプロファイルを選択した上で、それぞれのvirtual keyboardと押下時間を変えるComplex Modificationsを設定することで、衝突を起こさずにどちらの設定も両立して使うことができました。
やりたかったこと
2つの要件がありました。
-
要件1
-
Left cmd/Right cmdの押下時間によって「cmd」か「英数/かな」を切り替えたい (HHKBキーボードに英数 / かな変換キーがない)
-
-
要件2
- ショートカット一発でJIS配列とUS配列の設定を切り替えたい(いちいちKarabiner-Elementsを立ち上げたくない)
起きていたこと
設定方法にダブスタが起きていた
要件1に対しては再掲になるが、こちらの参考に設定を行っていました。
https://gist.github.com/zumikiti/9b484fb551f8b482251d075733ac86c4
具体的には以下をKarabiner-ElementsのComplex ModificationsからAdd your own ruleで追記し設定していました。
{
"description": "Commandキー短押しで英数/かな切替、長押しで通常のCommandキー",
"manipulators": [
{
"from": {
"key_code": "left_command",
"modifiers": { "optional": ["any"] }
},
"parameters": {
"basic.to_if_alone_timeout_milliseconds": 300,
"basic.to_if_held_down_threshold_milliseconds": 100
},
"to": [
{
"key_code": "left_command",
"lazy": true
}
],
"to_if_alone": [{ "key_code": "japanese_eisuu" }],
"to_if_held_down": [{ "key_code": "left_command" }],
"type": "basic"
},
{
"from": {
"key_code": "right_command",
"modifiers": { "optional": ["any"] }
},
"parameters": {
"basic.to_if_alone_timeout_milliseconds": 300,
"basic.to_if_held_down_threshold_milliseconds": 100
},
"to": [
{
"key_code": "right_command",
"lazy": true
}
],
"to_if_alone": [{ "key_code": "japanese_kana" }],
"to_if_held_down": [{ "key_code": "right_command" }],
"type": "basic"
}
]
}
要件2に対しては、こちらも再掲になるが以下の記事を参考にして、~/.config/karabiner/karabiner.jsonを直接編集して設定を行っていました。
つまり、GUIからの設定とconfigファイルからの設定を行っておりこれらが衝突して両立させることができなかったということです。
Complex Modificationsはグローバル設定だと思い込んでいた
プロファイルの概念を誤って理解していた(または理解しようとしていなかった)ため解決に時間を要しました。
解決策: Karabinerの構造を理解する
complex modificationsはプロファイルごとに保存されるということが重要でした。設定方法のダブスタを防ぐため~/.config/karabiner/karabiner.jsonからの編集は行わず、全てGUI上から以下の手順で設定を行います。
- GUIのProfilesから適当な名前、ここでは
JISとUSのプロファイルを作成します。(jsonは編集しない) - 両方のプロファイルにcmdキー変換Complex Modificationsをそれぞれ追加します
- virtual keyboardを変更します。JISのプロファイルではにJISを、USのプロファイルではANSIを設定します
- bashでプロファイルを変更するように設定する
これによってそれぞれの設定を独立して追加することができるようになりました。
実行するBashは以下のようになると思います。プロファイルを切り替えているだけです。
# USへ
/Library/Application\ Support/org.pqrs/Karabiner-Elements/bin/karabiner_cli --select-profile US
# JISへ
/Library/Application\ Support/org.pqrs/Karabiner-Elements/bin/karabiner_cli --select-profile JIS
あとは、これをショートカットで実行するなりAlfredで実行するなりして、切り替えます。
おわりに
HHKB(US配列)の時だけcmd変換があればいいので、本体の時はその設定は不要だと気づきました。そのような柔軟な設定もプロファイルを分けることで可能になるのでこの考え方がわかってとても良かったと思います。
この記事がお役に立てたら幸いです。