Neovimでも自動保存でコーディングしたいなぁって方、一定数いらっしゃるんじゃないでしょうか。
私、パソコン触り始めた頃は既に "自動保存が備わってるツール" が普及していたんですよね。
っていうのもあって。
コーディングは勿論、「自分で保存する」という操作にあまり慣れてないです。
てことで今回は Neovim の自動保存設定をご紹介します。
デモ動画
ちょっと分かりづらいかもですが、まずはご覧ください。
- 俺: INSERT モードで「autosave」を入力
- 俺: NORMAL モードに変更
- neovim: 自動保存
- neovim: 右下にトースト的なやつ出す
- 俺:
ddで行カット - neovim: 自動保存
- neovim: 右下にトースト的なやつ出す
こんな感じの操作をしてました。
どうでしょうか、良さそうじゃないですか?あまり刺さらないかな...?
良いな、と思った方は続きをお楽しみ下さい。
前提条件
-
Neovim 導入済み
※ 出来れば 0.12.x 系がいいですね -
設定ファイルを触ることが出来る状態
※ 出来れば dotfiles があればいいですね
設定方法
設定ファイルのどこでもいいんですけど、以下を記載下さい。
※ 筆者は、autocmds 系統をまとめてるファイルに記載しました
vim.api.nvim_create_augroup("MyAutoSave", { clear = true })
vim.api.nvim_create_autocmd({ "InsertLeave", "TextChanged", "FocusLost", "BufLeave" }, {
group = "MyAutoSave",
pattern = "*",
nested = true,
callback = function()
-- 編集可能かつファイル名がある場合のみ保存
if not (vim.bo.modifiable and vim.fn.expand("%") ~= "" and vim.bo.filetype ~= "") then
return
end
-- 変更があるときだけ保存 & 通知
if not vim.bo.modified then
return
end
local write_ok, write_err = pcall(vim.cmd, "update")
-- 保存失敗時は明示的に通知する
if not write_ok or vim.bo.modified then
vim.notify("Autosave failed: " .. tostring(write_err or "buffer is still modified"), vim.log.levels.WARN, {
title = "autosave",
})
return
end
end,
})
これだけです。
ポイント
基本はお馴染みの「アーリーリターン」ですね。
- "InsertLeave", "TextChanged", "FocusLost", "BufLeave" のイベントを指定
※ 基本は "InsertLeave", "TextChanged" のみでも問題ないと思います。 - 編集可能の場合、ファイル名がある場合 のみ、以降の処理へと進みます。
※ 未保存バッファは対象外とする、という意図ですね - ファイルの変更がある時だけ、次の処理へ進みます。
vim標準の組み込みAPIのみで出来ます -
pcall(vim.cmd, "update")で自動更新を実施。
※ pcall: 関数を安全に実行するlua組み込み関数
さほどパフォーマンス拘った設定ではないですが、わりと気にならない速度感でコーディング出来ますよ。
※ 速度面のレビュー頂ければとてもうれしいです。
+α!! 保存時にそれとない(じゃまにならない)通知が欲しい方へ
メッセージング欲しい方、中にはいらっしゃるんじゃないでしょうか。
私は「え、保存された?」と不安になるので、それとない通知を右下に出すようにしています。
今回は、fidget.nvim を活用して保存後に通知を出してみましょう。
先程のコードを以下に置き換えるだけです。
※ fidget.nvim のセットアップについては割愛します。私の dotfiles or 公式リポジトリをご参照下さい。
LazyVimを使ってる方は snacks の notify が優秀なのでそちらをご活用頂ければ。
おまけ
実は通知UIも拘りたいなと思いいくつかのプラグインを模索しました。
ただ、私の体感なんですが noice.nvim は少し重く感じて...。
軽量なやつを探して、fidget.nvim に辿り着いた感じです。
今のところ、 fidget.nvim でかなり満足していますが他のいいツールあればまた記事にしたいと思います。(mini系気になってます)
参考
