fix(conflict): draw complete block boundaries in merge gutters - #556
Merged
Conversation
yanuoma
enabled auto-merge
September 10, 2026 02:07
esmuellert
approved these changes
Sep 10, 2026
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.
Summary
Fixes #404 by drawing the complete extent of each conflict block, including alignment filler rows, instead of showing indistinguishable signs on individual changed lines.
Each buffer projection is expanded into ordered visual positions and receives a complete marker map before rendering: no positions produce no marker, a single position produces
[, and multiple positions produce╭─,│, and╰─. The same rule applies to filler-only projections.Changes
ui/conflict/gutter/: a pure calculator, a coordinator, and native signcolumn/statuscolumn backends.Regression coverage
Add a repository-owned embedded-Neovim screen-grid harness using bundled MessagePack and libuv, without external test dependencies. The new specs are automatically discovered by the regular test runner.
63 new regression cases:
Block fixtures enter through the production conflict renderer. Their expected screen rows neither call nor duplicate the marker calculator. Window-option tests compare unchanged columns against Neovim's native rendering.
Benefits and scope
Conflict boundaries remain visible through filler rows and independently of pane focus. File/window transitions no longer leak conflict markers or overwrite unrelated column settings.
Merge algorithms, filler placement/count rules, highlight definitions, and scroll-sync code are unchanged. A structural comparison against the main baseline matched all 628 blocks, filler metadata, and the contents of all three buffers exactly.
Custom statuscolumn providers are preserved, not composed with this renderer; the new filler rendering applies to columns owned by CodeDiff.
Testing
CODEDIFF_TEST_JOBS=8 ./tests/run_tests.sh— 109 spec files passed, including all 63 new cases.ctest --test-dir build --output-on-failure— 10/10 C tests passed.make build.git diff --check.Local validation used Neovim
0.13.0-dev-1310+gfaf8345eef. The installed Neovim 0.11.4 binary could not start because its old tree-sitter dynamic library is missing, so this does not claim a completed local 0.11.4 run.