Neovimを再起動するコマンドを作ったら結構よかった
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盆栽イテレーションを速く回せるようになった気がします。
設定をいじってる時以外でもなんか調子悪いから再起動したいけどこのワークスペースを維持したいという時にも結構便利でよかったです。
この記事は https://note.nazo6.dev/blog/neovim-restart-command とのクロスポストです。
Discussion