🐎

素早く安全にプラグインにパッチを打つ

2023/09/10に公開

この記事はVim駅伝の2023年9月11日の記事です。

私はVimのプラグイン開発者です。自分でもプラグインを作りますし、人のプラグインも使わせてもらっています。そうしていると必然的にバグと遭遇します。

また、今回紹介する手法で使っているddu.vimを含め、先端に近いプラグインを使っていると更新が激しいためバグと遭遇する確率は著しく上がります。

この場合、自力で検証できるだけの知識がある場合に取る手段は大体2つになります。

  • 検証したのち作者にバグ報告。直してくれるのを待つ
  • 検証した情報を元にパッチを作成し、作者に取り込んでもらう

前者であれば、こちらがやることは検証してレポート作ることだけで直し方など考えなくてもいいので楽ではありますが、作者に負担がかかるためあまり好ましくはありません[1]。それに直るまで古いバージョンを使い続けないといけなく不便でもあります。

そうなると、自力で直すことになるのですが、リポジトリの複製するのも怠惰な自分にとっては面倒な作業ですし、プラグインマネージャを使っている場合には差し替えるのにもちょっと手間がかかります[2]
それに、普段の環境で触りたいけど普段の環境を壊したくありません。

そこで私がこの問題を解消するためにやっている設定について紹介しようと思います。

templug

https://github.com/kuuote/dotvim/blob/051ab01841ae95587631c980b62a04165645b734/conf/dein.vim#L85-L95

まず、プラグインを素早く差し替えるための設定をします。基本的にVimはruntimepathの先頭からスクリプトを読み込むため、プラグインマネージャがruntimepathを変更した直後に割り込んで、runtimepathの先頭に差し込むと大体上手く行きます。

検証のための機能なので、使いたい時だけ機能するのが好ましいです。そして設定はいじりたくありません。そのため、その場で切り替えられる機能として環境変数を採用しました。
plug=on vimplug=on nvimのように起動するとtmp/templug/*に置かれているプラグインをruntimepathの先頭に差し込みます[3]

検証用の機能として、すぐに掃除するための:TemplugCleanというコマンドも用意しています。

他にも似た機能としてVimを起動したディレクトリにあるプラグインを読み込む機能も用意しており、開発をしているのであれば便利だと思います。

余談ですが天麩羅とは全く関係ないです。鶏天食べたい。

rsync

https://github.com/kuuote/dotvim/blob/051ab01841ae95587631c980b62a04165645b734/conf/plug/ddu/ddu.ts#L255-L278

プラグインを差し込めるようにしたものの、ブラウザを開いたり定義を見てURLを補完したりしてgit cloneをしたりするのはとても(当社比)面倒です。えっちらおっちらそんなことやってると日が暮れてしまいます。自動化しちゃいましょう。

私はプラグインマネージャとしてdein.vimを使っており、これには(あまり知られていない気がするのですが)ddu.vimで使えるソースが同梱されています。これを使うとプラグインを素早く選べ、Itemはプラグインへのパスと名前を持っています。これを使わない手はありませんということで、rsyncというカスタムアクションを生やしました。[4]

実行するとrsyncコマンドが裏で走り[5]、dein.vimのキャッシュから/tmp/templug/{plugin_name}に使われているプラグインがそのまま複製され、トップディレクトリが開かれます。
作業中にうっかり閉じてしまった時のためにディレクトリ開く所だけやるtemplugアクションも用意しています。

後は破壊しまくりながら調査するなり修正や機能追加をするなり、やりたいことをひたすらやるだけです。

おまけ

GitHubを使っており、Pull Requestの準備のためにforkをしていることが結構あるのですが、pushする時にremoteがfork先に向いていると便利なので、差し替えるコマンドを稀によくコマンド履歴から引っ張り出して使っているので、ここに載せておきます。

s/https:\/\/github.com\/[^\/]\+/git@github.com:kuuote/

これを.git/configを開いてremoteのURLが書いてある行で実行するとremoteが自前のforkと差し替わります。kuuoteの所を変えれば誰でも使えると思います。

貢献は結構面倒臭い物と思われがちですし、私もそう思っていました。しかし、手間を減らすことはできます。(減ってなお面倒臭いのは置いておく)

気軽に破壊的な変更を試したり貢献したりできるようにしたりしておくと、プラグイン開発が捗ったり、気に入ったプラグインの応援をしたりできるようになって一歩先に進めると思います。

ここに書いたやり方でも、そうでないやり方でも、この辺りを最適化するのはいい効果が得られると思います。

:q↵

脚注
  1. この手のソフトウェアを作っている方々は基本的にボランティアのように余暇時間を使って対応しているため、あまり余裕が無いことがほとんどです。 ↩︎

  2. プラグインマネージャの定義を差し替える、差し替え機能を使うように設定を書き換える、runtimepathをどこかのタイミングで書き換える、など ↩︎

  3. 知ってる人であればvim-pathogenがやる動きに近いと言った方が分かりやすいかもしれません。 ↩︎

  4. ddu.vimにはカスタムアクションという機能があり、選択した物に対して任意のコードを実行できます。挙動を好き放題書き換えられるセレクタが欲しい人にはおすすめ。 ↩︎

  5. 当然ながらrsyncコマンドが環境に無いと動かないが、福利厚生ということにしておいてほしい… ↩︎

GitHubで編集を提案

Discussion