Haskellでテンキーに動的なキーバインドを設定できるやつを作った
テンキーに対して動的なキーバインドを設定するためのHaskellライブラリ"WildBind"をリリースした。
- debug-ito/wild-bind: Dynamic key binding framework (GitHub)
- wild-bind: Dynamic key binding framework (hackage)
現状はX11デスクトップ環境のみサポートしている。要はxbindkeysみたいなものだが、その実体は普通のHaskellモジュールである。以下のようにして使う。
import WildBind.Task.X11 import System.Process (spawnCommand) main = wildNumPad myBinding myBinding = binds $ do on NumCenter `run` putStrLn "Hello, world!" on NumPageUp `run` spawnCommand "firefox"
「動的なキーバインド」というのは、ここでは2通りの意味で使っている。
第1に、WildBindではアクティブなウィンドウに応じてキーバインドを変化させることができる。例えば、Firefoxが開いているとき、動画プレーヤー(VLCとか)が開いているとき、PDFビューワ(evinceとか)が開いているとき、それぞれに対してキーバインドを設定すれば、それらが自動的に切り替わる。
第2に、WildBindではキーバインド自体が状態を持ち、自身の状態によってキーバインドを変化させることができる。そのため、例えばEmacsのようにキーシーケンスに対してアクションを割り当てることができる。
なお、現状ではWildBindはテンキー上のキーにのみ、キーバインドを設定できる。これは、全てのキーを対象とするように作るのが面倒だったのと、全てのキーを対象とした場合は動的なキーバインドなどほとんど必要ないと思ったからである。テンキーという限られたスペースに可能な限り機能を詰め込むのがWildBindの基本的な考え方である。
詳しい説明やコード例はGitHub上のREADMEを参照されたい。
ところで余談だが、WildBindは数年前に作ったNumpaarというものが元になっている。
NumpaarはPerlとCで書かれていて、やたら複雑なマルチプロセス構成になっており、使いづらい上に不安定だった。そこで今回、全てをHaskellで書き直すことにしたのだった。