Vimで入力した文字を表示するためのプラグイン、keycast.vimを作った。
仕組み
入力されたキーをbanner
コマンドで大きくして、popup windowに表示している。
キーの入力
最初、Vimでキーの入力を監視する方法が見つからなくて苦労した。
最初のPoCではInsertCharPre
を使っていた。
InsertCharPre
はその名の通り、insertモード時に文字が入力される直前に呼ばれるイベントである。
つまり、normalモード時に入力された文字は受け取ることができない。
PoC
twitter.comキーストロークを表示するやつ pic.twitter.com/XnVVegkfQH
— Pocke(ぽっけ) SW-1309-2807-5790 (@p_ck_) 2019年6月26日
次に、getchar()
とfeedkeys()
関数を使うことを考えた。
feedkeys()
関数のオプションをガチャガチャといじったが、これもうまくいかなかった。insertモードに入ると画面の更新が止まってしまって使うのは厳しそうだった。
最終的に、popup windowを使ってキー入力を監視することにした。
popup windowにはフィルタという便利な概念がある。フィルタを使うと、popup windowが開いている間のキー入力を全て監視し、任意のコードを実行することができる。 https://vim-jp.org/vimdoc-ja/popup.html#popup-filter
これは本来開いているpopup windowを操作するための機能であるが、なにも表示しないpopup windowを最前面に表示してそれにフィルタを設定すれば、実質的に全てのキーを監視する機能として使うことができる。
他にいい方法があったらおしえてください。
popupの表示
ふつーにpopup_create
関数でpopupを表示している。
また、新しいキー入力が合った時には既存のpopupを動かして重ならないようにしている。
https://github.com/kusabashira/vim-nicomment のソースコードを見ていて、popup_move
という関数の存在を知った。
このプラグインのおかげでPoCをプラグインまで仕上げようと思ったので、vim-nicommentを知れてよかった。
感想
popup windowはやはり便利ですね。