## 事象 1. ターミナルA([[Ghostty]]) と ターミナルZ([[Ghostty]]+[[herdr]])を開く 2. 両方のターミナルで[[Neovim]]の特定ファイルを起動 3. ターミナルAでファイルを編集する 4. ターミナルZをアクティブにする ファイルが最新化されてほしいが最新化されない。 - [[herdr]]内でペインを切り替えると更新される - 素の[[Ghostty]]([[herdr]]なし)であれば、設定なしでもフォーカス復帰時に更新される [[📝Zellijの中で起動したNeovimは他でファイル変更されてもフォーカス戻したあとに自動でバッファが更新されない|Zellijで発生した同事象]]の[[herdr]]版。 ### 環境 | 対象 | バージョン | | ----------- | ---------- | | [[macOS]] | 26.5.2 | | [[Ghostty]] | 1.3.1 | | [[herdr]] | 0.7.3 | | [[Neovim]] | 0.12.3 | ## 原因 [[herdr]]が外側ターミナルのフォーカス復帰をペインへ転送しないため、[[Neovim]]に[[FocusGained (Vim)|FocusGained]]の[[イベント (Neovim)|イベント]]が届かず、[[Neovim]]本体のタイムスタンプチェックが実行されないから。 前提として、[[Neovim]]はユーザー設定がなくても本体がフォーカス復帰時に `check_timestamps()` を実行し、`autoread`(デフォルトON)によりバッファを自動リロードする(release-0.12の `src/nvim/autocmd.c` にある `do_autocmd_focusgained()`)。 ```c apply_autocmds((gained ? EVENT_FOCUSGAINED : EVENT_FOCUSLOST), ...); // When activated: Check if any file was modified outside of Vim. if (gained && last_time + (Timestamp)2000 < os_now()) { check_timestamps(true); last_time = os_now(); } ``` つまり[[ファイルが変更されたら自動で再読み込み (Neovim)|checktimeのautocmd設定]]は通常のターミナルでは不要。しかし、この処理が発火するにはターミナルからfocus-inシーケンス(`ESC[I`)が届く必要がある。 [[herdr]]のソース(v0.7.3時点)を確認すると: - ペインへのフォーカスイベント転送機構(mode 1004、`ESC[I`/`ESC[O`)自体は実装されている。`src/app/api.rs` の `sync_focus_events()` が、**herdr内でフォーカスペインが切り替わったとき**に送信する(ペイン切替で更新されるのはこのため) - 一方、**外側ターミナルのフォーカス復帰**(`OuterFocusGained`)は `src/app/mod.rs` で `OuterFocusGained | OuterFocusLost => {}` と明示的に無視されており、フォーカス中ペインのPTYへは転送されない(再描画や通知の制御にのみ使用) [[Zellij]]の「フォーカスイベント処理の不整合(不具合)」とは異なり、herdrは**外側→ペインへのフォーカス転送が未実装**という整理になる。tmuxの `focus-events on` に相当する機能がない状態。 ## 解決方法 今のところなし。herdrのissueも未報告(2026-07-11時点で「focus」「FocusGained」「checktime」「1004」等で検索してヒットなし)。転送機構は内部に既にあるため、issueを出せば対応される可能性は高そう。 なお、[[Neovim]] 0.13(現nightly)では `autoread` がファイルシステムウォッチャーベースになり、[[FocusGained (Vim)|FocusGained]]に依存せず外部変更をリアルタイム検知するため、herdrの対応を待たずとも根本解決する見込み。 [feat(autoread): use file watchers for real-time change detection by OleksandrChekhovskyi · Pull Request #37971 · neovim/neovim](https://github.com/neovim/neovim/pull/37971) で対応はマージ済。 ## 回避策 手動で[[checktime (Vim)|checktime]]を実行するようにする([[📝Zellijの中で起動したNeovimは他でファイル変更されてもフォーカス戻したあとに自動でバッファが更新されない|Zellijのとき]]に設定済み)。 ```lua -- 再描画に加えて外部更新チェック vim.keymap.set("n", "<C-l>", function() vim.cmd("checktime") vim.cmd("normal! <C-l>") end, { silent = true }) ``` ## 参考 - [do_autocmd_focusgained() - neovim/neovim (release-0.12) src/nvim/autocmd.c](https://github.com/neovim/neovim/blob/release-0.12/src/nvim/autocmd.c) - [feat(autoread): use file watchers for real-time change detection · PR #37971 · neovim/neovim](https://github.com/neovim/neovim/pull/37971) - [ogulcancelik/herdr - GitHub](https://github.com/ogulcancelik/herdr)