1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Neovimでも自動保存でコーディングしたいなぁって方、一定数いらっしゃるんじゃないでしょうか。

私、パソコン触り始めた頃は既に "自動保存が備わってるツール" が普及していたんですよね。

っていうのもあって。

コーディングは勿論、「自分で保存する」という操作にあまり慣れてないです。

てことで今回は Neovim の自動保存設定をご紹介します。

デモ動画

ちょっと分かりづらいかもですが、まずはご覧ください。

demo.gif

  1. 俺: INSERT モードで「autosave」を入力
  2. 俺: NORMAL モードに変更
  3. neovim: 自動保存
  4. neovim: 右下にトースト的なやつ出す
  5. 俺: dd で行カット
  6. neovim: 自動保存
  7. 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,
})

これだけです。

ポイント

基本はお馴染みの「アーリーリターン」ですね。

  1. "InsertLeave", "TextChanged", "FocusLost", "BufLeave" のイベントを指定
    ※ 基本は "InsertLeave", "TextChanged" のみでも問題ないと思います。
  2. 編集可能の場合、ファイル名がある場合 のみ、以降の処理へと進みます。
    ※ 未保存バッファは対象外とする、という意図ですね
  3. ファイルの変更がある時だけ、次の処理へ進みます。
    vim標準の組み込みAPIのみで出来ます
  4. pcall(vim.cmd, "update") で自動更新を実施。

※ pcall: 関数を安全に実行するlua組み込み関数

さほどパフォーマンス拘った設定ではないですが、わりと気にならない速度感でコーディング出来ますよ。
※ 速度面のレビュー頂ければとてもうれしいです。

+α!! 保存時にそれとない(じゃまにならない)通知が欲しい方へ

メッセージング欲しい方、中にはいらっしゃるんじゃないでしょうか。

私は「え、保存された?」と不安になるので、それとない通知を右下に出すようにしています。

今回は、fidget.nvim を活用して保存後に通知を出してみましょう。

先程のコードを以下に置き換えるだけです。
※ fidget.nvim のセットアップについては割愛します。私の dotfiles or 公式リポジトリをご参照下さい。

LazyVimを使ってる方は snacks の notify が優秀なのでそちらをご活用頂ければ。

おまけ

実は通知UIも拘りたいなと思いいくつかのプラグインを模索しました。
ただ、私の体感なんですが noice.nvim は少し重く感じて...。

軽量なやつを探して、fidget.nvim に辿り着いた感じです。

今のところ、 fidget.nvim でかなり満足していますが他のいいツールあればまた記事にしたいと思います。(mini系気になってます)

参考

1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?