Posted at

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

More than 3 years have passed since last update.


経緯

新しい 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 に従う

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


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

anyenvpyenv を用意して、pyenv で Python 3.4.5 をインストール。とりあえずvirtualenv とかは使用せずに global にした。

pip3.4(3.4.5 を global 指定すると pip も 3.4.5 のものになってるけど)を使って wiki に書いてある以下のパッケージをインストール。


  • Pillow

  • docutils

  • pygments

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


ckit のビルド

ckit を Xcode でビルドするとエラー発生。

Screen Shot 0028-11-10 at 21.56.36.png


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

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

Screen Shot 0028-11-10 at 22.04.04.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 に変更する。

Screen Shot 0028-11-10 at 23.13.46.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 オプションをつけてインストールする必要があるとのこと(参考リンク)。

$ 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 に向ける。

Screen Shot 0028-11-11 at 0.49.06.png

これで警告が消えて 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 が起動できた。