ぽよメモ

レガシーシステム考古学専攻

Karabiner-Elements 0.90.64での複数デバイス間でのプロファイル切り替え

バージョン0.90.68現在,上手くいっていないようです.結局自分の自作スクリプトで切り替えさせています(安定)
実は前の時にも,自分ので走らせたジョブが動きっぱなしだった…?無いとは思いますが…混乱させる情報を掲載して申し訳ないです. いつのバージョンからか,デバイス間でのプロファイル切り替え機能はデフォルトで実装されるようになっていました.最高.好き.
というわけで以下の記事は不要となりました.多数のアクセスをしていただきありがとうございました.消しはしませんが,不要である旨を記載しておきます.

poyo.hatenablog.jp

ただまだ使い方がイマイチ分からないというか,切り替えが明示的に示されていない,というのがあり,ちょっと実験してみることに.

これは2016/11/8現在,karabiner-elementsの最新バージョン0.90.64での記事になります.近い将来なんの参考にもならなくなる可能性が高いです.

karabiner.jsonの構造

以下のような形になっていました.

{
    "profiles": [
        {
            "devices":[
                {
                     "disable_built_in_keyboard_if_exists": false,
                     "identifiers": {
                         "is_keyboard": true,
                         "is_pointing_device": false,
                         "product_id": 8209,
                         "vendor_id": 1241
                     },
                     "ignore": false,
                     "keyboard_type": 42
                 },
                 {
                     "disable_built_in_keyboard_if_exists": false,
                     "identifiers": {
                         "is_keyboard": true,
                         "is_pointing_device": false,
                         "product_id": 603,
                         "vendor_id": 1452
                     },
                     "ignore": true,
                     "keyboard_type": 42
                 },                 {
                     "disable_built_in_keyboard_if_exists": false,
                     "identifiers": {
                         "is_keyboard": true,
                         "is_pointing_device": false,
                         "product_id": 65535,
                         "vendor_id": 1452
                     },
                     "ignore": true,
                     "keyboard_type": 0
                 }
            ],
             "fn_function_keys": {
                 "f1": "vk_consumer_brightness_down",
                 "f10": "mute",
                 "f11": "volume_down",
                 "f12": "volume_up",
                 "f2": "vk_consumer_brightness_up",
                 "f3": "vk_mission_control",
                 "f4": "vk_launchpad",
                 "f5": "vk_consumer_illumination_down",
                 "f6": "vk_consumer_illumination_up",
                 "f7": "vk_consumer_previous",
                 "f8": "vk_consumer_play",
                 "f9": "vk_consumer_next"
             },
             "name": "Profile 1",
             "selected": true,
             "simple_modifications": {
                 "FROM": "TO"
             }
         },
         {
             "comment": "以下同様の構造でプロファイルとデバイスが格納"
         }
    ]
}

僕の場合,このようになっていましたが,元からあったkarabiner.jsonを新バージョンに書き直した形跡*1が見られたので,人によって異なるかもしれません.
要するに一つのプロファイルの中には

  • name: プロファイル名
  • device: デバイスの情報
  • selected: 有効(true)か無効(false)か
  • fn_function_keys: F1キー等の挙動(デフォルトではfn同時押し時の挙動)
  • simple_modifications: キーのマッピング

が含まれています.

プロファイル切り替え

デフォルト時

デフォルトだとKarabiner-Elementsのdevicesタブの中は以下のようになっていました.Keyboard Typeは"ISO","ANSI","JIS","default"という4択から選べるようです.また,Appleの内蔵キーボード/トラックパッド以外にもう一つ,共通のVendor IDを持つ名前不明のデバイスが検出されていますが,これがなんなのかはわかりませんでした.
一つ検出されているマウスのマークがついたデバイスは接続しているMX Masterです.(名前が不明になるのは少し不便.せめて名前つけれるとわかりやすいと思うんですが…)

f:id:pudding_info:20161108161609p:plain

バイスの接続状態ごとにプロファイルを分けているわけではないようで,たとえばこの状態で有効になっているプロファイルは以下のようになっていました.

"devices": [
    {
         "disable_built_in_keyboard_if_exists": false,
         "identifiers": {
             "is_keyboard": true,
             "is_pointing_device": false,
             "product_id": 65535,
             "vendor_id": 1452
          },
          "ignore": false,
          "keyboard_type": 0
      }
],
"fn_function_keys": {
    "f1": "vk_consumer_brightness_down",
    "f10": "mute",
    "f11": "volume_down",
    "f12": "volume_up",
    "f2": "vk_consumer_brightness_up",
    "f3": "vk_mission_control",
    "f4": "vk_launchpad",
    "f5": "vk_consumer_illumination_down",
    "f6": "vk_consumer_illumination_up",
    "f7": "vk_consumer_previous",
    "f8": "vk_consumer_play",
    "f9": "vk_consumer_next"
},
"name": "Default",
"selected": true,
"simple_modifications": {
    "caps_lock": "left_control"
}

karabiner.json上では,vendor_idproduct_idはそれぞれ10進数表記されています.上記のプロファイルのdevicesに表示されている"vendor_id": 1452"product_id": 65535は16進数に直すとそれぞれ0x05ac0xffffとなり,例の不明なApple製デバイスを示していることになります.予想ではdevicesの中に内蔵キーボード/トラックパッドも書き込まれるのではないかと思ったのですが,なぜかそうはならず…うーん…
その後色々やっていたら表示されるようになりました.おそらくトリガーとしてはデバイスのkarabiner-elements上での設定に何かしらの変更(Keyboard Typeを変えた,チェックを外した/つけた,など)をすると書き込まれるようです.

ちなみに内蔵キーボード/トラックパッドのKeyboard TypeをDefaultにしておくとUSとして認識されるのでJISの人はJISを選択する必要があります.

外部キーボード接続

外部キーボードを接続すると以下のように表示されました.Majestouch2 黒軸テンキーレスを接続しています.

f:id:pudding_info:20161108165242p:plain

接続した状態で,横のチェックマークを外すと,そのデバイスではキーの変更が反映されません(つまり,外部キーボードを接続した状態でプロファイルを設定し,Appleの内蔵キーボード/トラックパッドのチェックを外すと内蔵キーボードではデフォルトのままで扱うことが出来ます.).
このチェックマークはkarabiner.jsonでいうとdevicesの中にあるignoreにあたり,チェックマークを外すとtrueになります.

ただ外部キーボードを接続した/切断しただけではプロファイルの変更は反映されないようで,外部キーボードから何かしらの挙動があったとき,つまり文字を打とうとしたりするときに初めてこの変更は反映されるようです*2

複数プロファイル作成手順

まず,デフォルトの状態で(何も外部デバイスを接続していない状態で)プロファイルを作成します.このとき,必ず一度,内蔵キーボードの設定を触っておいてください(Keyboard Typeを変える,チェックマークを付けたり外したりする,など).
これをしておかないと,プロファイルのdevices内に内蔵キーボードが記述されず,プロファイルがやたら増えていったりすることになります*3

karabiner.jsonを確認してdevices内に現在の状態のデバイスが記述されていることを確認したら,外部キーボードを接続します.

  1. 適当なキーを押したり文字入力しようとするとマウス以外のデバイスに再度チェックが付きます.
  2. 外部キーボードのKeyboard TypeをJISに変えます(Defaultで良い人は外部キーボードのチェックを一度外し,再度付けます)
  3. 内蔵キーボードのチェックを外します.
  4. キーの設定をします

この手順ならば,karabiner.jsonの中には2つのプロファイルが作られ,外付けキーボード無しのプロファイルのdevicesには内臓キーボードが,外付けキーボードを挿した時のプロファイルのdevicesには内臓キーボードと外付けキーボードが,それぞれ登録された状態になっているはずです.
外付けキーボードを抜き差しして文字入力してみたりしてプロファイルが切り替わるのを確認してください.

複数プロファイル作成のポイント

  1. 用意するプロファイルのdevicesにそれぞれ全てのデバイスが組み込まれていること(適切にignoreが設定されていること)
  2. ごっちゃになってきたらkarabiner.jsonをバックアップし一旦削除してやり直す
  3. トライアンドエラー

ポイントもクソもない感じになってしまった…

JISキーボード上の表記について

JISキーボード上の表記と,karabiner-elements内での表記はわかりづらくなってしまっているので簡単なまとめを.これは2016/11/8現在の最新stableバージョン0.90.64での情報です.

JISキーボード上の表記 Karabiner-Elementsでの表記
Windowsキー left_command
Left Alt left_option
変換 PCキーボードの変換キー
無変換 PCキーボードの無変換キー
かな PCキーボード上のかなキー
applicationキー*4 application
半角/全角 grave_accent_and_tilde (`)

急いでいてきっちり確認していなかったので右側Altとか右側Ctrlとかはまだ確認取れていません…そのうち追記します.
また,ScreenLockとPause/Breakにはそれぞれディスプレイ輝度の上げ下げが割り振られていました(たぶん).
HomeやEnd,Delete等はそのまま動いていたように記憶しています.

これまでのバージョンでの不具合

僕の環境では

  1. karabiner-elementsの起動中,英数入力のときだけなぜか強制US配列になる
  2. マウス(MX Master)の設定を行っていたソフトウェア(Logicool Options)の設定をオーバーライドし,機能をデフォルトに戻す

という不具合が生じていました.バージョン0.90.64現在,この二つの不具合は

  1. キーボード配列を選択できる
  2. マウスは設定によりデフォルトで無視

という方法で解決しています.
過去のバージョンではどうにも不具合が起きていた人も,アップデートしてみることをオススメします.

まとめ

おおむねGUIのみで完結できるようになり,かなりできることの幅が広がりましたが,US配列のユーザーとしては過去の「Command空打ちで英数/かな切り替え」がまだ使えないため,Sierraへのアプデを断念している人も多いかと思います.早めに実装されるといいなぁ……

読みにくい記事になり申し訳ありません.また追加情報があれば更新していきたいです.間違ってたらコメントください…

*1:プロファイル名が継承されていました.しかし二種類あったプロファイルのうちsimple_modificationsの中身が継承されていたのは片方のみだったため,よくわかりません…完全に継承しているわけではないかも

*2:きっちりと計測したわけではなく,karabiner-elementsのGUIを見ている限りでは,ということです

*3:外部キーボードを接続→キーボードの設定は触らず,内蔵キーボードのチェックを外す→キーを設定→USBキーボードを抜く,とすると一つ新しいプロファイルが作られます.するとこのプロファイルのdevices内にはUSBキーボードは記述されておらず,次の接続時にまた設定が空の新しいプロファイルが作られました.

*4:Majestouchだと電卓?メモ帳?みたいなマークが付いているキー