Vim で help が引ける npm パッケージを作った

色々あって node.js から Vim の help を引く必要が出てきたので、npm パッケージにしてみた。人生初 npm パッケージです。

https://www.npmjs.com/package/vimhelp
https://github.com/thinca/node-vimhelp

特に必然性はなかったのだけど、せっかくなので勉強も兼ねて ES2015 で書いてみた。node.js にも依存しているので、node.js 6 以降が必須です。 このパッケージは外部プロセスとして Vim を起動して、help を引きます。なので環境に Vim が必要です。また、プラグインの help も引きたいというそれだけのために Git を使った簡易プラグインマネージャも付いてます。こちらを使う場合は Git が必要。 使い方とかは README を参照してください。

苦労した点

初めての npm

今回初めてだったので、npm の作法やら ES2015 の機能やら、ついでにテストやらカバレッジ計測やら色々調べながらやった結果、必要以上に時間がかかってしまった…。

非同期地獄

node.js の非同期 API は、呼び出しスタックの奥底に 1 つでも非同期が混じると根本から非同期の API にする必要が出てくるのがだいぶしんどく感じた。Promise のおかげでネスト深いは回避できているものの、やはりまだしんどい印象が拭えない。ES2016 で入るとの噂の await があるとここがかなりマシになりそうな予感がするので、はよ。

外部プロセスのテスト

外部プロセスを起動するようなプログラムのテストはどこまでモックにするべきかがかなり悩ましい。コマンド実行部分をモックにすると、想定したコマンドが実行されているかまではテストできるが、想定したコマンドが期待した結果を生むかまではテストできない。そこまですべきなのかどうなのか…。 今はモック化するのが難しかったという理由もあって、テストでも実際にコマンドが実行されている。なのでプラグインマネージャのテストが走る度に git clone が実行されるという感じに…。実行も遅くなるので正直しんどい。

機能実現のアプローチについて

今回 Vim の help を引くという機能を実現するにあたって、Vim を実際に実行するという手段を選んだわけだけど、helptags や help ファイルを直接読んでパースするという手段も考えられた。 実際のところ、直接読んだ方が速度や効率は良いと思う。ただ、tags ファイルをパースしたり、Vim がやっている :help の引数の独自解釈などを自分でやるのが面倒だったため、今回は直接起動する方法を取った。こちらの方法だと、今後 Vim が :help の動作を拡張などした場合にも対応できる。そういう機会はそうそうないとは思うけども。少なくとも私が必要としている用途においてはこれでも十分な速度で動いている。

さいごに

初 npm パッケージ、作ってみたのはいいけど自分以外には需要なさそう。まだ欲しい機能がいくつかあるので、のんびり更新していく予定。