13 KiB
Side-quest backlog — the non-themes deferral inventory
Compiled 2026-07-14 from an exhaustive sweep of every framing doc's
"Deferred (named)" section, the handoff §6 consolidated list, the
docs/roadmap-2026-07.md arcs, and a code-level marker sweep
(src/, builtin/, pmacs-gpu/, pmacs-protocol/). Updated 2026-07-15:
multi-language injections shipped (#122) — item pruned to its remaining
follow-ups; north star and Jupyter gate revised.
Scope. This is the side-quest backlog: self-contained,
frontend-agnostic-ish work that does not belong to the themes /
faces main quest (Arc 4, docs/theme-faces-framing.md). Anything about
colors, faces, syntax-highlight styling, or semantic-token→color
mapping is excluded here and lives with the theme workstream — those are
listed once, at the bottom, so the reader knows they were seen.
Framing: side quests are one-shot-ish and mostly enabling; raid bosses are big multi-PR arcs. Each framing doc's own Deferred section remains the authoritative per-feature source; this file is the cross-cutting index. Keep it pruned as items ship.
Side quests — highlighting & language detection
The direct continuation of the #114–#118 grammar/detection stack.
- Locals-query processing — run each grammar's
LOCALS_QUERYso#is?/#is-not? localis honored (restores.builtinstyling for non-shadowed console/require etc.), replacing the current fail-closed drop incompute_highlight_spans. - Multi-language injections — SHIPPED (#122). The load-bearing
engine landed:
ParseTreeBundleholdsVec<Layer>, the worker builds child trees off the static grammar table, settle resolves per-layer highlight queries; markdown fenced code +markdown_inlineare the first consumers. Remaining follow-ups:injection.combined(many matches → one shared parse; PHP-in-HTML, some comment schemes), child-tree incrementality + range-scoped layer rebuild (children cold-reparse on every settle today), injectable runtime/Lua-registered languages (v1 resolves only againstBUILTIN_LANGUAGES), and new injection consumers gated on grammars — HTML/CSS/GraphQL/SQL (<script>/<style>, template literals, doc-comment code). - Modeline detection — a 5th detection layer (
-*- mode: … -*-,# vim: ft=…) after extension → filetype → filename → shebang. - JSON + YAML — PR #123 open. Grammars and LSP configs exist on the
feature line; review fixes are preserved on
json-yaml-handoff-2026-07-20. A real YAML-through-pmacs smoke, rebase, and full gates remain before review resumes. JSON is also the prerequisite for the notebook path; seedocs/active-work.md. - More grammars for languages with neither grammar nor LSP — ruby, php, html, css, sql, etc.
- Grapheme / combining-mark awareness in the text view
(
text_view.rsskips zero-width marks). - Byte-accurate multibyte cursor placement —
move_active_cursor_to(and go-to-definition) step one codepoint per LSP byte-column, landing short on multibyte lines. - Daemon query-by-range / incremental highlight —
scoped_style_spansruns the query over the whole tree even for a scoped viewport (perf ceiling on very large files).
Side quests — LSP feature surface
- Multi-root scoping — one server per project root instead of the current first-file-wins single-root-per-language.
- Hidden-buffer LSP attach — a restored/registry-only buffer attaches
LSP only on first visit (no
after-loadfires). - Inlay-hint inline rendering — hint data exists but nothing renders; needs the virtual-text renderer (the cell-overlay model can't reflow glyphs around inserted columns yet). Plus hint-part interactivity.
- Completion depth —
completionItem/resolve+additionalTextEdits(auto-import), snippet tabstops/placeholders, a doc panel beside the popup, fuzzy matching, persisted frequency ranking. - Panels — reference-row line snippets, in-panel fuzzy filtering,
peek/preview on n/p, call-hierarchy & workspace-symbols panels,
migrate
*buffer-list*ontolistview. - Quick-fix titles streamed into the context menu (vs one generic "Quick Fix" item).
- Attach transports — TLS / Custom (SSH landed; these still parse-and-defer).
Side quests — editing (Emacs table-stakes not yet built)
- Kill-ring / motion: word kills (
M-d/M-BS/C-BS/C-h/C-DEL, need bytes-returning deleters),C-SPCset-mark,C-u C-y,C-M-wappend-next-kill, kill-ring browser, ring persistence, clipboard watching. - Comments: block comments + mid-line spans,
comment-dwimappend-at-EOL, doc-comment continuation on newline, per-language padding. - Auto-indent: language-aware/electric indent (
indents.scm), TAB-as-reindent,C-oopen-line,C-j, strip abandoned-line trailing whitespace on split. - Auto-pairing: wrap-region on opener, pair-aware backspace,
RET-inside-pair closer-on-own-line, in-string/in-comment inhibit
(needs a node-at-byte
pmacs.parsebinding), undo amalgamation, balance-aware quotes, per-buffer toggle. - Editops: recenter (
C-l, blocked on viewport facts), Unicode case/word classes, region-spanning move/duplicate, locale/numeric sort-lines, ensure-final-newline on save, punctuation-awarefixup-whitespace, chords for the M-x-only commands. - Query-replace: capture-group refs (
\1),,/^/?keys, backward & whole-buffer, single undo-group per run, smart default from-string, lazy-highlight of remaining matches, non-interactivereplace-string/replace-regexp.
Side quests — search
- Regex + Unicode case-folding in search (
search.rsis ASCII-fold, literal-only today). - occur-mode; lazy-highlight of all matches; search-match
background rendering on GPU (producer +
SearchMatchquads).
Cross-cutting substrate (unblocks whole clusters — high leverage)
Config/settings registry— SHIPPED as #127.pmacs.configexists with global + buffer-local scopes. Unblocked: the per-buffer auto-pair toggle (shipped in the same PR asediting.auto-pair), language-aware indent, per-language comment padding, and per-project compile commands — the last three are now ordinary work, expressed as abuffer.after-loadhook callingset_local, not blocked work.- Tab-width rendering parity — was listed above as a config
consequence; it is not.
TAB_WIDTH = 8appears four times in the daemon (text_view,highlight,diag,completion), the GPU minimap'sadvance_minimap_coluses 4, and the GPU main text path expands tabs not at all — raw\treaches glyphon and is shaped by the font. Definingeditor.tab-widthcannot make the GPU honor it; this needs frontend tab expansion plus a wire-or-frontend-local decision. Deferred from #127 on those grounds. - Real
read_onlybuffer flag on both edit paths — true immutability for panels / REPL / generated buffers. Mode system wiring— SHIPPED as #129. Per-buffer major modes now drive key dispatch, effective-key introspection, and statusline display.- Buffer-aware edit epoch + origin-pinned
after-editfan-out — a command that edits buffer A then switches to B currently evadesdidChange/ reparse / autosave observers. - Undo-group boundaries (
begin/end_undo_group) + cross-peer chronological undo arbiter — coherent multi-edit undo and mixed source/daemon history. - Viewport facts on the wire — the GPU never consumes daemon
view_top; blocks recenter and any scroll command.
Raid bosses (big multi-PR arcs)
- Arc 5 stage 2 — vterm: extend
ansi.rsinto a 2D grid model (alt-screen, cursor addressing, scrollback), grid-backed buffer view, GPU grid rendering. - Arc 6 — Folding: fold engine (tree-sitter fold ranges) +
FoldStatewire family + gutter fold markers. - Arc 7 — Debugging (DAP): DAP client (JSON-RPC/stdio, same shape as the LSP client), breakpoint gutter signs, stack/variables panels (reuse the Arc 1b listview).
- Arc 8 — GPU splits / multi-buffer (largest unscoped design problem).
- Jupyter
.ipynb— reader → editable → kernel execution; now gated on JSON only (injections shipped in #122). - Git-diff gutter markers (needs a diff source; rides the gutter).
Compile-mode / process follow-ups
PTY-mode variant, auto-scroll option, severity threshold for error-only stepping, per-language/project default commands, echo-area short output
- distinct
M-&, error parsing in*shell-command*, split-window display, persist last compile command, next-error across historical result buffers, occur-mode, configurableGROUP_TERM_GRACE, unify the poll-based cancellable readers across REPL/LSP, fully tick-driven final drain (kill the ~600 ms teardown stall).
Persistence & files
Desktop daemon/GPU-attach restore, save unsaved content in the desktop,
multiple named desktops, window-local minor state, remote/cross-machine
desktops, non-file buffers in the desktop, saveplace for non-file
buffers, recentf as a listview panel, per-project init.lua desktop
scoping, newline-in-path handling. Autosave: idle-gated timing,
non-file buffers, orphan-recovery GC + browser, offload large writes to a
worker, external-change guard on save() itself (a real adjacent
bug), a y_or_n confirm helper, harden the whole $XDG_STATE_HOME/pmacs
root to 0700, fire after-load for [new file] buffers. Files:
byte-preserving (round-trip-exact) save paths; the warning half of
external-change detection (verify-modtime-while-open, revert?).
GPU frontend mechanics (non-theme)
- Input: full command/minibuffer chord forwarding to the GUI,
Meta/Super chords, rebindable local
Ctrl-V/Escape, middle-click paste, right-click context menu, frontend-local provisional selection. - Minibuffer:
i/totalhint (already on the wire), Telescope-style preview pane, candidate kind/doc annotations, unify TUI inline vs GPU dropdown, multibyte-exact band caret, the nav highlight-wrap bug. - Scrolling: scrollbar scroll, pixel-smooth sub-line scroll, horizontal scroll / soft-wrap.
- Rendering: peer caret glyph + name label, own-vs-peer cursor merge,
SelectionSnapshotvsDecorations::Selectionreconciliation, background-kind decorations actually painted, inline adornment placements beyondAtOffset. - Robustness: auto-reconnect + "reconnecting…" banner, capability
renegotiation (offer to relaunch the daemon
--features crdt), theAttachRequest.initial_sizecell-grid assumption. - Perf / harness: glyphon full-buffer
prepareceiling, golden-PNG comparison harness,Renderersub-struct extraction.
Packages / protocol / CLI
Forge aliases (codeberg: / forgejo:, post-v1.0), namespace-preserving
package layout + install-time cross-resolve collision detection,
project-local init.lua wiring + after-init calls, multiple files on the
CLI, describe-job full-message surfacing.
Housekeeping / refactor
lua_bindings/mod.rs split (~4 tranches / ~14 k lines left; the theme
domain excluded — see below), editor.rs split (7 k lines),
pmacs-gpu/src/main.rs split (6.7 k lines), narrow re-exported
install_* from pub → pub(crate).
Excluded — themes / faces main quest (seen, routed elsewhere)
The statusline-segment API (Arc 4 stage 3; framing awaiting review);
background/selection theming; per-peer stable presence colors; exact quad colors per
decoration kind; GPU gutter background layer / wash recolor / chrome
bold-italic-underline; current-line highlight refinements; multi-server
semantic-token style blending; the compile-mode severity→color
classifier (the classification is behavioral, but the coloring is theme
work); the theme domain + style/color converters in the lua-bindings
split. Borderline, kept above as mechanics: whitespace glyphs and indent
guides (visual, not color).
North star (highest-leverage first)
The original north-star items and mode-system wiring have now shipped — multi-language injections (#122), the config registry (#127), JSON + YAML (#123), and mode-system wiring (#129). The remaining board:
- Locals-query processing — restores
.builtinstyling for non-shadowed builtins, the last rough edge of the highlight stack. - Tab-width rendering parity — five constants across two crates with two different values, and no tab expansion at all on the GPU main text path. Explicitly NOT a config-registry task; see the entry under "Cross-cutting substrate".
Beyond those, the cleanest one-shots in the highlight family are
modeline detection and the HTML/CSS grammars that light up more
injection consumers; the most-missed editing table-stakes remain
word-kills + C-SPC set-mark.