macOS Sierra + Karabiner-Elementsメモ

中古の New MacBook (Early 2015) を手に入れた。
キーボードはJIS。

諸事情によりmacOS Sierraにアップグレードした後で KarabinerがmacOS Sierraでは使えなくなっている事を知り、[Karabiner-Elements](https://github.com/tekezo/Karabiner-Elements)さんと仲良くすることになった話、というか諸々のメモ。

> 元々OS X Mavericksが入ってたんだけど、これまで使っていたMacBook Air (Mid 2011; El Capitan) の中身をTime Machine経由で移そうとしたら、移行先のOSが移行元より古いバージョンだと移行できない、と言われてEl Capitanを入れようとして、ところが以前MBAにEl Capitanをインストールする時に作ったインストーラ入りUSBメモリが壊れてる判定されたので諦めてSierraをですね

## なぜそもそもKarabiner（ないしKarabiner-Element）を？

元々USキーでAの左にctrlを持ってくる為にKarabinerを使ってたクチなのだけれど、JISキーボードではそれは不要。ではなぜそもそもKarabiner（ないしKarabiner-Element）を？

JISキーボードの左commandって打ちにくい。12-inchのコンパクトな筐体はパームレストが狭いから特に。かといって右commandを使うようには自分の脳の配線が出来ていない。
せめて英数キーあたりの位置に左commandキーがあってほしい。

英数キーを左commandにして、さらに言えば、かな変換・無変換のトグルのためにcommand-spaceとかするのは面倒だから、出来れば英数キーを単独で押した時は英数として機能してほしい。

とりあえず、英数キーを左commandにするだけならKarabiner-Elementsで容易に実現できた。

英数だけ打ったときに英数として効かせるのは、[wwwjfy氏の`standalone-modifiers`ブランチ](https://github.com/wwwjfy/Karabiner-Elements/tree/standalone-modifiers)をマージしたら実現できた（※[本家に対しpull-requestは出てるけど2016年10月21日現在未マージ](https://github.com/tekezo/Karabiner-Elements/pull/247)）


## Karabiner-ElementsでJISキーボードが強制的にUSキーボードになる問題

→ [JIS external keyboard recognized as US (ASCII) keyboard after v0.90.47](https://github.com/tekezo/Karabiner-Elements/issues/278)

英数を左commandにするのはうまく行ったんだけど、現行バージョン（0.90.52で確認）では強制的にUSキーボードとして認識されてしまう。

> [バージョン0.90.46ならJISのまま、という話だった](https://github.com/tekezo/Karabiner-Elements/issues/278)がそうでもない（いつの間にかUSになってる）

これまでUSキーボードを使うことが多かったしそれならそれで別に構わないんだけど、JISキーボードをUSキーボードとして認識されると `~` とか `\` とか打てなくなるんだよね。ホームディレクトリとか参照できなくて死ねる。

それってKarabiner-Elementsでどうにかならない？

答。まあ、なんとかなるにはなる。

バックスラッシュはJISキーボードの￥マークに割り当てて、「｀」はLの３つ右（「む」のキー）に割り当ててみた。右shiftの左（「ろ」のキー）のアンダースコアをアンダースコアとして活かせたら嬉しいんだけど設定が分からなかったのでとりあえず割当なしで。

|変換前| JISの該当キー |変換後|USの該当キー|
|:--|:--|:--|:--|
|international1| ろ | vk_none | 割当なし |
|international3| ￥ | backslash | \ |
|japanese_eisuu| 英数 | left_command | 左⌘ |
|backslash| ｝| grave_accent_and_tilde | ` |

`karabiner.json`はこんな風になってる。

```~/.karabiner.d/configuration/karabiner.json
{
  "profiles" : [
    {
      "fn_function_keys" : {
        "f1" : "vk_consumer_brightness_down",
        "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",
        "f10" : "mute",
        "f11" : "volume_down",
        "f12" : "volume_up"
      },
      "selected" : true,
      "simple_modifications" : {
        "international1" : "vk_none",
        "international3" : "backslash",
        "japanese_eisuu" : "left_command",
        "backslash" : "grave_accent_and_tilde"
      },
      "standalone_modifiers" : {
        "left_command" : "japanese_eisuu"
      },
      "name" : "Default profile"
    }
  ]
}
```

## 強制的にUSキーボードになる問題の回避

強制的にUSキーボードになる問題は、とりあえず[dcato氏が作ってくれた](https://github.com/tekezo/Karabiner-Elements/issues/278)パッチ `patch.txt` をあてて回避した。

```patch.txt
diff --git a/src/share/hid_system_client.hpp b/src/share/hid_system_client.hpp
index 945511e..2d83474 100644
--- a/src/share/hid_system_client.hpp
+++ b/src/share/hid_system_client.hpp
@@ -39,6 +39,7 @@ public:
                                                              std::bind(&hid_system_client::matched_callback, this, std::placeholders::_1),
                                                              std::bind(&hid_system_client::terminated_callback, this, std::placeholders::_1));
     }
+    logger_.info("modified karabiner_event_dispatcher executing....");
   }
 
   ~hid_system_client(void) {
@@ -85,7 +86,8 @@ public:
     event.key.charCode = 0;
     event.key.keyCode = key_code;
     event.key.origCharSet = NX_ASCIISET;
-    event.key.keyboardType = 0;
+//    event.key.keyboardType = 0;
+    event.key.keyboardType = 45; //JIS_MACBOOK_2008 45
 
     IOGPoint loc{};
     post_event(event_type == krbn::event_type::key_down ? NX_KEYDOWN : NX_KEYUP,
```

こんなパッチなので、

```
$ cd Karabiner-Elements
$ patch -p1 < patch.txt
$ make clean ; make
```

とかやって、結局

```~/.karabiner.d/configuration/karabiner.json
      (略)
      "simple_modifications" : {
        "japanese_eisuu" : "left_command"
      },
      "standalone_modifiers" : {
        "left_command" : "japanese_eisuu"
      },
      (略)
```

設定はこれだけ残して（英数キー回りの設定をいじるだけで）あとは普通にJISキーボードとして使っている。


### 参考
- [Kalabiner-Elements by tekezo氏](https://github.com/tekezo/Karabiner-Elements)
- [macOS Sierraにしてからcaps lock→controlのリマップが効かない場合の対処法](http://qiita.com/icchi_h/items/dc15c8545c38b493b71e)
- [macOS Sierra で karabiner を使いたい。設定サンプル](http://qiita.com/tumujin/items/5c0180b5c5d70c125be0)
- [JIS external keyboard recognized as US (ASCII) keyboard after v0.90.47](https://github.com/tekezo/Karabiner-Elements/issues/278)