fix(buffer): prevent active item extmark accumulation - #2005
Open
ghillb wants to merge 2 commits into
Open
Conversation
ghillb
marked this pull request as ready for review
August 21, 2026 18:57
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Problem
Neovim continuously consumed approximately 100% of one logical CPU core after
a Neogit buffer remained visible while focus moved to another split.
Profiling led to the buffer's
ActiveItemnamespace, which had accumulated anextremely large number of persistent extmarks. The ActiveItem provider
intentionally continues running while its source buffer is unfocused, but
Buffer:clear_namespace()previously skipped unfocused buffers. The clear wastherefore ignored while redraws continued adding new extmarks.
The provider also processed callbacks for unrelated windows because it ignored
the callback's
bufnr, further increasing redraw work.The extmark accumulation was reproduced using Neogit's buffer and decoration
APIs without Snacks. Snacks made the growing cost more visible by inspecting
extmarks, but it was not required to reproduce the underlying leak.
Solution
Allow
clear_namespace()to clear its explicitly addressed buffer regardlessof focus, and restrict ActiveItem decoration updates to callbacks for their
owning buffer.
Regression tests cover repeated unfocused redraws, owner-buffer scoping, and
namespace clearing while another buffer is focused.
Testing
make lintmake testgit diff --check upstream/master..HEAD