Neovim in Neovimを回避するLua製プラグイン

2023/03/26に公開

https://github.com/notomo/waitevent.nvim

Neovim内でnvimコマンドがファイルを開く際に親のNeovimで開くプラグインを作成した。

なぜ作った?

同じ目的のプラグインは古くから多くある。 (参考: https://github.com/lambdalisue/guise.vim )
Lua製に絞っても既に以下の2つが存在する。

Neovimの新しめの機能の実験を兼ねて、外部依存なく今までと少し違ったアプローチが可能なのではと考えて実装した。
2023年03月26日現在、このプラグインに特有な部分を以下で紹介する。

プラグインの影響範囲が限定的

Neovim内から実行したgitghコマンドでNeovimがネストせずに起動すれば自分の用途だと支障がない。
以下のようにGIT_EDITORのみを設定すれば、EDITORを使うコマンドには影響しない。

vim.env.GIT_EDITOR = require("waitevent").editor()

require("waitevent").editor()は実行可能な文字列を返すだけで、利用側が好きな環境変数に設定する。
ただの環境変数の設定なのでGIT_EDITORを使うコマンドが実行されるまでほぼ何もしない。

子として起動するプロセスでプラグインのロードを必要としない

Neovimのnightlyに実装されている起動オプションの-ll {script}を使っている。

https://neovim.io/doc/user/starting.html#-ll

上記のオプションを使ってnvimコマンドを起動するとエディタとして起動されず、設定のロードもなくLuaファイルを実行する。

このため、{script}部分を独立したLuaのスクリプトとして実装している。
今回このスクリプト内で子のnvimプロセス起動時のオプションをハンドリングしている。

現状は多くのオプションが子プロセスにおいては有用でないとして、オプション付きの実行はネストした起動になるようにフォールバックする。
その点が用途によってはデメリットになりそう。

感想

-ll {script}によってNeovimがまた便利なLua実行環境になったように感じる(?)
スクリプト内ではスレッド同様vim.(fn|api|cmd)等を利用できないが、今回の用途だとvim.loopの関数で間に合った。

Discussion