MacのキーマッピングアプリのKarabiner-Elementsの自分設定を書く際には KE-complex_modificationsを使うと便利ですが、 その中で設置をウェブに表示するようにした際に 表示する追加情報を、JSONファイルを解析して自動で生成する様なスクリプトを作ってみました。
extra_descriptions
KE-complex_modificationsを使って色々やることについては上の中に詳しく書いてあります。
この中にsrc/extra_descriptions/ というディレクトリにJSONファイル名+.htmlな ファイルを作っておくと 最終的に出来るindexページにその内容がそのJSONファイルの設定に関する 追加情報として表示できる、という話があります。
項目名だけでは分からない詳細な機能や 実際に行っているキーバインドなんかは書きます。
これを作った設定について一通り書いていったりしてたんですが、 余りに面倒だったのでJSONファイルから自動で作ってくれる様なスクリプトを作成しました。
json2exhtml.rb
フォークしたKE-complex_modificationsのレポジトリの中にあります。
KE-complex_modifications/json2exhtml.rb at master · rcmdnk/KE-complex_modifications
やっていることは
- JSONファイルの読み込み。
rules
の各項目についてそれぞれ以下のことを行う。- もし
extra_description_level
という値があれば取ってきて、0ならその項目について一切表示しない、1ならキー設定のテーブルは表示しない、2以上なら全て表示、というチェックを行う。 description
の値を題名っぽく表示。extra_descriptions
があれば、その中身をリストで表示。(ただの文字列ならそれを一列、リストであればそれぞれを一列毎に表示。)- キー設定を全てテーブルにして表示。
- もし
ということ。
ここでextra_descriptions
とextra_description_level
という値はKarabiner-Elementsでは使わない項目です。
ただKarabiner-Elementsに渡すJSONの中にこういった余計な値が入っていても特に問題はなさそうなので JSONファイルの中の必要な部分にこれらの値を入れる様にしました。
これらの値の使い方の例は こちら を参考に。
これらの追加項目を入れなくても キー設定一覧が作れます。 特にERBファイルを使って色々自動生成する場合、 パット見で実際のキー設定が分かりづらい時がありますが このスクリプトを使ってキー設定一覧を書き出すと分かりやすくなると思います。
キー設定についてですが、manipulators
の各項目のfrom
とto
の情報を使って、
それぞれkey_code
やmodifiers
の値を表示する様にしています。
from
については今のところkey_code
とマウス操作のpointing_button
だけだと思うので
それだけをチェック。
to
については複数のキーを割り当てたりも出来ますが、
出力の種類としてもkey_code
やpointing_button
だけでなく、
shell_command
やset_variable
と言ったものもあります。
どれだけの種類があるのかしっかりとは確認出来てませんが、 おそらく
Karabiner-Elements/event_queue.hpp at master · tekezo/Karabiner-Elements
にあるenum class type
にある名前のものなんじゃないか、と思ってそれをチェックする様にしています。
Example
上のページにおいた自分設定に関してextra_descriptionsのファイルはこの自動生成で作りました。
こんな感じです。
とりあえずのものとしては上手く行ってると思います。
このレポジトリではMakefileに
all:
scripts/update-json.sh
scripts/json2exhtml.rb < docs/json/personal_rcmdnk.json > src/extra_descriptions/personal_rcmdnk.json.html
scripts/erb2html.rb < src/index.html.erb > docs/index.html
scripts/apply-lint.sh
と言った形でjson2exhtml.rbをJSON生成後かつindex.html作成前、に JSONから追加情報HTMLを作っています。
気になる点
ざっと作って差し当たり自分の設定に関してはいい感じになってると思いますが、 まだ改良できそうな点や 今のところ実現出来てない点について。
アプリ設定やデバイス設定は無視
conditions
の値を取ってくる事も可能ですが、
例えばerb2json.rbを使ってemacs_key_bindings_exception
とかでアプリを指定するとアウトプットとしては40個位になって
全部書くのは大変だしわかりにくいものになります。
デバイスとかもただの数字だけですし。
これらをERBから変換する時についでにやって emacs_key_bindings_exceptionとかそういった名前自体を載せるのもありかな、とは思ってます。
差し当たり別のスクリプトでやりたかったのと、 ERBをもう一度解析してやるのはあれかな、と思ったので JSONから直接つくる様なスクリプトにしましたが、 ERBのインプットも表示する情報として使いいやすいものがあるので ちょっと考えてみても良いかも。
descriptionの扱いがindexに直接出すものとextra_descriptionsに出すもので違う
description
の値はerb2html.rbを使ってindex.htmlを作る時に
一覧表示として取り込まれます。
ここではERB::Utilというクラスのh
という関数を使って
&
とかの文字をエスケープします1。
一方、json2exhtml.rbの方はそのまま書き出すので
例えばjson2exhtml.rb用に`
みたいな
文字コードを使って特殊文字を書こうとすると
extra_descriptionsでは正しく出ても
erb2html.rbの出力では&
自体がエスケープされ文字コードに変換されて
正しく表示されなくなってしまいます。
まあこれはerb2html.rbの方に合わせる様、 json2exhtml.rbを変更するべきか。
toの複雑な出力とかmodifiersのoptionalとか
キー設定の出力側で、
to_if_alone
とかto_after_key_up
とかそう言った複雑な設定もあります。
そういったものは今のところ無視しています。
また、from
でもmodifiers
のoptional
な設定とかもありますがこれも無視。
まあこの辺は余り色々書き出してごちゃごちゃさせると意味が分からなくなるので、 そこまで細かいところはJSONを直接確認、といった所で良いのかな、とは思ってます。