keyhac for Mac の開発環境を整える

# 経緯

新しい MacBook Pro を入手したところまではよかったんだけど、最初から Sierra なので [Karabiner](https://pqrs.org/osx/karabiner/index.html.ja) をどうするかが問題となった。まずは [Karabiner-Elements](https://github.com/tekezo/Karabiner-Elements) への移行を試みたがあえなく失敗し、頼みの綱だった [keyhac for Mac](https://sites.google.com/site/craftware/keyhac-ja) も一番重要な設定が実現できず、途方に暮れている。

このまま Vim が使えないと緩やかな死を迎えることになるので、幸運にも[ソースが公開されている keyhac](https://github.com/crftwr/keyhac) を改善して打開したい。具体的には以下が目標となる。

+ 特定のアプリケーションで replaceKey の設定を無効化するための方法を探る
    + API追加提案 or 最悪魔改造
+ キーが押しっぱなしになるバグの改善
    + 最新版では修正済みっぽいんだけどまだ発生している・・・
+ Mac 版も Python 3.5.x に移行する
    + 3.5 だと Pillow がインストールできないとか書いてあった
+ Win 版と Mac 版の差の把握


## 基本的には wiki に従う

https://github.com/crftwr/keyhac/wiki

## Python 3.4.x と依存パッケージのインストール

[anyenv]() で [pyenv]() を用意して、pyenv で Python 3.4.5 をインストール。とりあえず[virtualenv]() とかは使用せずに global にした。
`pip3.4`（3.4.5 を global 指定すると `pip` も 3.4.5 のものになってるけど）を使って wiki に書いてある以下のパッケージをインストール。

+ Pillow
+ docutils
+ pygments

`keyhac` と `ckit` は同階層に `clone` してそれぞれ `mac_port` ブランチをチェックアウトしておく。

## ckit のビルド

[ckit](https://github.com/crftwr/ckit) を Xcode でビルドするとエラー発生。

<img width="863" alt="Screen Shot 0028-11-10 at 21.56.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/69860/3cafad91-6932-1986-637f-f78d89400b96.png">

### Python ヘッダーディレクトリのパス解決

pyenv を使って Python 3.4 環境を用意したのでヘッダーディレクトリへのパスが通ってないのが原因。

<img width="1126" alt="Screen Shot 0028-11-10 at 22.04.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/69860/bb8c24d3-5697-3ead-1f34-cf10461c3a04.png">

もともとの設定は `/Library/Frameworks/Python.framework/Versions/3.4/Headers` となっていたのだが、ここ数世代の macOS では `/System/Library/Frameworks/Python.framework` 以下に移動している。ここに 3.4 があるなら pyenv いらなかったか、と思ったけど、移動先を見てみると 2.7 までしかないので、pyenv は無駄にはならなかった。

ヘッダーディレクトリのパスを `/Users/<username>/.anyenv/envs/pyenv/versions/3.4.5/include/python3.4m` に変更する。

<img width="964" alt="Screen Shot 0028-11-10 at 23.13.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/69860/2c1051a8-0772-3fd2-884a-9d9d1ea2f4e2.png">

### Redefinition of enumerator 'kVK_RightCommand'

```
/path/to/ckit/ckitcore/mac/ckitcore/ckitcore_hook_mac.cpp:49:5: Redefinition of enumerator 'kVK_RightCommand'
```

enum の重複定義っぽいエラー。とりあえずコメントアウトした。

```before.cpp
enum AdditionalVk
{
    kVK_RightCommand = 0x36,
};
```

```after.cpp
enum AdditionalVk
{
    // kVK_RightCommand = 0x36,
};
```

### Python dylib リンクエラー

ビルドの最後の方のリンクでエラーが発生した。Support Files の Python が参照エラーになっているので、これを解決する必要がある。ただ、普通に pyenv で Python をインストールすると static library しか生成されないので、dynamic link library がほしいなら `--enable-framework` オプションをつけてインストールする必要があるとのこと（[参考リンク](https://github.com/yyuu/pyenv/issues/99)）。

```
$ env PYTHON_CONFIGURE_OPTS="--enable-framework" pyenv install 3.4.5
```

インストールが終わると `/Users/<username>/.anyenv/envs/pyenv/versions/3.4.5` 以下に Python.framework が出現するので、ヘッダーディレクトリと dylib のパスをこちらに変更する。

+ ヘッダー: `/Users/<username>/.anyenv/envs/pyenv/versions/3.4.5/Python.framework/Headers`
+ dylib: `/Users/<username>/.anyenv/envs/pyenv/versions/3.4.5/Python.framework/Python`

これでいったんビルドは成功するけど、リンク時に存在しないディレクトリが指定されているという警告が出ている。
どこで設定しているのか迷ったけど、TARGETS の Library Search Paths に古いパスを見つけたので、これを pyenv の Python.framework に向ける。

<img width="768" alt="Screen Shot 0028-11-11 at 0.49.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/69860/daa256dd-df9f-3e74-99d6-3ab226c685b6.png">

これで警告が消えて ckit のビルドが完了した。まだ到達しないコードの警告が２つあるけどとりあえず無視。

## keyhac の実行

wiki にはシンボリックリンクを張る指示があったが、特に何もしなくても ckitcore.so が作成されていたので起動してみる。

```
$ python keyhac_main.py -d
```

残念ながらまたしてもエラー発生。

```
Traceback (most recent call last):
  File "keyhac_main.py", line 19, in <module>
    import keyhac_keymap
  File "/Users/kodama/Work/keyhac/keyhac_keymap.py", line 17, in <module>
    import accessibility
ImportError: No module named 'accessibility'
```

iTerm.app がアクセシビリティの許可リストに入ってなかったので、追加してから再実行したけど同じエラーが表示される。素直に pip で accessibility をインストールしてみる。

```
$ pip install accessibility
```

これで無事 keyhac が起動できた。