Vimでファイルを自動保存する方法(autocmd / auto-save.nvim)
保存し忘れたまま端末を閉じてしまい、変更が消えて悲しい思いをしたことがある人は多いはずです。:wを打ち忘れる心配自体をなくしたいなら、自動保存の仕組みを組んでおくと安心です。プラグインなしのautocmdだけで実現できる方法と、より柔軟な設定ができるプラグインの両方を紹介します。
プラグインなしでautocmdを使う
最もシンプルなのは、ノーマルモードへ戻ったタイミングや、フォーカスが外れたタイミングで自動的に保存するautocmdを組む方法です。
autocmd InsertLeave,TextChanged <buffer> silent! write
InsertLeave(挿入モードを抜けたとき)とTextChanged(ノーマルモードでの変更)をトリガーに、変更があれば自動保存します。silent!を付けているのは、新規ファイル(まだパスがない)などで保存に失敗してもエラーメッセージで作業を止めないようにするためです。
特定のファイルタイプだけに適用したい場合は、autocmdの対象を絞り込みます。
augroup AutoSaveMarkdown
autocmd!
autocmd FileType markdown autocmd InsertLeave,TextChanged <buffer> silent! write
augroup END
議事録やメモなど、こまめな自動保存が嬉しいファイルタイプにだけ適用しておくと、コードを書くときの意図しない自動保存を避けられます。
Neovim向けプラグイン:auto-save.nvim
もう少し細かい制御(保存間隔の指定、条件付き無効化、通知表示など)が欲しい場合は、Neovim向けのプラグインを使う選択肢もあります。
-- lazy.nvimでの例
{
'Pocco81/auto-save.nvim',
opts = {
enabled = true,
debounce_delay = 1000,
},
},
debounce_delayで、変更が止まってから何ミリ秒後に保存するかを制御できます。連続した入力のたびに保存が走ってエディタがカクつくのを防げます。
| 方法 | 向いている場面 |
|---|---|
| autocmdのみ | 設定を軽くしたい、細かい制御は不要 |
| auto-save.nvim | 保存間隔の調整・通知表示など細かい制御が欲しい |
自動保存が向かない場面
Gitで細かくコミットを分けたい作業や、一時的に壊れた状態のコードを試している最中は、自動保存がむしろ邪魔になることもあります。そうした場面では:AutoSaveToggleのようなトグルコマンドを用意しておき、必要なときだけ無効化できるようにしておくと扱いやすくなります。
let g:auto_save_enabled = 1
command! AutoSaveToggle let g:auto_save_enabled = !g:auto_save_enabled
議事録用のMarkdownファイルにだけautocmdの自動保存を仕込んでいます。会議中にメモを取りながら:wを打つ余裕がない場面で、保存忘れを気にせず入力に集中できるようになりました。コードを書くファイルタイプには適用せず、Gitの差分が意図せず増えないようにしています。
まとめ
自動保存はプラグインなしでもautocmdだけで組めます。細かい制御が必要ならauto-save.nvimのようなプラグインを使います。いずれの場合も、全ファイルに適用するよりファイルタイプを絞ったほうが、Gitのノイズを抑えつつ実用的に使えます。自動保存を入れるとundoの履歴と保存のタイミングがずれて見えることがあります。取り消しの範囲がどこまで戻るかはundoとredoの記事を、書き換えを避けたいファイルは読み取り専用で開くほうが確実です。