nazo6 noteblog

Neovimを再起動するコマンドを作ったら結構よかった

作成:2023/05/01

更新:2023/05/01

この記事は、Zennにも投稿しています。

Luaのリロード

Neovim盆栽をしていると設定をリロードしたい時が結構というかかなりあります。Vimscriptであればsource ~/.vimrcとすればまあ大体うまくいっていた気がするのですがLuaではそうもいきません。
Luaのrequireのキャッシュを消してやればもう一度読み込めるとかは言われていますが世の中のLuaプラグインはsetupを2回以上呼んだりするとおかしくなったりする物が大抵なのでこの方法でもあんまりうまくいきません。

再起動が一番

そんなわけでそういう時はneovimを再起動してやるのが一番なんですが前の状態が復元されないといろいろ面倒くさいです。
そこで再起動前のセッションを保存して次回の起動時に自動でそのセッションを読み込んでくれる簡単なコマンドを書きました。
local restart_cmd = nil

if vim.g.neovide then
if vim.fn.has "wsl" == 1 then
restart_cmd = "silent! !nohup neovide.exe --wsl &"
else
restart_cmd = "silent! !neovide.exe"
end
elseif vim.g.fvim_loaded then
if vim.fn.has "wsl" == 1 then
restart_cmd = "silent! !nohup fvim.exe &"
else
restart_cmd = [=[silent! !powershell -Command "Start-Process -FilePath fvim.exe"]=]
end
end

vim.api.nvim_create_user_command("Restart", function()
if vim.fn.has "gui_running" then
if restart_cmd == nil then
vim.notify("Restart command not found", vim.log.levels.WARN)
end
end

require("possession.session").save("restart", { no_confirm = true })
vim.cmd [[silent! bufdo bwipeout]]

vim.g.NVIM_RESTARTING = true

if restart_cmd then
vim.cmd(restart_cmd)
end

vim.cmd [[qa!]]
end, {})

vim.api.nvim_create_autocmd("VimEnter", {
nested = true,
callback = function()
if vim.g.NVIM_RESTARTING then
vim.g.NVIM_RESTARTING = false
require("possession.session").load "restart"
require("possession.session").delete("restart", { no_confirm = true })
vim.opt.cmdheight = 1
end
end,
})
これでRestartコマンドが定義できましたが、CUIでは実際には再起動しているのではなくセッションを保存して終了するだけです。次のnvimの起動時にセッションを読み込みます。GUIで起動された時には本物の再起動になります。
セッションの保存にはpossession.nvimを使っています。他のプラグインであったり通常の:mksessionでもまあ同じ感じだと思います。

感想

自動でセッションのロード/保存をしている人にとってはあまり気にする問題ではないのかもしれませんが自分は普段セッションをあまり使わないのでこのコマンドでNeovim盆栽イテレーションを速く回せるようになった気がします。
設定をいじってる時以外でもなんか調子悪いから再起動したいけどこのワークスペースを維持したいという時にも結構便利でよかったです。