pmacs/tests
Levi Neuwirth 664cc25d0c feat(terminal): profiles, scrollback, and a configurable escape key
Stage 1 of the terminal config/copy-mode arc. The terminal had no
configuration surface at all: the command hardcoded $SHELL, scrollback
was a per-open argument only, and the escape chord was a literal in
Rust. No protocol change.

Profiles are a raw Lua table, pmacs.terminal.profiles, not a registry
setting: ConfigValue is four scalars with no table kind, so profiles
join pmacs.lsp.config and pmacs.pair.sets until table-valued settings
exist. The registry gains three scalars whose defaults reproduce the
previous behavior exactly.

Field resolution is explicit open argument, then profile field, then
scalar setting, then $SHELL. env MERGES, with explicit entries
overriding the profile's, because first-wins there would silently drop
half a user's environment. An explicitly named profile that does not
exist is an error even when terminal.default-profile is valid, so a typo
cannot silently fall back.

The two open-time settings resolve through the GLOBAL chain, because
they are read before the identity buffer exists and no caller could have
pinned a local override on a buffer that does not yet exist. Only
terminal.escape-key resolves per buffer, which makes a per-terminal
escape a supported feature.

The escape key is parsed at most once per (terminal, config epoch), and
the cache lives on TerminalSession so its lifetime is the terminal's,
with no purge hook to forget. The epoch alone is not a sufficient key:
it does not advance when focus moves between two terminals with
different buffer-local values, so an epoch-only cache serves one
terminal's chord to the other. An unparseable value falls back to C-c
and reports once per terminal per effective invalid value through the
status line, because a terminal with no escape chord cannot be escaped
to fix the setting that broke it.

Repeating the escape now sends THAT chord to the child through the
ordinary key encoder, rather than a hardcoded ETX. With an escape of
C-x, the previous code sent Ctrl-C and made literal Ctrl-X unreachable.

C-c t opens a terminal. COHERENCE Priority 1 names a terminal
keybinding, and section 2 step 8 grades the terminal works-but-
undiscoverable; C-c is already a live global prefix, so this is a new
leaf rather than a shadow. It is unreachable from inside a terminal,
where C-c is the escape.

Acceptance is tests/terminal_config_acceptance.rs, deliberately NOT
crdt-gated so CI actually runs it. Four bites, each against a different
plausible wrong implementation: a hardcoded ETX fails acc6/9; an
epoch-only cache key fails acc7; a single last-entry cache fails acc8's
parse count; removing the invalid-value fallback fails acc10.

Two test-instrument notes worth keeping. cat -v is the echo probe
because the screen rejects C0 controls before they reach cells, so a raw
echoed Ctrl-X would be invisible. And the probe counts occurrences
rather than testing presence, because a single-character probe collides
with the child's own banner text.
2026-07-25 18:36:18 -04:00
..
common feat(vterm): protocol v19 terminal frames and a native GPU terminal 2026-07-22 13:28:35 -04:00
fixtures V0.2-prerequisite pull-forward + M10.11 clean audit round 2026-05-18 10:31:31 -04:00
acceptance.rs Collapse if-let nests into let-chains (MSRV-1.95 collapsible_if sweep) 2026-05-18 14:29:36 -04:00
auto_indent_acceptance.rs fix(edit): PR #109 round 1 — shared search invalidation, daemon anchor clear, bounded indent scan 2026-07-10 15:46:36 -04:00
auto_indent_crdt_acceptance.rs feat(edit): auto-indent on newline (Arc 2) 2026-07-10 12:11:05 -04:00
auto_pair_acceptance.rs test(edit): PR #110 round 3 — pin raw-byte predicate posture and top-level sets guard 2026-07-12 16:20:01 +01:00
auto_pair_crdt_acceptance.rs feat(edit): auto-pairing (Arc 2) 2026-07-11 17:11:56 +01:00
autosave_acceptance.rs fix(persistence): adopt clears the old owner's skip cache; failing sweeps are loud 2026-07-09 12:06:49 -04:00
bottom_panel_stage1_acceptance.rs fix(window): keep pmacs.window.buffer() infallible with no argument 2026-07-24 20:05:51 -04:00
comment_toggle_acceptance.rs feat(edit): comment/uncomment toggle on M-; (Arc 2) 2026-07-09 22:56:44 -04:00
compile_mode_acceptance.rs feat(fold): Stage 2 — grid (daemon-rendered) collapse 2026-07-23 19:24:07 -04:00
compile_mode_crdt_acceptance.rs fix(compile): PR #113 round 4 — column-counted CR rewrites, alt-screen style resync 2026-07-13 17:55:08 +01:00
completion_popup_acceptance.rs fix(lsp): range-only providers, completion-accept boundary, exact codepoint classify 2026-07-09 20:48:08 -04:00
config_registry_acceptance.rs fix(config): reject wrongly-typed spec fields; make trim-on-save buffer-aware 2026-07-21 18:29:18 -04:00
cua_region_acceptance.rs CUA type-over is a single undo step (Q#U1) 2026-06-15 20:00:53 -04:00
desktop_acceptance.rs fix(persistence): reliable daemon gate, unarm, per-pane after-load 2026-07-08 22:27:24 -04:00
dired_acceptance.rs fix(dired): address PR #165 review round 1 2026-07-25 15:21:26 -04:00
editops_acceptance.rs fix(edit): PR #111 round 1 — scalar-valid UTF-8, per-word capitalize, trim error reporting 2026-07-12 16:34:18 +01:00
find_file_acceptance.rs fix(find-file): review round 1 -- name the real test, pin two gaps 2026-07-25 11:33:46 -04:00
folding_acceptance.rs test(fold): address PR #142 review round 2 — pin the round-1 wiring 2026-07-23 14:25:28 -04:00
folding_stage2_acceptance.rs feat(window): window parameters, fixed extents, and the display policy 2026-07-24 13:53:14 -04:00
gpu_font_acceptance.rs test(font): wire acceptance suite + protocol/design docs (items 2-8, 15) 2026-07-18 11:46:44 +01:00
gpu_initial_target_acceptance.rs Implement session-scoped GPU initial targets 2026-07-23 19:03:25 -04:00
gpu_invocation_acceptance.rs fix(daemon): contain failed target sessions 2026-07-24 10:10:31 -04:00
injection_acceptance.rs fix(injections): PR #122 round 2 — sibling precedence, observable cap, docs 2026-07-15 12:07:21 +01:00
kill_ring_acceptance.rs fix(edit): exact effective-edit verification for kill/yank-pop 2026-07-09 20:40:48 -04:00
lean4_stage1_acceptance.rs fix(test): make acc12 pin the claim it names (review round 1) 2026-07-25 10:18:27 -04:00
listview_acceptance.rs feat(panels): listview module, Q#P6 round-trip seam, references panel 2026-07-07 20:15:46 -04:00
lsp_multi_root_acceptance.rs fix(lsp): attribute a failing root resolver (COHERENCE §1.2) 2026-07-25 14:24:59 -04:00
m3_acceptance.rs Initial commit: v0.1.0 2026-05-03 19:51:06 -04:00
m4_acceptance.rs feat(fold): Stage 2 — grid (daemon-rendered) collapse 2026-07-23 19:24:07 -04:00
m5_5_acceptance.rs Collapse if-let nests into let-chains (MSRV-1.95 collapsible_if sweep) 2026-05-18 14:29:36 -04:00
m5_6_acceptance.rs Initial commit: v0.1.0 2026-05-03 19:51:06 -04:00
m5_7_acceptance.rs CI fixes 2026-05-18 12:24:35 -04:00
m5_8_acceptance.rs tests: widen backoff timing signal 2026-05-25 13:32:54 -04:00
m5_perf_acceptance.rs M11.1: semantic-frontend protocol scaffolding (wire + capability) 2026-05-18 19:39:07 -04:00
m6_4_repl_acceptance.rs Fix PTY final-output drain race 2026-05-04 09:44:30 -04:00
m6_5_repl_acceptance.rs tests: quarantine macOS PTY marker cases 2026-05-25 13:02:46 -04:00
m6_7_scrollback_acceptance.rs Initial commit: v0.1.0 2026-05-03 19:51:06 -04:00
m6_8_multi_repl_acceptance.rs Collapse if-let nests into let-chains (MSRV-1.95 collapsible_if sweep) 2026-05-18 14:29:36 -04:00
m6_perf_acceptance.rs tests: tune M6 hosted perf profile 2026-05-25 13:43:28 -04:00
m7_3_acceptance.rs Fix CI and Documentation issues 2026-05-04 10:19:19 -04:00
m7_5_acceptance.rs fix(packages): basename-collision reject, SHA-256 cache key, timeout thread join, commit→revision, dead-code (F-005/F-009–F-012) 2026-07-03 18:47:23 -04:00
m7_6_acceptance.rs fix(packages): basename-collision reject, SHA-256 cache key, timeout thread join, commit→revision, dead-code (F-005/F-009–F-012) 2026-07-03 18:47:23 -04:00
m7_7_acceptance.rs M7 tail: package system, audit lint, lockfile, resolver 2026-05-07 16:50:37 -04:00
m7_8_acceptance.rs M7 tail: package system, audit lint, lockfile, resolver 2026-05-07 16:50:37 -04:00
m7_9_acceptance.rs M7 tail: package system, audit lint, lockfile, resolver 2026-05-07 16:50:37 -04:00
m7_10_acceptance.rs fix(packages): basename-collision reject, SHA-256 cache key, timeout thread join, commit→revision, dead-code (F-005/F-009–F-012) 2026-07-03 18:47:23 -04:00
m7_11_acceptance.rs M7 tail: package system, audit lint, lockfile, resolver 2026-05-07 16:50:37 -04:00
m7_review_acceptance.rs M7 tail: package system, audit lint, lockfile, resolver 2026-05-07 16:50:37 -04:00
m8_1_acceptance.rs Pin toolchain to 1.95.0 + mechanical clippy/rustc fixes 2026-05-18 11:38:57 -04:00
m8_1c_acceptance.rs M7 tail: package system, audit lint, lockfile, resolver 2026-05-07 16:50:37 -04:00
m8_1d_acceptance.rs M7 tail: package system, audit lint, lockfile, resolver 2026-05-07 16:50:37 -04:00
m8_2_acceptance.rs tests: stabilize hosted perf gates 2026-05-25 13:20:18 -04:00
m8_3_acceptance.rs M7 tail: package system, audit lint, lockfile, resolver 2026-05-07 16:50:37 -04:00
m8_5_acceptance.rs M7 tail: package system, audit lint, lockfile, resolver 2026-05-07 16:50:37 -04:00
m8_6_acceptance.rs M7 tail: package system, audit lint, lockfile, resolver 2026-05-07 16:50:37 -04:00
m8_7_acceptance.rs M7 tail: package system, audit lint, lockfile, resolver 2026-05-07 16:50:37 -04:00
m8_9_acceptance.rs test(ci): diagnose the vterm PTY flake; drop the macOS outline budget 2026-07-24 10:34:36 -04:00
m8_10_acceptance.rs V0.2-prerequisite pull-forward + M10.11 clean audit round 2026-05-18 10:31:31 -04:00
m9_1_acceptance.rs T M4.5 async bridge: LSP requests settle async-runtime jobs 2026-05-18 19:36:17 -04:00
m9_2_acceptance.rs style: from_secs(1) for the m9_2 harvest wait (clippy duration units) 2026-06-10 12:07:08 -04:00
m9_3_acceptance.rs Collapse if-let nests into let-chains (MSRV-1.95 collapsible_if sweep) 2026-05-18 14:29:36 -04:00
m9_4_acceptance.rs M9 ship gate 2026-05-09 15:04:23 -04:00
m9_5_acceptance.rs M9 ship gate 2026-05-09 15:04:23 -04:00
m9_6_acceptance.rs fix(vterm): harden view anchors and interactive authority 2026-07-22 09:09:44 -04:00
m9_7_acceptance.rs M9 ship gate 2026-05-09 15:04:23 -04:00
m9_8_acceptance.rs M9 ship gate 2026-05-09 15:04:23 -04:00
m10_2_perf.rs M10.10 ship gate 2026-05-13 16:28:46 -04:00
m10_10_perf.rs M10.10 ship gate 2026-05-13 16:28:46 -04:00
m10_10_postcard_unknown_variant.rs M10.10 ship gate 2026-05-13 16:28:46 -04:00
m10_11_acceptance.rs M11.1: semantic-frontend protocol scaffolding (wire + capability) 2026-05-18 19:39:07 -04:00
m10_11_perf.rs M10.11: adversarial two-laptop acceptance + jitter; the M10 arc verified 2026-05-15 20:51:00 -04:00
m11_5_semantic_acceptance.rs Implement session-scoped GPU initial targets 2026-07-23 19:03:25 -04:00
mode_system_wiring_acceptance.rs test: preserve mode segments with long paths 2026-07-22 08:28:57 -04:00
overlay_reattach_acceptance.rs fix(panels): follow active buffer on semantic frontends; re-attach overlays on switch 2026-07-07 20:46:50 -04:00
persistence_acceptance.rs fix(persistence): symlink confinement, real test-inertness, view_top restore 2026-07-08 18:21:46 -04:00
query_replace_acceptance.rs fix(query-replace): pin the session to its origin buffer (wrong-buffer guard) 2026-07-08 17:07:08 -04:00
save_clobber_guard_acceptance.rs fix(save): refuse to silently clobber a file changed on disk 2026-07-09 14:12:45 -04:00
statusline_segments_acceptance.rs feat(window): window parameters, fixed extents, and the display policy 2026-07-24 13:53:14 -04:00
tab_width_acceptance.rs feat(fold): Stage 2 — grid (daemon-rendered) collapse 2026-07-23 19:24:07 -04:00
terminal_config_acceptance.rs feat(terminal): profiles, scrollback, and a configurable escape key 2026-07-25 18:36:18 -04:00
theme_faces_acceptance.rs fix(vterm): harden integrated Stage 2 behavior 2026-07-21 21:38:08 -04:00
vterm_stage1_acceptance.rs fix(vterm): harden integrated Stage 2 behavior 2026-07-21 21:38:08 -04:00
vterm_stage2_acceptance.rs test(vterm): gate terminal readiness on a file, not on host bytes 2026-07-24 14:27:21 -04:00
vterm_stage3_acceptance.rs fix(daemon): stop resizing a semantic frontend's PTY twice per tick 2026-07-25 15:22:04 -04:00
worker_shutdown_acceptance.rs fix(completion): address TUI-validation findings (LSP query gaps, scoping, prefix keys, window scope) 2026-07-07 16:54:14 -04:00