文件: tui/app.rs:331-457 分类: 滚动 / 状态机
tui/app.rs:331-457
问题: Ready 状态没有 VHI 时(resize/JSON toggle 后)使用 Loading 的滚动逻辑,混合逻辑偏移和视觉偏移,光标/视口不一致。
建议修复: 区分 ReadyWithoutIndex 和 Loading,Ready 期间使用保守的逻辑行滚动。
ReadyWithoutIndex
Loading
@-
根因: Ready 状态下 VHI 被异步 invalidate 后(Tab toggle / resize / file append / Loading→Ready),v_offset 仍保留视觉行偏移值,但所有函数开始将其当作逻辑行偏移处理,导致视口跳跃和光标漂移。VHI 异步重建完成后也未将 v_offset 从逻辑行重新校准回视觉行。
v_offset
修复 (a43ef67):
a43ef67
rebase_offset_for_invalidate()
poll_background_indexer
回归测试: 6 个新测试覆盖 rebase 转换、Tab toggle 不变量、VHI 重建校准、子行 clamp、Loading→Ready 转换。全部 352 测试通过。
No dependencies set.
The note is not visible to the blocked user.
文件:
tui/app.rs:331-457分类: 滚动 / 状态机
问题: Ready 状态没有 VHI 时(resize/JSON toggle 后)使用 Loading 的滚动逻辑,混合逻辑偏移和视觉偏移,光标/视口不一致。
建议修复: 区分
ReadyWithoutIndex和Loading,Ready 期间使用保守的逻辑行滚动。@-
修复方案
根因: Ready 状态下 VHI 被异步 invalidate 后(Tab toggle / resize / file append / Loading→Ready),
v_offset仍保留视觉行偏移值,但所有函数开始将其当作逻辑行偏移处理,导致视口跳跃和光标漂移。VHI 异步重建完成后也未将v_offset从逻辑行重新校准回视觉行。修复 (
a43ef67):rebase_offset_for_invalidate(): 在 VHI 失效前将v_offset从视觉行转换为逻辑行 + 子行偏移,保留精确的视口内行位置poll_background_indexer中 VHI 就绪后,将v_offset从逻辑行映射回视觉行,并 clamp 子行偏移到新行高回归测试: 6 个新测试覆盖 rebase 转换、Tab toggle 不变量、VHI 重建校准、子行 clamp、Loading→Ready 转换。全部 352 测试通过。