mirror of
https://github.com/jesseduffield/lazygit.git
synced 2026-10-06 14:06:32 -04:00
A view that re-renders content the user is already looking at, laid out differently — a different context size, another diff renderer — starts the new render from the top, losing where they were. Where that is can't be carried over as a scroll position, because a different layout of the same content puts the line they were on somewhere else; it can only be found by looking at what the re-render brings in. So let a restore be installed on the buffer manager just before the re-render is triggered. It rides the next command task, which asks it after each line whether enough has arrived to show what it remembers, and then hands it the first paint: the restore searches the off-screen buffer, swaps it in, and places the view, in that order, so that the search happens while the previous content is still displayed and the new content is never drawn at the previous render's scroll position. A restore that placed the view keeps the scroll reset new content would otherwise get; one that couldn't find what it was looking for leaves the render to do what it would have done anyway, and the lines-read count still has the last word on when to paint, so a restore can never hold a render back for ever. Some renderings can't be searched at all: a diff renderer is free to say nothing about which line of which file each row shows, and then no line of the old rendering can be looked for in the new one. There the offset into the content is all that is left to go on, and it is nearer to where the user was than the top is, so a re-render can also ask merely to be left where it is. That request rides the next task the same way, and answers the same question the scroll reset and the loading placeholder are asking: whether what is coming is content the user has not seen. Both outlive the task they were installed for, like the pending scroll reset does and for the same reason: that task can be stopped and replaced by a background refresh before it ever paints, leaving the replacement to honour it. The loading placeholder stays out of the way while either is pending — blanking the view for a message before putting the user back where they were is the flicker they exist to avoid. Nothing installs either of them yet. Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>