Roadmap¶
This page separates the current implementation from deliberately deferred work. Deferred items are not production-readiness claims.
Implemented today¶
- Buffer editing -- insert/delete, Emacs-style kill-ring/yank, numeric
prefix arguments, multi-level undo grouped by command boundary, and
restriction-aware narrowing/widening (
C-x n n/C-x n w), plus read-only buffers with an interactive toggle (C-x C-q). - Movement -- character/line motion, beginning/end of line.
- Emacs-style keybindings --
install-default-keybindingsinstalls the command registry's movement, editing, search, file, window, file-tree, session, register, recent-file, bookmark, shell, help, keyboard-quit, and quit bindings, including theC-x/C-cprefix sequences. The bindings live insrc/application/commands-keybindings.lisp, and the declarative catalogue lives insrc/application/command-definitions.lisp. - Window management -- horizontal/vertical splits (
C-x 2/C-x 3), window selection (C-x o), per-window buffer switching (C-x b). - Named workspaces -- create, switch, cycle, and kill independent window
trees with
C-x t 2,C-x t o,C-x t n,C-x t p, andC-x t k; the active workspace is shown in the shortcut line and persisted by sessions. - File-tree sidebar (
C-x C-t) -- navigate, and create/rename/delete files and directories on disk, usingcl-boundary-kitfor normal and testable operations. The direct native path is limited to the real filesystem with wild pathnames;cl-host-kitcovers host-level filesystem paths that require it. - File I/O --
find-file(C-x C-f),save-buffer(C-x C-s). - Regular-expression search and replacement --
C-s,M-%, andM-g g, usingcl-regex-kitpatterns with a bounded search operation. - M-x command registry and prompts -- extended commands resolve through
the declarative catalogue in
src/application/command-definitions.lispand the lookup implementation insrc/application/command-registry.lisp; quit confirmation usescl-prolog-kit, and minibuffer history usescl-history-kitdirectly. - Raw-mode terminal event loop -- built on
cl-tty-kit, with a double-buffered renderer. - Interactive PTY terminals --
M-x terminalstarts a child process, translates editor key events into terminal input, polls output, handles resize, and displays the current bounded ANSI screen in a read-only buffer. The session retains cumulative raw output separately. - Bounded concurrent file-tree runtime --
cl-concurrent-kitworkers prefetch uncached directory listings, while generation checks, cache invalidation, and render-lane draining prevent stale results from changing editor state. The default is four workers with a queue capacity of 64. - Syntax highlighting -- Common Lisp uses a reader-aware, line-local tokenizer; other modes use a lightweight tokenizer with mode-specific keywords and comment prefixes. Tokens are rendered through the presentation boundary. Multiline reader state is not retained.
- Major modes and project navigation -- buffers infer a mode from their
path,
M-x set-major-modecan override it, andC-x p f,C-x p s, andC-x p rfind files, search project contents, and show the project root. - Common Lisp evaluation --
M-:andC-x C-eevaluate trusted forms inLOOM-USERand append structured results or errors to*Loom-Eval*. - Shell command integration --
M-!andM-x pipe-commandrun a command in the selected file's directory and append captured standard output, standard error, and the exit code to*Loom-Pipe-Command*. - Code formatting --
M-x format-current-buffersends the complete buffer to an external command and applies successful output as one undoable edit, preserving point and mark offsets. - Git status, staging, and diff integration --
C-x gruns concise branch-aware status from the current project root;M-x git-diffandM-x git-diff-stageddisplay working-tree and index patches; andM-x git-stage-file/M-x git-unstage-fileprompt for a repository path before changing the index. Read-only result buffers show standard output, falling back to standard error when standard output is empty. Failed commands report their exit status in the minibuffer; staging commands report their outcome there as well. - Auto-save --
M-x auto-save-modeenables global automatic saving andM-x toggle-auto-saveenables it for the selected buffer; modified writable file-backed buffers are written to#file-name#sidecars from the event loop without clearing their normal modified state. - LSP client slice --
lsp-start,lsp-stop, andlsp-diagnosticsuse a project-local.loom-lspcommand when available (while allowing an explicit prompt override). A discovered command requires review of its configuration path, directory, and command, followed by the exact answeryesbefore execution. The client negotiates initialization capabilities, synchronize file-backed buffers with UTF-8 percent-encoded URIs, renderpublishDiagnosticsmessages in*Loom-Diagnostics*, and perform theshutdown/exithandshake with a timeout fallback.lsp-completion-at-point(C-M-i) requests completion and presents a capability-gated candidate popup;lsp-find-definition(M-.) jumps to a returned local file andlsp-pop-definition(M-,) returns to the jump origin. - S-expression motion --
C-M-fandC-M-bmove by expression,C-M-uandC-M-dcross the enclosing parentheses, andC-M-kkills the expression after point. Parentheses inside a string, a comment, or a#\character literal are text rather than structure, and the parenthesis beside point is marked together with its partner -- or with nothing at all when the form does not balance. - Structural editing --
C-<right>andC-<left>slurp and barf forward,C-M-<left>andC-M-<right>do the same backward,M-(wraps the next expression,M-ssplices the enclosing list away andM-rraises the expression at point out of it. These commands transform delimiters and group each successful edit into a single undo step. - Incremental search --
C-sandC-rmove point to the next match on every keystroke, highlight all matches with the current one distinguished, advance or turn around on a furtherC-s/C-r, keep point on RET while filing the pattern in the minibuffer history, and return point to where the search began onC-g.M-x search-forwardkeeps the non-incremental form. - Line display -- a window follows point horizontally in screen cells for a
truncating buffer and wraps a long logical line across several rows for a
wrapping one. The major mode picks the default -- code truncates, Markdown,
Org, and plain text wrap -- and
M-x toggle-truncate-linesoverrides it per buffer.next-lineandprevious-linemove by screen row. - User extension --
LOOM_INIT_FILEor~/.loom/init.lispcan register commands and keybindings before the terminal loop starts. - Session and buffer lifecycle -- explicit session save/load persists
buffers, named workspace layouts, recent files, named bookmarks, and
M-x/minibuffer command history in the canonical v5 format; the reader
accepts only the v5 envelope and has no compatibility path for pre-v5
session files.
switch-to-buffer,kill-buffer, and case-insensitive minibuffer prefix completion manage the buffer registry. - Recent files and named bookmarks --
C-x r fopens the bounded, canonical recent-file list;C-x r m,C-x r b,C-x r d, and M-xlist-bookmarksset, jump to, delete, and list named bookmarks. - Registers and keyboard macros -- named text/point registers and
record/replay keyboard macros are available through the
C-x randC-xbindings. - CLI -- built on
cl-cli;--help/-h,--version/-V, and one optional positional path are supported. A file opens in the first window, a directory becomes the file-tree root, and no path defaults to.. See*loom-app*insrc/application/startup-cli.lisp. - Integrated test, coverage, and benchmark paths -- the
loom/testASDF component order is declared inloom.asdand loads unit and integration coverage in serial order. It includes dedicated coverage for major modes and project navigation. The development guide documents the test runner, PTY checks, coverage, and benchmark commands.
Verification scope¶
The source tree uses explicit domain/application/infrastructure/presentation boundaries, release-pinned dependencies, and an ASDF-integrated test and coverage workflow. The Nix gate runs formatting, paredit syntax, tests, coverage, and documentation for the selected host system. Results for other declared systems require separate execution. Deferred work remains listed below.
The Nix check is the in-process gate. Sandbox3 may skip PTY-dependent checks
when no usable PTY is available. nix run .#e2e is the separate PTY gate and
must be assessed independently.
Not yet implemented¶
- Richer LSP protocol surface. Command confirmation is not a sandbox; approved discovered commands and explicit overrides run with the user's permissions. Dynamic registration and requests beyond the current completion, definition, diagnostics, and document-sync slice remain future work.
- Broader editing surface. A richer package/extension distribution story and editing commands beyond the current region-aware kill/yank slice remain future work.
- Full VT terminal emulation and desktop/editor integrations. Complete terminal compatibility beyond the bounded common-ANSI screen model, interactive terminal application integrations, richer Git staging and diff UI, and additional language modes remain future work.
Release status¶
Release readiness for the implemented feature set requires recorded results from both verification gates and the author's completed manual checklist. Unperformed checks are not passes. The deferred features above are outside that release scope.
The Nix build patches the pinned renderer's wide-character output. Regression tests check ANSI text placement as well as cursor geometry, including replacement of wide characters by narrow ones. The verification ledger records the observed checks and remaining acceptance criteria.