neovim/go-clientにcontributionした話
Noahです。
この記事は
↑の23日目の記事です。
言わずと知れたNeoVim、その中の機能にRemotePluginがあります。
簡単に言ってしまうとNeoVimのプラグインを別プロセスで動かすもので、原理的にMsgpack-RPCを使えばどんな言語でもプラグインが書けてしまう素晴らしいものです。
自分はVim(ないしはNeoVim)歴4年位なのですが、Vim好きが高じて最近は趣味でNeoVimプラグインをGolangで書いています。
最近自分のメイン言語になっているGolangで書く際は、neovim/go-clientを利用しています。
そして今回は、このライブラリにコントリビューションした ~かった~ 話
何したのか
vim、NeoVim、Golangにコントリビュートしたい!という気持ちは以前からあり、ちょうどIssueが立っていたneovim/go-clientの機能追加を行いました
といっても、メインで開発をしている方が立てたIssueでしかも一年以上放置されていたので、ちょっとためらいましたが、PRを作成しました。
やったこと
Golangでプラグインを作成する際は、ビルドして $PATH
上に置いたあと、NeoVimと通信するために以下のようなmanifestと呼ばれるコードをvimscriptで記述しないといけません。
" 公式READMEから拝借 call remote#host#RegisterPlugin('hello', '0', [ \ {'type': 'function', 'name': 'Hello', 'sync': 1, 'opts': {}}, \ ])
これは自動生成でき、実行形式にしたファイルを helloworld.nvim --manifest=hello
のように実行すると内部で処理し、標準出力に吐いてくれます。
しかし、標準出力で吐いた後、コピペやリダイレクトでVimscriptに貼り付けねばなりません。
自動生成できるなら、自動で書き換えりゃええやん、というのが大筋の流れです。
使い方としては、manifest
オプションと併用し --location=/path/to/init.vim
のように、init.vimの場所を指定することで標準出力ではなくinit.vimへ自動でmanifestが追記・修正されるようになります。
自分は最初、PRを作成した際に正規表現を使わず文字列としてマッチした部分を取り除き、そこに挿入するイメージでPRを作成しました。
が、メインで開発を行っている人に、「フラグ、ちょっと重複しとる部分あるから直しといて」「単純に正規表現使うといいで」「テストも追加しといてな」というようなことをツッコまれ、さらにシュッとこんな感じとコードまで提示していただき、すごく勉強になりました。
ひとことと宣伝
vimconf2017、自分も行きましたが最高でした!
vim界隈のあんな人やこんな人のお話を聞けて幸せ過ぎました…。ありがとうございます。
あと、10日ほど前の記事になりますが、AizuAdventCalendar 13日目のこの記事もNeoVimプラグインに関することなので、よろしければどうぞ
ちなみにこの記事冒頭でもうすぐgithub contributionが4桁行きそうだと言いましたが、
4桁行きました🎉(感動)