本記事はVim Advent Calendar2025-12-02の記事です。
Neovimの設定をしている時とか、さくっと再起動したくなることありますよね。
もうかれこれ半年近くたちますが、そんなニーズに応えるべく開発版のNeovimに:restartコマンドが導入されました。おそらく0.12で正式リリースされると思います。
:qしてからnvimしなおす場合と、:restartする場合を比べてみてください。再起動の圧倒的な速さがわかります。
高速再起動の仕組みについてはNeovimのコア開発者のjustinが解説してくれています。 Neovimがコア機能部分だけを再起動し、UI部分はそのまま維持することで高速化を実現しているとのこと。
そんな:restartですが、オプションでもっと便利に使えます (:h :restart)。
restart [+cmd]で再起動前の処理を指定- たとえば
restart +xallで再起動前に変更済みのバッファを保存して閉じておく(デフォルトは:qall)
- たとえば
restart [command]で再起動後の処理を指定- たとえば
restart +e hoge.luaで再起動後に指定のファイルを開く
- たとえば
これらを応用すると、セッションを維持しながら再起動、みたいなのも簡単にできちゃいます!
:mksession! session.vim | :restart +xa source session.vim私は似たような処理をZRにマッピングしています。
ZQが保存せずに終了、ZZが保存してファイルを閉じる、といった具合にZ-prefixには終了関係のマッピングがあるので、ZRはrestartのinitialも使えてほどよいかなと。
先のコマンドをそのまま採用するならこんな感じですね。ただし、session.vimがカレントディレクトリに発生するので、そのあたりの処理は工夫してください。
vim.keymap.set("n", "ZR", function()
vim.cmd("mksession! session.vim")
vim.cmd("restart +xa source session.vim")
end)私は一時ファイルの管理などの手間を考えて、nvim-mini/mini.nvimのmini.sessionsというセッション管理プラグインも使うことにしてます。
あとは再起動をややこしくしやすいターミナルバッファを強制終了させる処理なんかも加えて以下の通り。
vim.keymap.set("n", "ZR", function()
-- force restart if count given
if vim.v.count > 0 then
vim.cmd("restart")
return
end
-- cleanup session-unfriendly buffers (e.g., terminal)
local bufname = vim.api.nvim_list_bufs()
for _, buf in ipairs(bufname) do
if vim.bo[buf].buftype == "terminal" then
vim.api.nvim_buf_delete(buf, { force = true })
end
end
-- save session and restart
require("mini.sessions").setup()
require("mini.sessions").write("ZR")
vim.cmd(
[[restart +xa lua (function() require("mini.sessions").setup(); require("mini.sessions").read("ZR") end)()]]
)
end)私は再起動にしかセッション管理を使わないので、setup処理も含めてマッピング内で行っています。他にも通常のNeovim起動時などの使いどころがあるようなので、mini.sessionsってなんだよと言う人はkawarimidollさんの記事も参考にしてみてください。
mini.sessions by kawarimidollさん https://zenn.dev/kawarimidoll/books/6064bf6f193b51/viewer/86e45d
ENJOY!!
:restartは前から使ってましたが、マッピング化したのは今日なので、これから改善を進めようと思います。
Atusy's blog