Upgrade to Pro — share decks privately, control downloads, hide ads and more …

RubyでNeoVim Pluginを作る技術

Avatar for fujitani sora fujitani sora
February 19, 2025
54

RubyでNeoVim Pluginを作る技術

Avatar for fujitani sora

fujitani sora

February 19, 2025
Tweet

More Decks by fujitani sora

Transcript

  1. 名前 • 藤谷 想楽(fujitani srra) • @_fs0414 • 2001 (23)

    所属 • toridori.inc • プロダクト領域開発統括部 tips 今年に入ってからふりかけにはまっています 自己紹介
  2. 2022 12月19日 東証グロース市場 に 上場 2016 2017 2019 10月 インフルエンサー広告

    プラットフォームシステム アップロント を展開 株式会社 アップロント 設立 2020 8月 インフルエンサー マネジメント事務所 OTOZURE 設立 株式会社 コラボテクノ ロジー に社名変更 インフルエンサー広告 プラットフォームシステム コラボマーケ ティング & コラボベース をリリース 渋谷 オフィス に移転 株式会社 トリドリ に社名変更 各サービス toridori シリーズ へ名称変更 2021 7月 株式会社 GIVIN と事業統合 インフルエンサーブランド 立ち上げ支援 toridori made 始動 10月 10月 9月 6月 沿革 2023 12月 株式会社 OverFlow と事業統合
  3. Abstract • NeoVimは一つの起動につき「インスタンス」という単位で管理される(以降 NeoVimインスタンス) • NeoVimインスタンスから外部プロセスのコードを実行して結果を受け取る、RemotePluginという仕組みが用意されている ◦ RemotePluginとして定義したコードをProcedureとしてRPC Requestを実行、結果をNeoVimインスタンスで受け取れる •

    RemotePluginは複数言語での記述に対応しており、Ruby言語もサポートされている • neovimというGemからNeoVim classをloadでき、簡単にRemote Procedureとしての関数を実装できる • Rubygemsからneovimというgemが公開されており、これを使ってRuby側の実装を行う • gemの内部実装を見ていくと、DSLクラスの実装によって「Neovimインスタンスからのみ必要なメソッドを実行できる。 それ以外の手段ではraiseする。」という仕組みがある • そんな仕組みを使って実装したrb-rescue-sender.rbはこんな感じ
  4. RemotePluginのコードが実行されるまで ~ RPC Requestの生成 使用する言語名をhostとし、/rplugin/{host}/ 配下に配置されたコードを実行する。 今回の言語はrubyなので/rplugin/ruby/ になる 配置するだけではNeoVimインスタンスからの実行はできず、RPC Request用のcallを

    生成する:UpdateRemotePluginsコマンドを実行する必要がある /rplugin/ruby/ 配下に配置された.rbがRemotePluginとして作成される。 UpdateRemotePluginsコマンドの実行で、manifest = RPCのcallがplugin.vimファイルに生成される
  5. Neovim.plugin # Placeholder method for exposing the remote plugin DSL.

    This gets # temporarily overwritten in +Host::Loader#load+. Neovim.pluginは公開用のPlaceholder methodであり、RemotePluginのロード時にHost::Loader#loadに上書きされている。 どこでロードされているのか、内部実装を読み進めていく。