Roadmap¶
loom is an MVP-stage terminal editor. This page separates what is implemented today from what is deliberately deferred.
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 operations and directcl-host-kitcalls where filesystem guarantees require them. - 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 exposes a read-only transcript plus a bounded ANSI screen model. - 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 -- line-local Common Lisp highlighting is modeled as a pure feature domain and rendered through the presentation boundary.
- 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. All captured status and diff output, including stderr and exit status, remains visible in read-only result buffers, while staging commands report their exit status in the minibuffer. - 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), negotiate initialization capabilities, synchronize file-backed buffers with UTF-8 percent-encoded URIs, renderpublishDiagnosticsmessages in*Loom-Diagnostics*, and perform theshutdown/exithandshake with a timeout fallback. - Multiple cursors (line-oriented slice) --
C-x m nadds the next-line cursor,C-x m lcreates cursors across the point/mark lines, andC-x m cclears them. Self-insert fans text out to every cursor and the renderer marks secondary cursors with a reverse-video cell. - 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.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.
2026 refactor status¶
The bounded concurrent file-tree runtime and its ASDF-integrated
concurrent-runtime-test are implemented in the current source. This marks
the runtime portion of the 2026 refactor objective as present; it does not
make the deferred editor features below complete.
Not yet implemented¶
These are follow-up phases rather than claims that the current editor is a complete Lem or Emacs replacement:
- Richer LSP protocol surface. The discovered or prompted server command remains trusted input; dynamic registration and requests beyond the current diagnostics/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.
Released changes¶
v0.1.0¶
The MVP release consolidates the 2026 editor modernization, bounded concurrent
file-tree runtime, integrated unit/integration/e2e test paths, and the
session-wide buffer registry with switch-to-buffer lookup.
Release artifacts and release notes are managed through GitHub Releases.