RubyにハマったのでRubyでNeovimプラグインを書いてみる。 バージョンはruby 3.0.6。

下準備

NeovimのRubyのサポートを追加するため、Neovimライブラリをインストールする。 gem install neovim

checkhelth providerを実行してRubyサポートが有効になっているか確認する。

この時、インストールディレクトリがPATHにないとエラーが発生するので注意。

ディレクトリ構成

runtimepath上にあるrplugin/ruby/*rb*を読み込む仕様なので、以下のように構成する。

ディレクトリを作成したあとは任意のプラグインマネージャかruntimepathを編集して読み込ませる。 LSPを使う場合はbundle initでGemfileを作成する。

.
├── Gemfile
└── rplugin
    └── ruby
        └── plugin.rb	

プラグインを書いてみる

NeovimのAPIをラップしたライブラリがあるのでそれを使う。

基本はDSLを使うのでここを参考に書いていく。書き終わったらUpdateRemotePluginsを忘れずに。

require "neovim"
 
Neovim.plugin do |plug|
  plug.command("RubyHello") do |nvim|
    nvim.command(":echo 'Hi!'")
  end
end

Rubyエアプなので細かい説明は書かないけども、ざっくりこんな感じになってる。

  • Neovim.pluginのスコープ内で使えるplugオブジェクトでautocmdや実行するコマンドなどの定義をおこなう。
  • plugのメソッドで作られるスコープ内で使えるnvimオブジェクトからNeovimが持つ関数群を呼び出し処理を行う。

それぞれ使えそうなメソッドを上げてみる。

plug

command

Neovimで呼び出せるExコマンドを定義する。~~先頭に:を付けるとエラーになるので注意。~~文字列にしなければ:を付けても良いらしい。ElixirのAtom的なやつ?

autocmd

autocmdを定義する。イベント名は:h autocmd-eventsで参照できる。

function

他のスクリプトから呼び出せる関数を定義する。

nvim

command

NeovimのExコマンドを実行できる。困ったらこれを使えば良さそう。

余談

その他の関数は恐らくNeovim API1の名前を使えば呼び出せるっぽい。 Rubyでプラグイン作った人が記事(英語)を書いているので色々参考になりそう。

Neovim API周りを漁ってたらElixirでNeovimプラグインを書ける代物を見つけてしまったのでこれも触ってみたくなってきた…Gleamで型付けしてパッケージにしてみたい。

Footnotes

  1. 由来は多分Lua APIのvim.apiなのでLua APIをいじりながらコードを書くと捗りそう。型は不明なので色々理解ってきたらここにも書き足していきたい。