← Vim研究所

Neovimが外部の変更を自動で読み直す(0.13のautoread)

2026-08-18 公開 ・ 更新: 2026-08-18

別のターミナルでgit switchしたあと、Vimに戻ってきたら画面が古いまま、という経験は誰にでもあります。autoreadを有効にしていても、Vimが「ファイルが変わったか」を見に行くのは特定のタイミングだけだからです。Neovim 0.13では、ここがOSのファイル監視に置き換わりました。設定を足さなくても、外で書き換えたファイルがそのまま画面に載ります。

検証環境:nightlyビルドのNVIM v0.13.0-dev-1336+g8c0bf18374と安定版のNVIM v0.12.4(macOS)で、同じファイルを開いたまま外部から書き換える手順を流しました。掲載しているバッファの中身は実行結果です。0.13は開発中なので、リリースまでに細部が変わる可能性があります。

目次(5項目)

何もしないうちに中身が入れ替わる

試したのは単純な手順です。ORIGINALと書かれたファイルを開き、Neovimの中から外部の書き換えに相当する処理を走らせ、2.5秒待ってからバッファを覗きます。autoreadはどちらのバージョンでも既定で有効でした。

Neovim 0.12.4
  開いた直後       ORIGINAL
  2.5秒後          ORIGINAL          -- 変わらない
  :checktime のあと CHANGED-OUTSIDE

Neovim 0.13
  開いた直後       ORIGINAL
  2.5秒後          CHANGED-OUTSIDE   -- 勝手に読み直された

0.12.4のほうは、こちらから:checktimeを打つまで古い中身のままでした。これは不具合ではなく仕様で、VimはFocusGainedやコマンド実行の前後といった決まった場面でしかファイルの更新時刻を見ません。ターミナルの種類によってはFocusGained自体が飛んでこないので、autoreadを有効にしているのに何も起きない、という状態になりがちでした。

0.13はOSのファイル監視を使うようになったので、待っているだけで反映されます。リリースノートの表現は「FocusGained:checktimeのときだけでなく、実時間で外部の変更を検知する」です。

これまで書いていた設定が要らなくなる

この問題への定番の対処は、いろいろなイベントに:checktimeを紐づけて回数を稼ぐやり方でした。dotfilesでよく見かける形はこうです。

" 0.12までの定番。0.13では不要になる
set autoread
autocmd FocusGained,BufEnter,CursorHold,CursorHoldI * silent! checktime

CursorHoldまで動員しているのは、フォーカスのイベントが当てにならない環境があるからです。0.13ではこの行を消して構いません。updatetimeを短くしてCursorHoldを無理やり頻発させていた設定も、目的が監視だったのなら戻せます。

関連してファイルの再読み込みで使う:e!との役割分担も整理しておくと、:e!は「編集中の変更を捨てて読み直す」ための明示的な操作なので、こちらは引き続き必要です。自動で読み直されるのは、バッファ側に未保存の変更がない場合だけです。

効いてくる場面

いちばん分かりやすいのはブランチの切り替えです。別のターミナルでgit switchすると、開いている全ファイルが一斉に別の内容へ変わります。0.12までは戻ってきたときに古い画面を見て、:checktime:e!を打つ手間がありました。

次に、外部のフォーマッタです。prettier --writegofmt -wをファイル監視で回している構成では、保存した直後にファイルが書き換わります。編集中のバッファに未保存の変更が無ければ、整形結果がそのまま載ります。

3つ目がログファイルの追尾で、:terminalを開かずにログを眺めたいときに使えます。ただしこの用途は末尾へ自動で動くわけではないので、ジャンプ操作Gを押す手間は残ります。

監視の状態を見る、止める

監視が実際に動いているかは:checkhealthで確認できます。0.13ではPerformanceのセクションにファイル監視の情報が出るようになりました。手元で実行すると次の行が出ます。

:checkhealth vim.health

Performance ~
- Filewatchers (vim._watch): 0 (watch=0, watchdirs=0, inotify=0)

いくつのファイルとディレクトリを見張っているかがそのまま数字で出るので、重いと感じたときに当たりを付けられます。

止めたい場合は従来どおりautoreadを切ります。巨大なディレクトリを開いたときの監視の負荷が気になるなら、バッファ単位で切るのが穏当です。

" このバッファだけ自動読み直しを止める
setlocal noautoread

逆に、変更を勝手に取り込まれると困るファイル、たとえば生成物を手で直している最中のファイルでは、切っておいたほうが安全な場面もあります。

使ってみて

検証で2.5秒待つだけで中身が入れ替わったのを見たとき、正直に言うと少し驚きました。autocmd FocusGained,BufEnter,CursorHoldの行は何年も前に他人のdotfilesから写したもので、なぜ4つもイベントを並べる必要があるのかを考えたことがありませんでした。0.13で消せると分かって初めて、あれが「イベントが飛んでこない環境があるから数で殴る」という回避策だったのだと理解しています。一方で、意図せず読み直されると困る場面もあるはずで、そこはsetlocal noautoreadを覚えておくことになりそうです。

まとめ

Neovim 0.13のautoreadはOSのファイル監視を使うようになり、外部で書き換えられたファイルを待っているだけで読み直します。実測では、0.12.4が:checktimeを打つまで古い中身のままだったのに対し、0.13は2.5秒待つだけで新しい中身に入れ替わりました。FocusGainedCursorHoldchecktimeを紐づけていた定番の設定は不要になり、止めたいときはsetlocal noautoreadを使います。未保存の変更があるバッファは自動では読み直されないので、その場合はこれまでどおり:e!で明示的に捨てることになります。標準ファイラの入れ替えと並んで、0.13は設定ファイルを短くする方向の変更が多めです。

← Vim研究所 トップへ戻る