Roadmap

What's shipped and what's planned, by area, taken from the project's TODO. For everything that just landed, see the changelog.

70 of 85 tracked items shipped.

Native Image experiment

  • ✓ Isolate the StaticFX profile and add a shared real-editor stress/benchmark probe.
  • ✓ Offer a separately labelled, best-effort Linux x64 Native Image release tarball with a bounded actual-application smoke test and separate user settings.
  • ○ Investigate the measured native tokenization/input-tail regressions and intermittent desktop probe stalls.
  • ○ Complete native desktop, peripheral-feature and long-session qualification before considering default distribution; see the measured experiment.
  • ○ Resolve the dynamic Java-plugin closed-world incompatibility only through a separate design, if a native product is pursued.

Controller decomposition

  • ✓ Extract exports, editing, templates, settings, run configurations, navigation, previews, Git actions, chrome, MCP operations, file workflows, sessions, test navigation and install prompts into owners.
  • ✓ Extract buffer completion/popups into BufferCompletion.
  • ✓ Keep production Java files below 10,000 lines and enforce that ceiling in SourceFileSizeTest.
  • ○ Continue reducing window composition and buffer presentation complexity through cohesive owners; the size ceiling is not a target. See window coordinators.

Java editing follow-up

  • ✓ Audit and improve the complete typing → sync → completion → insertion → imports path, with real-key FX regressions and an opt-in portable JDT LS Maven-project probe. See Java editing review.
  • ✓ Validate sibling-module resolution in disposable Maven/Gradle projects and 75 KB Java source; enable JDT lifecycle joining to prevent stale import edits.
  • ✓ Add signature overload switching/multiline lifetime, nested snippet restoration, and grouped undo/redo for completion with eager or adjacent deferred imports.
  • ✓ Add a reproducible sustained typing harness on disposable real Maven/Gradle project copies and profile 16 KB–4 MB normal-mode files; reduce synchronization range-scan cost.
  • ○ Complete a human desktop typing trial and measure painted-frame latency on representative hardware.
  • ✓ Rebase disjoint delayed imports into their completion's undo step, retaining intervening typing, split-view history, redo branching, save marks, and bounded overlap fallback.
  • ○ Evaluate a context-preserving recency policy against the recorded repeated-selection ranks before changing semantic server ordering.
  • ✓ Prepare a standalone JSON-RPC reproduction and compiler proof for JDT's same-file import conflict.
  • ○ Reproduce the intermittent Str popup timeouts from the warmed-workspace macro stress baseline with request/state capture; passing follow-up runs do not establish a fix or root cause.
  • ○ Track JDT LS's conflicting import proposal for a same-file class in broken source; rerun the strict live probe when evaluating server updates.

Editing

  • ✓ Smart backspace — clear the indent in one press / jump back on a blank auto-indented line
  • ✓ Auto indent
  • ✓ Smart indentation
  • ✓ Language indentation aware for the 21 languages we support
  • ✓ Autoclose ()[]{} and quotes
  • ✓ Highlight matching braces
  • ✓ Comment/uncomment code region
  • ✓ Fill paragraph/region (Emacs M-q / Fill Region / C-x f set fill column) — re-wrap to a fill column, preserving indentation + an adaptive fill prefix (line comments, > quotes, Javadoc *)
  • ✓ Smart line start (C-a) — first press to the first non-whitespace, second toggles to column 0
  • ✓ Markdown formatting — format bar + smart list/heading/link/table editing (see "Recently shipped")
  • ✓ Format document — LSP: Format Document reformats the whole file via the language server (textDocument/formatting, when it advertises formatting), undoable; palette + editor right-click. (GFM table reflow also exists.)
  • ✓ Column select support — column/block selection (overlay + column-aware edits)
  • ✓ Multiple cursors support — VS Code–style multi-caret (add at next occurrence / above / below) + Alt-drag column selection (personal RichTextFX fork); see "Recently shipped"
  • ✓ Advanced Undo/Redo support — word/line-level undo coalescing (boundary + idle breaks) and an Undo History tool window (M-g u: in-session checkpoints, jump-to-restore). *The undo tree (branch recovery) was deliberately not pursued — it would mean replacing RichTextFX's linear undo engine for a niche payoff; revisit if there's demand.*
  • ✓ Spell check support — Lucene Hunspell, red squiggles, suggestions, user dictionary, en_US/en_GB; bundled technical-terms dictionary (toggle in Settings)
  • ✓ Private comments/notes — see Personal Notes under "Recently shipped"

Search

  • ✓ Incremental Search — find bar searches as you type (debounced), jumps to the nearest match
  • ✓ Regex search — regex + case-sensitive + whole-word toggles in the find bar
  • ✓ Multi-file search — Find in Files (C-S-f): project + open buffers, off-thread, with replace-in-files
  • ✓ Search results panel — Search Results tool window (M-6), grouped by file, Enter/double-click to jump
  • ✓ Find in Files extras — include/exclude globs, query history (editable combo), regex $1 replace, ripgrep badge, bold file names, right-side default
  • ✓ Highlight all matches — every match highlighted live in the editor (current one accented)
  • ✓ AceJump support — M-g j: type a char, then a label, to jump the caret to any on-screen occurrence

Code intelligence

  • ✓ Autocomplete support — code: snippet popup (Enter/Tab); prose: inline ghost text (Tab); auto + C-M-i/M-/ trigger; Settings toggle. (Next: document-words, LSP, fuzzy matching.)
  • ✓ LSP support — 21 servers (see "Recently shipped"): diagnostics + Problems window (M-8) + minimap/scrollbar stripes, go-to-definition (M-.), find references (M-?), hover (C-c h), LSP-backed completion, TS/PHP auto-imports, and Format Document (whole-file reformat). Server-centric registry, per-server Settings, off by default. Document symbols power the Structure tool window. (Next: format-on-save; rename, code actions, quick fixes.)
  • ✓ Fix structure for the 21 languages we support — the Structure tool window now builds from the language server's textDocument/documentSymbol (precise hierarchy, real kinds, per-kind icons, method signatures), with the fold-region/TextMate heuristic as the fallback for non-LSP files; sort (Position/Name/Kind) + kind filter, expanded by default
  • ✓ Multi language support — UI string translation (en/it/es/fr/pt/de); see "UI localization (i18n)" under "Recently shipped"

Snippets

  • ✓ GUI for Snippet management — Settings → Snippets: a master-detail editor (language picker + per-language user-snippet list + name/trigger/description/body form), saving to <configDir>/snippets/<lang>.json. Palette Snippets: Manage Snippets… (snippets.manage)

Files & version control

  • ✓ Git support — native CLI (branch/status, gutter change bars, commit workflow, fetch/pull/push)
  • ✓ Diff viewer + merge-conflict UI — side-by-side / unified diff (vs HEAD / commit / another file), lazy recursive directory comparison, multi-file staged and working-tree review, word-level highlights, apply-hunk / apply-all, patch export, Git-stage Base/Ours/Theirs merge and an editable Result pane
  • ✓ Local file history — IntelliJ-style snapshots on save / auto-save / before an external reload; a File History tool window (M-g l) lists revisions (date/time, reason, size; latest tagged Current), double-click for a read-only diff vs current, restore = undoable whole-file replace. Gzip'd content-addressed blobs + a per-project index under <configDir>/history/, deduped, with configurable retention (revisions/file, age, size/project). On by default; local-only; off in Simple UI
  • ✓ Detect external file changes — prompt to reload when a file changes on disk (focus-regain / tab switch)
  • ✓ Auto-reload modified files
  • ✓ Remote file editing support — SSH/SFTP: browse/open/edit/save remote files; saved connections (metadata only); local-process features auto-disable for remote (see "Recently shipped")
  • ✓ Log mode support

Keybindings

  • ✓ Complete emacs movement/text manipulation keybindings — backward-kill-word (M-DEL), upcase/downcase/capitalize-word + region (M-u/M-l/M-c, C-x C-u/C-x C-l), join-line (M-^), delete-horizontal-space (M-\), just-one-space (M-SPC), delete-blank-lines (C-x C-o), open-line (C-o), kill-whole-line (C-S-DEL), zap-to-char (M-z), forward/backward-sexp + mark/kill-sexp (C-M-f/C-M-b/C-M-SPC/C-M-k), beginning/end-of-defun (C-M-a/C-M-e), mark-paragraph (M-h), mark-whole-buffer (C-x h), move-to-window-line (M-r).
  • ✓ Abbreviations — simple text-replacement dictionary (a lighter abbrev-mode): edit.expandAbbrev (C-x a e), auto-expand-on-terminator (view.toggleAbbrevMode), edit.defineAbbrev (C-x a g), and a Settings → Editor → Abbreviations master-detail UI. Pure editops/Abbrev with Emacs-style case adaptation. Flat global dictionary, not mode-local abbrev tables; not comment/string-aware.
  • ✓ Auto-fill mode — break prose lines at the fill column as you type (Emacs auto-fill-mode). Pure editops/AutoFill; a guarded plainTextChanges handler on EditorBuffer. *Prose-only (plaintext + Markdown); single-char self-insert only (not paste/reload); not comment-aware in code (deferred with the prose gate).*
  • ✓ C-u prefix (universal) argument — C-u/C-u C-u/C-u <digits>/C-u -, repeats the next command (or count-aware commands read it: C-u C-SPC = pop-mark), and self-inserts a character N times. Pure command/PrefixArg state machine + KeyDispatcher wiring; bound only in the Emacs keymap. *Repeat-based, so a negative argument doesn't reverse motion and C-u 0-style specials aren't honored; native unbound keys (arrows/Backspace) aren't repeated — use the bound C-n/C-f/… equivalents.*
  • ✓ Occur — M-s o: regexp-match the current buffer's lines in a picker, jump to a match (buffer-scoped counterpart to Find in Files). Picker, not a persistent occur-buffer with occur-edit.
  • ✓ Tabify / Untabify — edit.tabify/edit.untabify, pure editops/TabConvert, region or whole buffer.
  • ✓ Align regexp — edit.alignRegexp, pure editops/AlignRegexp; pads to align a pattern's column. Adds spaces only (no whitespace collapse / capture-group alignment); character columns.
  • ✓ Mark ring — C-SPC pushes the caret onto a per-buffer ring (bounded 16, edit-tracked), C-x C-SPC (edit.popMark) pops back and cycles. Pure editops/MarkRing. *Explicit marks only — automatic jump-back is the separate NavigationHistory; no C-u prefix, so pop is its own command; session-only; no global (cross-buffer) mark ring.*
  • ✓ Query-replace — interactive M-% / C-M-% (regexp): per-match y/n/!/./q loop, regex group expansion, case-insensitive search. Pure editor/QueryReplace kernel + a modal session. *, (replace-and-pause), ^ (back to previous), region-restricted replace, and case preservation are deferred; the Emacs keymap's M-% was repurposed from the find bar's replace.*
  • ✓ Narrowing — C-x n n/C-x n d/C-x n f/C-x n w. True narrowing (the document text really is swapped), made safe by EditorBuffer.getContent() meaning the whole document so save/autosave/diff/ history/find-in-files stay correct unchanged. *LSP suspended while narrowed; marker persistence suspended; undo history dropped at the boundary; narrowing is session-only and does not nest.*
  • ✓ Rectangles — the C-x r family: kill/copy/yank/delete/clear/open, string-rectangle and rectangle-number-lines, over the mark-based selection, each a single undo step and remembered separately from the kill ring. *Character columns, so tab-indented text does not line up with the display; rectangle registers deferred with registers generally.*
  • ✓ Kill ring — every kill command feeds a bounded ring; C-y yank, M-y yank-pop, consecutive-kill accumulation (forward appends, backward prepends), a palette picker over past kills, and system-clipboard bridging in both directions. *Per window and session-only; registers / rectangles / C-u prefix argument remain deferred.*
  • ✓ Fully configurable shortcuts — keybinding editor in Settings → Keymaps: searchable command list, multi-key chord recorder, conflict warnings, per-command + global reset; live (no restart), persisted as overrides on top of the active keymap theme
  • ✓ Keybinding themes — switchable in Settings → Keymaps / keymap.select, live (no restart), per-OS (Ctrl vs Cmd): Emacs (default), CUA, Sublime Text, VSCode, IntelliJ IDEA
  • ○ Vim keybindings (modal — needs a mode state machine: normal/insert/visual, operators, counts, registers, : command line; deferred as its own feature)
  • ✓ Standard accelerator commands — edit.selectAll / edit.duplicateLine / edit.moveLineUp / edit.moveLineDown, bound in the CUA/Sublime/VSCode/IntelliJ keymaps

UI / UX

  • ○ UI final touches (fonts, colors, etc.)
  • ✓ Pretty up Settings Window — sidebar categories, search, live preview, reset
  • ✓ File-type icons — a per-type glyph (language logos, image/archive/PDF/table/…, generic fallback) everywhere a file is listed: tabs, Project tree, Open-Files/Recent pickers, Switcher, file/folder finders
  • ✓ "Current Folder" explorer — with no project open, the Project tool window roots at the active file's folder and follows the focused tab
  • ✓ Upgrade breadcrumbs support — _partial:_ Reveal in File Manager / Open Terminal Here on a crumb
  • ✓ Fix Zen mode Programming ligatures are OpenType contextual alternates (calt), and JavaFX exposes no feature-control API (no -fx-font-feature-settings, no Font method) — it only auto-shapes complex scripts, never Latin programming ligatures. Even if it did, RichTextFX's editing model maps one char → one glyph cell for caret/selection/hit-testing, which ligature glyph-substitution breaks (the caret lands in the wrong column). Would require both JavaFX feature support and ligature-aware caret math in the fork. Deferred unless JavaFX adds OpenType feature control

Extensibility & integration

  • ✓ Plugins/API support — Java SPI (com.editora.plugin.Plugin) + declarative plugin.json (keymap / external commands / snippet & template dirs); contributes commands, keybindings, tool windows, editor right-click items, and status-bar segments. The ActiveEditor facade does filePath/text/selectedText/caretLine/replaceSelection/insertAtCaret/setText/openPath, and PluginContext adds openUrl/log/setStatus + path accessors. Off by default (Settings → Plugins). Loaded via a child URLClassLoader so it works in the sealed jlink installers. Registry + install: browse a curated GitHub-hosted index.json, install (download + SHA-256 verify + zip-slip-guarded unzip) or install from a local .zip; per-plugin Remove. 19 plugins published in the adriandeleon/editora-plugins registry (which also carries each plugin's source), with 18 worked examples under examples/. Security: the index is verified against a bundled Ed25519 signature (Settings.pluginRequireSignature, default on, blocks an unsigned/unverified registry; sign with scripts/PluginSigningTool.java); a **capability-disclosure confirm** (jar? external commands? keybinding remaps?) runs before enabling at every arming point; reads are size-bounded and a non-default registry host is flagged. See docs/plugins.md. *Deferred: sandboxing, hot reload, gutter-marker contributions, GitHub-API/per-repo discovery, per-plugin/TOFU signing, auto-update.*
  • ✓ External Tools support
  • ✓ MCP support — a minimal Model Context Protocol server embedded in the editor (loopback HTTP + bearer-token auth) so an LLM agent (Claude Code, …) can observe state, edit files, and drive the command registry. Twelve tools — reads list_open_files / read_buffer / get_selection / get_diagnostics / document_symbols / git_status / find_in_files / list_commands, writes edit_buffer (undoable str-replace / whole-buffer edits) / save_buffer, actions open_file (with line:col navigation) / execute_command; writes <configDir>/mcp-endpoint.json for discovery; status-bar indicator (click to copy the connection command). Off by default behind a security-notice dialog (Settings → MCP Server; view.toggleMcp / mcp.copyEndpoint). No new dependency (jdk.httpserver). (Next: resources/prompts, stdio transport, TODO-scan + open-tabs tools.)

Packaging

  • ○ Sign native installers

Settings sync follow-up

  • ✓ Sync snippets, abbreviations, templates and the personal dictionary through a Git repository; see settings sync.
  • ○ Sync preferences, keymaps, macros and themes (needs a machine-local key list and API-key stripping).
  • ○ A per-entry conflict picker, and restoring an entry from the repository history.
  • ○ Sync on quit, bounded so a slow remote cannot hold the exit.
  • ○ Import a configuration zip.