icon

nazo6.dev

一覧に戻る
2023/5/1 5 min read

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

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

目次


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でもまあ同じ感じだと思います。

#追記(2025/06)

Neovim 0.12 (現時点のnightly)でrestartコマンドが実装されました!これはNeovimのUI部分はそのまま、コア部分のみを再起動できるコマンドです(NeovimではUI部分がclient,コア部分がserverと呼ばれており、このコマンドはserverを再起動します)。これを使えばNeovimを終了することなく再起動を行うことができます。GUIクライアントについてはそれぞれで対応が必要なようですがそのうちできるようになるでしょう

ただ、restartコマンドではセッションは復元されないので私はpossession.nvimを用いて以下のようにセッション復元を行うRestartコマンドを使っています。

vim.api.nvim_create_autocmd("VimEnter", {
  nested = true,
  callback = function()
    if vim.g.NVIM_RESTARTING then
      vim.g.NVIM_RESTARTING = false
      local session = require "possession.session"
      local ok = pcall(session.load, "restart")
      if ok then
        require("possession.session").delete("restart", { no_confirm = true })
        vim.opt.cmdheight = 1
      end
    end
  end,
})
 
vim.api.nvim_create_user_command("Restart", function()
  require("possession.session").save("restart", { no_confirm = true })
  vim.cmd [[silent! bufdo bwipeout]]
 
  vim.g.NVIM_RESTARTING = true
 
  vim.cmd [[restart!]]
end, {})
 

#感想

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

Share this article:
一覧に戻る

関連記事

2021/8/21

2024/3/14

#tech/software/neovim
blog

Neovim builtin LSP設定入門

<div class="message-warning"> Neovim 0.11においてLSP関連の大きな変更があり、この記事の内容は若干古くなっています(古いというだけでこの記事の内容自体は有効であり、コードも動くはずです)。 最新の設定を試したいという方は記事の更新をお待ちください </div>

Read Article

2021/3/28

2021/10/23

#tech/lang/js-ts#tech/software/neovim
blog

Typescriptでneovimの設定を書く!

vim を使い始めて 2 週間ほどたったある日、せっかく neovim を使っているんだし設定が少ない今のうちに init.vim を init.lua に書き換えようと思いこちらの文章を読んでいたところ、最後にこんなものがあるのに気づきました。

Read Article

2021/3/14

2021/3/15

#tech/software/neovim
memo

Vim初心者がNeovimを試す

VSCodeを使っているとコマンド操作できることでも覚えるのがめんどくさくてついマウスでポチポチしてしまうので自分を律したい

Read Article

2024/1/31

#tech/software/neovim
memo

Windows Terminal上のNeovimでundercurlを表示する(wslのみ)

最近ついにWindows Terminalでもundercurlの表示ができるようになった(これを書いた時点ではプレビュー版のみ)。

Read Article

2023/10/31

#tech/software/neovim
blog

lemonadeでssh先のneovimとクリップボードを共有

lemonadeを使えばTCP通信を用いてクリップボードを共有できます。

Read Article

2021/9/4

2023/4/28

#tech/software/neovim
blog

neovim luaのパフォーマンス計測方法

最初は下の方法2を使用していましたが、profile.nvimという素晴らしいプラグインが出ていたので今はこれを使用するのがおすすめです。

Read Article

2021/5/15

2022/5/7

#tech/software/neovim
blog

nvim-lspでtsconfig.jsonとかの補完をする方法(JSON schema)

SchemaStore.nvim というプラグインが出てきました。 基本的にこの記事で説明されていることをやってくれてさらに定期的に更新されるのでこのプラグインを使うのがおすすめです。

Read Article

2023/8/22

#tech/software/neovim
memo

telescope.nvim拡張の作り方

telescope.nvimの拡張(ソース)の作り方のいい文献があまり見つからなかったのでメモ。

Read Article

© 2025 nazo6. All rights reserved.