← Vim研究所

Vimでファイルを自動保存する方法(autocmd / auto-save.nvim)

2019-05-28 公開 ・ 更新: 2026-08-20

保存し忘れたまま端末を閉じてしまい、変更が消えて悲しい思いをしたことがある人は多いはずです。:wを打ち忘れる心配自体をなくしたいなら、自動保存の仕組みを組んでおくと安心です。プラグインなしのautocmdだけで実現できる方法と、より柔軟な設定ができるプラグインの両方を紹介します。

目次(8項目)

プラグインなしで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

議事録やメモなど、こまめな自動保存が嬉しいファイルタイプにだけ適用しておくと、コードを書くときの意図しない自動保存を避けられます。

要点:全ファイルに自動保存をかけるとバージョン管理(Git)のノイズが増えやすくなります。メモ用途など、こまめな保存が嬉しいファイルタイプに絞って適用するのが実用的です。

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の差分が意図せず増えないようにしています。

保存時に走る処理と衝突する

自動保存を入れる前に確かめたいのが、保存時に何が走っているかです。整形ツールを BufWritePre で呼んでいる場合、挿入モードを抜けるたびに整形が走ることになります。書いている途中の壊れたコードを整形しようとしてエラーが出続ける、という状態になりがちです。

LSPの整形やリンタの実行を保存のたびに走らせている場合も同じです。自動保存の条件を厳しくするか、整形だけは手動の :w のときに限る、という切り分けが要ります。

autocmd InsertLeave *.md silent! write   " 対象を絞る

拡張子で絞るのが最も簡単です。文章を書くファイルだけ自動保存にして、コードは手動のままにしておけば、この衝突は起きません。

自動保存より先に検討できるもの

失いたくないのが「保存し忘れ」なのか「クラッシュ」なのかで、打つ手が変わります。前者なら autowriteall が効きます。別のファイルへ移るときやVimを終了するときに自動で書き込む設定で、編集中は書き込まれません。

set autowriteall

後者ならスワップファイルで足ります。Vimは既定でスワップファイルに変更を書き出していて、異常終了したあとに同じファイルを開くと復元を促されます。updatetimeupdatecount がその頻度を決めているので、こまめにしたければこちらを縮めるほうが副作用がありません。

取り消しの履歴も残しておく

自動保存と組み合わせると効くのが、取り消し履歴の永続化です。既定ではVimを閉じると u で戻れる範囲が失われますが、次の2行を書いておくとファイルとして残ります。

set undofile
set undodir=~/.vim/undo//

自動保存は「保存されていない状態」を無くす代わりに、間違った変更もそのまま保存してしまいます。取り消し履歴が残っていれば、次に開いたときでも u で戻れるので、この2つは組で入れておくと安心して使えます。ディレクトリは自分で作っておく必要があります。

まとめ

自動保存はプラグインなしでもautocmdだけで組めます。細かい制御が必要ならauto-save.nvimのようなプラグインを使います。いずれの場合も、全ファイルに適用するよりファイルタイプを絞ったほうが、Gitのノイズを抑えつつ実用的に使えます。自動保存を入れるとundoの履歴と保存のタイミングがずれて見えることがあります。取り消しの範囲がどこまで戻るかはundoとredoの記事を、書き換えを避けたいファイルは読み取り専用で開くほうが確実です。

関連記事

← Vim研究所 トップへ戻る