NoahOrblog

某・福島にある大学のコンピュータ理工学部の大学生のお話。

neovim/go-clientにcontributionした話

Noahです。

この記事は

qiita.com

↑の23日目の記事です。


f:id:NoahOrberg:20171127084334j:plain
NeoVim

言わずと知れたNeoVim、その中の機能にRemotePluginがあります。

簡単に言ってしまうとNeoVimのプラグインを別プロセスで動かすもので、原理的にMsgpack-RPCを使えばどんな言語でもプラグインが書けてしまう素晴らしいものです。

自分はVim(ないしはNeoVim)歴4年位なのですが、Vim好きが高じて最近は趣味でNeoVimプラグインGolangで書いています。

最近自分のメイン言語になっているGolangで書く際は、neovim/go-clientを利用しています。

github.com

そして今回は、このライブラリにコントリビューションした ~かった~ 話

何したのか

vim、NeoVim、Golangにコントリビュートしたい!という気持ちは以前からあり、ちょうどIssueが立っていたneovim/go-clientの機能追加を行いました

github.com

といっても、メインで開発をしている方が立てた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プラグインに関することなので、よろしければどうぞ

noahorberg.hatenablog.com

ちなみにこの記事冒頭でもうすぐgithub contributionが4桁行きそうだと言いましたが、

f:id:NoahOrberg:20171223163405p:plain

4桁行きました🎉(感動)