Complete the 0.3.0 changelog: features, review fixes, boundary moves
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
parent
363045ac7c
commit
aa214456df
122
CHANGELOG.md
122
CHANGELOG.md
@ -4,6 +4,128 @@ All notable changes to the tp library are documented here.
|
|||||||
|
|
||||||
## 0.3.0 (2026-07-27)
|
## 0.3.0 (2026-07-27)
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
Layer stack:
|
||||||
|
|
||||||
|
- **Layer visibility**: `tp-hide-layer` / `tp-show-layer` — a hidden
|
||||||
|
layer stays in the stack (and keeps receiving reactive updates) but
|
||||||
|
does not render; hiding the visible top reveals the next visible
|
||||||
|
layer, and with every layer hidden the text renders bare.
|
||||||
|
`tp-flatten-layers` merges only visible layers; `tp-merge-layers`
|
||||||
|
excludes hidden matched layers' props.
|
||||||
|
- `tp-lower-layer` (mirror of `tp-raise-layer`) and a
|
||||||
|
family-consistent `tp-rotate-layer` calling order
|
||||||
|
`(START END DIRECTION [COUNT] [OBJECT])`, selected unambiguously by
|
||||||
|
the symbols `up` / `down`; the legacy order keeps working.
|
||||||
|
- `tp-layer-stack-at` — the full ordered stack at one position as
|
||||||
|
`(NAME . PROPS)` conses, hidden layers marked by a `tp-hidden`
|
||||||
|
entry.
|
||||||
|
- Stack mutators return the number of property runs they modified
|
||||||
|
(including `tp-merge-layers` / `tp-flatten-layers`), and layer-name
|
||||||
|
lookups gained optional NOERROR arguments where they previously
|
||||||
|
signaled.
|
||||||
|
- `tp-describe-layer` — interactive help-buffer description of a
|
||||||
|
layer: storage format, arglist, stored body, expanded props,
|
||||||
|
reactive deps, transform, owning group.
|
||||||
|
|
||||||
|
Reactive engine:
|
||||||
|
|
||||||
|
- **Layer→buffer registry**: reactive updates now visit only the
|
||||||
|
buffers registered as showing the affected layer instead of scanning
|
||||||
|
the whole `(buffer-list)`; every buffer-mutating write path
|
||||||
|
registers (tp-set family, stack mutators, match/regexp appliers),
|
||||||
|
killed buffers are pruned, and an unknown layer falls back to one
|
||||||
|
learning full scan. `tp-reactive-layer-buffers` exposes the
|
||||||
|
registry; `tp-reactive-track-buffer` closes the
|
||||||
|
insert-a-propertized-string gap.
|
||||||
|
- **Minimal-diff `tp-text` re-render**: only the differing span is
|
||||||
|
edited (insert-before-delete), so point and markers in unchanged
|
||||||
|
text stay put and identical-text updates no longer touch the buffer
|
||||||
|
at all (buffer-modified flag preserved).
|
||||||
|
- `tp-gc-anonymous-layers` — collects interned anonymous layers that
|
||||||
|
no registered live buffer still shows (stack-aware: buried and
|
||||||
|
hidden layers count as alive; string-only layers are conservatively
|
||||||
|
kept).
|
||||||
|
|
||||||
|
Search and matching:
|
||||||
|
|
||||||
|
- `tp-regexp-set/reset/add` accept SUBEXP: properties apply to that
|
||||||
|
capture group per match (non-participating groups contribute
|
||||||
|
nothing); SUBEXP beyond the pattern's group count signals a clear
|
||||||
|
error.
|
||||||
|
- `tp-match-*` / `tp-regexp-*` accept START/END bounds with
|
||||||
|
as-if-only-that-portion semantics; reversed bounds are swapped.
|
||||||
|
- `tp-forward` / `tp-backward` / `tp-forward-do` / `tp-backward-do`
|
||||||
|
accept PREDICATE and NOT-CURRENT, passed through to the
|
||||||
|
text-property-search machinery; defaults keep the 0.2.0 symmetric
|
||||||
|
equal-matching contract exactly.
|
||||||
|
|
||||||
|
Layer definitions:
|
||||||
|
|
||||||
|
- **Multi-argument parameterized layers**: `define-tp` / `define-tps`
|
||||||
|
arglists may declare any number of parameters;
|
||||||
|
`(LAYER ARG1 ... ARGN)` and wrapped `(LAYER (ARG1 ... ARGN))` specs
|
||||||
|
work in `tp-set` and `tp-put-layer`; new `tp-layer-props-with-args`
|
||||||
|
/ `tp-group-props-with-args` / `tp-layer-arglist`. Wrong-arity
|
||||||
|
calls signal clear errors naming the layer and both counts.
|
||||||
|
- Prefix-conforming aliases `tp-define-layer` / `tp-define-group` /
|
||||||
|
`tp-define-palette` for discoverability (`C-h f tp-…`).
|
||||||
|
|
||||||
|
Core and palette:
|
||||||
|
|
||||||
|
- `tp-intervals` / `tp-intervals-map` accept an optional ABSOLUTE
|
||||||
|
argument returning native buffer coordinates (feedable straight
|
||||||
|
back into `tp-set`); the range-relative default is unchanged.
|
||||||
|
- `tp-palette-color` (generic theme-resolved accessor) and
|
||||||
|
`tp-palette-has-p` consolidate the palette query surface; all
|
||||||
|
existing query functions remain.
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
All six were found by an adversarial architecture/API review of the
|
||||||
|
new 0.3.0 code and confirmed with minimal reproductions before fixing:
|
||||||
|
|
||||||
|
- The reactive buffer registry only registered `tp-set`-family writes;
|
||||||
|
layers applied via `tp-push-layer`, `tp-match-set`, etc. never
|
||||||
|
re-rendered on variable updates.
|
||||||
|
- Reactive updates wrote only the rendered top layer; hidden or
|
||||||
|
buried layers kept stale props (visible again on `tp-show-layer`).
|
||||||
|
- `tp-gc-anonymous-layers` and `tp-reactive-track-buffer` scanned only
|
||||||
|
direct `tp-name` properties, so a layer buried in a stack (or
|
||||||
|
hidden) could be wrongly collected / missed.
|
||||||
|
- `tp-flatten-layers` / `tp-merge-layers` rendered hidden layers'
|
||||||
|
properties despite `tp-hide-layer`'s documented contract.
|
||||||
|
- Minimal-diff `tp-text` edits deleted before inserting, so markers at
|
||||||
|
the suffix boundary drifted to the wrong character.
|
||||||
|
- An error escaping a reactive update could strand queued batch
|
||||||
|
entries (now drained under `unwind-protect`; `tp-reactive-reset`
|
||||||
|
clears the queue).
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- **Module boundaries tightened** (behavior identical under
|
||||||
|
`(require 'tp)`): the `tp-text` handler chain moved from tp-render
|
||||||
|
into tp-ops — partial loads now get working `tp-text` replacement —
|
||||||
|
and `tp-with-batch-updates` moved up into tp-render; two of the four
|
||||||
|
upward hook variables are gone
|
||||||
|
(`tp--tp-text-handler-function`, `tp--reactive-flush-function`).
|
||||||
|
The layer-stack storage codec and the anonymous-layer machinery now
|
||||||
|
live in tp-layer; tp-stack's phantom dependency on tp-ops is gone;
|
||||||
|
67 lines of dead code deleted. tp-core holds no mutable state.
|
||||||
|
- String forms of all 16 stack mutators document that they modify the
|
||||||
|
string in place (unlike `tp-set`'s copy semantics); unifying this is
|
||||||
|
on the 0.4 ledger.
|
||||||
|
|
||||||
|
### Deprecated
|
||||||
|
|
||||||
|
- `tp-search-forward` / `tp-search-backward` (0.3.0) — thin wrappers
|
||||||
|
whose nil-PREDICATE default contradicts the rest of the library's
|
||||||
|
equal-matching; use `tp-forward` / `tp-backward`, or the Emacs
|
||||||
|
primitives for raw access.
|
||||||
|
- `tp-suffix-symbol` (0.3.0) — internal helper now private as
|
||||||
|
`tp--suffix-symbol`; a compatibility alias remains.
|
||||||
|
|
||||||
### Infrastructure
|
### Infrastructure
|
||||||
|
|
||||||
- GitHub Actions CI: Emacs 28.1 / 29.4 / 30.1 matrix running
|
- GitHub Actions CI: Emacs 28.1 / 29.4 / 30.1 matrix running
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user