経緯
新しい MacBook Pro を入手したところまではよかったんだけど、最初から Sierra なので Karabiner をどうするかが問題となった。まずは Karabiner-Elements への移行を試みたがあえなく失敗し、頼みの綱だった keyhac for Mac も一番重要な設定が実現できず、途方に暮れている。
このまま Vim が使えないと緩やかな死を迎えることになるので、幸運にもソースが公開されている keyhac を改善して打開したい。具体的には以下が目標となる。
- 特定のアプリケーションで replaceKey の設定を無効化するための方法を探る
- API追加提案 or 最悪魔改造
- キーが押しっぱなしになるバグの改善
- 最新版では修正済みっぽいんだけどまだ発生している・・・
- Mac 版も Python 3.5.x に移行する
- 3.5 だと Pillow がインストールできないとか書いてあった
- Win 版と Mac 版の差の把握
基本的には 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 を Xcode でビルドするとエラー発生。
Python ヘッダーディレクトリのパス解決
pyenv を使って Python 3.4 環境を用意したのでヘッダーディレクトリへのパスが通ってないのが原因。
もともとの設定は /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
に変更する。
Redefinition of enumerator 'kVK_RightCommand'
/path/to/ckit/ckitcore/mac/ckitcore/ckitcore_hook_mac.cpp:49:5: Redefinition of enumerator 'kVK_RightCommand'
enum の重複定義っぽいエラー。とりあえずコメントアウトした。
enum AdditionalVk
{
kVK_RightCommand = 0x36,
};
enum AdditionalVk
{
// kVK_RightCommand = 0x36,
};
Python dylib リンクエラー
ビルドの最後の方のリンクでエラーが発生した。Support Files の Python が参照エラーになっているので、これを解決する必要がある。ただ、普通に pyenv で Python をインストールすると static library しか生成されないので、dynamic link library がほしいなら --enable-framework
オプションをつけてインストールする必要があるとのこと(参考リンク)。
$ 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 に向ける。
これで警告が消えて ckit のビルドが完了した。まだ到達しないコードの警告が2つあるけどとりあえず無視。
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 が起動できた。