pending.nvim/lua/pending
Barrett Ruth ab06cfcf69
feat(buffer): persist extmarks during editing (#96)
* refactor(buffer): split extmark namespace into `ns_eol` and `ns_inline`

Problem: all extmarks shared a single `pending` namespace, making it
impossible to selectively clear position-sensitive extmarks (overlays,
highlights) while preserving stable EOL virtual text (due dates,
recurrence).

Solution: introduce `ns_eol` for end-of-line virtual text and
`ns_inline` for overlays and highlights. `clear_marks()` and
`apply_extmarks()` operate on both namespaces independently.

* feat(buffer): track line changes via `on_bytes` to keep `_meta` aligned

Problem: `_meta` is a positional array keyed by line number. Line
insertions and deletions during editing desync it from actual buffer
content, breaking `get_fold()`, cursor-based task lookups, and extmark
re-application.

Solution: attach an `on_bytes` callback that adjusts `_meta` on line
insertions/deletions and tracks dirty rows. Remove the manual
`_meta` insert from `open_line()` since `on_bytes` now handles it.
Reset dirty rows on each full render.

* feat(buffer): clear only inline extmarks on dirty rows during edits

Problem: `TextChanged` cleared all extmarks (both namespaces) on every
edit, causing EOL virtual text (due dates, recurrence) to vanish while
the user types.

Solution: replace blanket `clear_marks()` with per-row
`clear_inline_row()` that only removes `ns_inline` extmarks on rows
flagged dirty by `on_bytes`. EOL virtual text is preserved untouched.

* feat(buffer): re-apply inline extmarks after edits

Problem: inline extmarks (checkbox overlays, strikethrough, header
highlights) were cleared during edits and only restored on `:w`,
leaving the buffer visually bare while editing.

Solution: extract `apply_inline_row()` from `apply_extmarks()` and
call it via `reapply_dirty_inline()` on `InsertLeave` and normal-mode
`TextChanged`. Insert-mode `TextChangedI` still only clears inline
marks on dirty rows to avoid overlay flicker while typing.

* fix(buffer): suppress `on_bytes` during render and fix definition order

Problem: `on_bytes` fired during `render()`'s `nvim_buf_set_lines`,
corrupting `_meta` with duplicate entries and causing out-of-range
extmark errors. Also, `apply_inline_row` was defined after its first
caller `reapply_dirty_inline`.

Solution: add `_rendering` guard flag around `nvim_buf_set_lines` in
`render()` so `on_bytes` is a no-op during authoritative renders.
Move `apply_inline_row` above `reapply_dirty_inline` to satisfy Lua
local scoping rules.
2026-03-08 14:19:47 -04:00
..
sync refactor: normalize log message grammar and capitalization (#89) 2026-03-06 18:38:17 -05:00
buffer.lua feat(buffer): persist extmarks during editing (#96) 2026-03-08 14:19:47 -04:00
complete.lua refactor: remove file token feature (#50) 2026-02-26 22:41:38 -05:00
config.lua feat(buffer): add configurable category-level folds (#91) 2026-03-06 20:08:49 -05:00
diff.lua fix: empty buffer placeholder and checkbox pattern fixes (#82) 2026-03-06 12:07:52 -05:00
health.lua fix(diff): preserve due/rec when absent from buffer line (#68) 2026-03-05 12:46:54 -05:00
init.lua feat(buffer): persist extmarks during editing (#96) 2026-03-08 14:19:47 -04:00
log.lua fix(diff): preserve due/rec when absent from buffer line (#68) 2026-03-05 12:46:54 -05:00
parse.lua fix(diff): preserve due/rec when absent from buffer line (#68) 2026-03-05 12:46:54 -05:00
recur.lua feat: time-aware due dates, persistent undo, @return audit (#33) 2026-02-25 20:37:50 -05:00
store.lua feat(buffer): persist fold state across sessions (#94) 2026-03-07 20:18:34 -05:00
textobj.lua fix(diff): preserve due/rec when absent from buffer line (#68) 2026-03-05 12:46:54 -05:00
views.lua feat: warn on dirty buffer before store-dependent actions (#83) 2026-03-06 12:08:10 -05:00