Neovimを高速再起動させる:restartを試す(たぶん>=0.12)

by
カテゴリ:
タグ:

本記事はVim Advent Calendar2025-12-02の記事です。

Neovimの設定をしている時とか、さくっと再起動したくなることありますよね。

もうかれこれ半年近くたちますが、そんなニーズに応えるべく開発版のNeovimに:restartコマンドが導入されました。おそらく0.12で正式リリースされると思います。

:qしてからnvimしなおす場合と、:restartする場合を比べてみてください。再起動の圧倒的な速さがわかります。

高速再起動の仕組みについてはNeovimのコア開発者のjustinが解説してくれています。 Neovimがコア機能部分だけを再起動し、UI部分はそのまま維持することで高速化を実現しているとのこと。

https://x.com/justinmk/status/1929275690949415279

そんな:restartですが、オプションでもっと便利に使えます (:h :restart)。

これらを応用すると、セッションを維持しながら再起動、みたいなのも簡単にできちゃいます!

: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.nvimmini.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は前から使ってましたが、マッピング化したのは今日なので、これから改善を進めようと思います。