refactor(highlight): unified per-line extmark builder #144

Merged
barrettruth merged 22 commits from refactor/highlight-hunk-extmark-builder into main 2026-03-05 14:01:22 +00:00
barrettruth commented 2026-03-04 18:17:10 +00:00

Problem

highlight_hunk applied DiffsClear extmarks across 5 scattered sites with
ad-hoc column arithmetic. This fragmentation produced the 1-column DiffsClear
gap on email-quoted body context lines (#142 issue 1). A redundant
highlight_hunk_vim_syntax function duplicated the inline vim syntax path,
and the deferred pass in init.lua double-called it, creating duplicate scratch
buffers and extmarks.

Solution

Reorganize highlight_hunk into two clean phases:

  • Phase 1 — multi-line syntax computation (treesitter, vim syntax, diff
    grammar, header context text). Sets syntax extmarks only, no DiffsClear.
  • Phase 2 — per-line chrome (DiffsClear, backgrounds, gutter, overlays,
    intra-line). All non-syntax extmarks consolidated in one pass.

Hoist new_code to function scope (needed by highlight_text outside the
use_ts block). Hoist at_raw_line so Phase 1d and Phase 2b share one
nvim_buf_get_lines call.

Delete highlight_hunk_vim_syntax (redundant with inline path). Remove the
double-call from the deferred pass in init.lua.

Extend body prefix DiffsClear end_col from qw to pw + qw, fixing the
1-column gap where native treesitter background bled through on context lines
in email-quoted diffs (#142 issue 1).

Email-quoted diff support

The parser now strips > (and >> , etc.) email quote prefixes before
pattern matching, enabling syntax highlighting for diffs embedded in email
replies and git-send-email / sourcehut-style patch review threads.
Each hunk stores quote_width so the highlight pipeline can apply
DiffsClear at the correct column offsets to suppress native treesitter
on quoted regions.

Closes #141

#142 status after this PR

Sub-issue Status
1. Col gap on context lines Fixed
2. Bare > context lines Improved, edge case remains
3. Diff prefix marker fg Not addressed (follow-up)
## Problem `highlight_hunk` applied DiffsClear extmarks across 5 scattered sites with ad-hoc column arithmetic. This fragmentation produced the 1-column DiffsClear gap on email-quoted body context lines (#142 issue 1). A redundant `highlight_hunk_vim_syntax` function duplicated the inline vim syntax path, and the deferred pass in init.lua double-called it, creating duplicate scratch buffers and extmarks. ## Solution Reorganize `highlight_hunk` into two clean phases: - **Phase 1** — multi-line syntax computation (treesitter, vim syntax, diff grammar, header context text). Sets syntax extmarks only, no DiffsClear. - **Phase 2** — per-line chrome (DiffsClear, backgrounds, gutter, overlays, intra-line). All non-syntax extmarks consolidated in one pass. Hoist `new_code` to function scope (needed by `highlight_text` outside the `use_ts` block). Hoist `at_raw_line` so Phase 1d and Phase 2b share one `nvim_buf_get_lines` call. Delete `highlight_hunk_vim_syntax` (redundant with inline path). Remove the double-call from the deferred pass in init.lua. Extend body prefix DiffsClear `end_col` from `qw` to `pw + qw`, fixing the 1-column gap where native treesitter background bled through on context lines in email-quoted diffs (#142 issue 1). ### Email-quoted diff support The parser now strips `> ` (and `>> `, etc.) email quote prefixes before pattern matching, enabling syntax highlighting for diffs embedded in email replies and `git-send-email` / sourcehut-style patch review threads. Each hunk stores `quote_width` so the highlight pipeline can apply `DiffsClear` at the correct column offsets to suppress native treesitter on quoted regions. Closes #141 ### #142 status after this PR | Sub-issue | Status | |-----------|--------| | 1. Col gap on context lines | Fixed | | 2. Bare `>` context lines | Improved, edge case remains | | 3. Diff prefix marker fg | Not addressed (follow-up) |
Sign in to join this conversation.
No description provided.