Neovim in Neovimを回避するLua製プラグイン
Neovim内でnvim
コマンドがファイルを開く際に親のNeovimで開くプラグインを作成した。
なぜ作った?
同じ目的のプラグインは古くから多くある。 (参考: https://github.com/lambdalisue/guise.vim )
Lua製に絞っても既に以下の2つが存在する。
- https://github.com/willothy/flatten.nvim
-
https://github.com/samjwill/nvim-unception (現状
lua/common/
などが存在していて行儀は良くないかも)
Neovimの新しめの機能の実験を兼ねて、外部依存なく今までと少し違ったアプローチが可能なのではと考えて実装した。
2023年03月26日現在、このプラグインに特有な部分を以下で紹介する。
プラグインの影響範囲が限定的
Neovim内から実行したgit
やgh
コマンドでNeovimがネストせずに起動すれば自分の用途だと支障がない。
以下のようにGIT_EDITOR
のみを設定すれば、EDITOR
を使うコマンドには影響しない。
vim.env.GIT_EDITOR = require("waitevent").editor()
require("waitevent").editor()
は実行可能な文字列を返すだけで、利用側が好きな環境変数に設定する。
ただの環境変数の設定なのでGIT_EDITOR
を使うコマンドが実行されるまでほぼ何もしない。
子として起動するプロセスでプラグインのロードを必要としない
Neovimのnightlyに実装されている起動オプションの-ll {script}
を使っている。
上記のオプションを使ってnvim
コマンドを起動するとエディタとして起動されず、設定のロードもなくLuaファイルを実行する。
このため、{script}
部分を独立したLuaのスクリプトとして実装している。
今回このスクリプト内で子のnvim
プロセス起動時のオプションをハンドリングしている。
現状は多くのオプションが子プロセスにおいては有用でないとして、オプション付きの実行はネストした起動になるようにフォールバックする。
その点が用途によってはデメリットになりそう。
感想
-ll {script}
によってNeovimがまた便利なLua実行環境になったように感じる(?)
スクリプト内ではスレッド同様vim.(fn|api|cmd)
等を利用できないが、今回の用途だとvim.loop
の関数で間に合った。
Discussion