pockestrap

Programmer's memo

keycast.vimをつくった

Vimで入力した文字を表示するためのプラグイン、keycast.vimを作った。

github.com

f:id:Pocke:20190707141255g:plain
screencast

仕組み

入力されたキーをbannerコマンドで大きくして、popup windowに表示している。

キーの入力

最初、Vimでキーの入力を監視する方法が見つからなくて苦労した。

最初のPoCではInsertCharPreを使っていた。 InsertCharPreはその名の通り、insertモード時に文字が入力される直前に呼ばれるイベントである。 つまり、normalモード時に入力された文字は受け取ることができない。

PoC

twitter.com

次に、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はやはり便利ですね。