Releases: sinelaw/fresh
fresh-editor 0.2.21
0.2.21
Features
-
Fast Completions without LSP: New basic completions providers without language server — buffer-word candidates appear below LSP results in the popup. Also, a new setting (config) controls auto-trigger vs explicit Ctrl+Space (default: explicit). Enter dismisses the popup (Tab accepts). I plan to further improve it (make it more intelligent) in future releases.
-
Current Line Highlighting: Highlights the cursor line. Enabled by default, togglable from the command palette and Settings UI (caveat: wrapped lines are currently highlighted in their entirety, this should probably be changed to visual lines).
-
LSP Code Actions: Code action modal now actually works! Select an action by number or up/down arrows and enter (#1405). Supports resolve, execute command, and server-initiated workspace edits (previously dropped silently). File create/rename/delete operations handled. Actions from multiple servers unified into one popup. Default keybinding changed to Alt+. - because Ctrl+. is filtered by many terminals.
-
LSP Completion Resolve and Formatting: Auto-imports applied on completion accept. Format Buffer falls back to LSP when no external formatter is configured. Also adds range formatting and pre-rename validation.
-
LSP Server Selection for Restart/Stop: Popup to choose which server to restart/stop individually, or all at once.
-
Grammar Listing:
fresh --cmd grammar listandeditor.listGrammars()plugin API show all available grammars with source and extensions. When specifying a grammar in alanguagesentry in the config, you must currently use a full name from this list - for example "Bourne Again Shell (bash)" rather than "bash". This will be improved once I add grammar aliases.
Improvements
-
Theme Contrast: Replaced all named ANSI colors with explicit RGB in built-in themes for deterministic rendering. Improved contrast ratios across both high-contrast and light themes. Diagnostic and semantic overlays now re-apply correctly on theme change, including during live preview.
-
Git Status Marker Refresh: File explorer markers update on terminal focus gain and by polling for git index changes (#1431).
-
Config-Only Languages: Custom languages without a built-in grammar (e.g., "fish") appear in the Set Language popup and are detected correctly — no more fallthrough to wrong built-in grammars.
-
Theme Inspector: Records exact theme keys during rendering instead of reverse-mapping via heuristics. Theme editor Save As improved for built-in themes.
-
LSP Reliability: Diagnostics cleared on server stop/crash, buffers re-opened on server start, document version checking for workspace edits, LSP notified after undo/redo of bulk edits, pending requests drained on server death to prevent deadlocks, hover suppressed while popups are visible.
Vim Mode
22 bug fixes: C/D/S/cc, e motion, nG, h/l line clamping, ^, $, J with space, f/t special chars, r replace, ~ toggle case, visual mode entry/switching, count display. Key motions moved from async plugin commands to native Rust actions, eliminating race conditions.
If you use the Vim plugin please drop a note at https://github.com/sinelaw/fresh/discussions/417 - I need feedback on this feature.
Bug Fixes
-
Fixed Ctrl+W panic on accented/multi-byte characters (#1332).
-
Fixed LSP diagnostics from stopped servers reappearing from queued messages.
fresh-editor 0.2.20
0.2.20
Features
-
Multi-LSP Server Support: Configure multiple LSP servers per language (e.g., pylsp + pyright for Python). Servers are routed by feature using
only_features/except_featuresfilters, completions are merged from all eligible servers, and diagnostics are tracked per-server. Per-server status is shown in the status bar (#971). -
Per-Language Editor Settings:
line_wrap,wrap_column,page_view, andpage_widthcan now be configured per-language. For example, wrap Markdown at 80 columns while keeping code unwrapped (#1371). -
Diff Chunk Navigation Plugin: New built-in plugin for navigating between diff chunks, merging git and saved-diff sources.
Improvements
-
Faster Startup (~350ms → ~170ms): Syntax grammars are pre-compiled at build time, package loading moved from JavaScript to Rust, plugin I/O and transpilation run in parallel, and redundant grammar rebuilds are eliminated. Plugins can now declare dependencies via
import typefrom"fresh:plugin/..."and are topologically sorted. -
Settings UI Overhaul: Modernized visual design with wider modal (160 cols), rounded corner borders, Nerd Font category icons, styled
[✓]toggles, and reverse-video key hints. Keyboard navigation rewritten: Tab cycles sequentially through all fields and buttons, composite controls (Map, ObjectArray, TextList) support internal navigation, entry dialogs have section headers with explicit field ordering, PageDown/PageUp work in the main panel, and TextList edits auto-accept on navigation. Focus indicator now highlights per-row in composite controls. -
Settings Deep Search: Also in the Settings UI: Search now walks into Map entries, TextList items, and nested JSON values. Searching "python" finds the "python" key in language/LSP maps. Results show hierarchical breadcrumbs (e.g., "Languages > python") and auto-focus the matching entry.
-
Per-Language Workspace Root Detection: New
root_markersfield on LSP server configs. The editor walks upward from the file's directory looking for configured markers (e.g.,Cargo.toml,package.json), replacing the old cwd-based root (#1360). -
Page View Mode: "Compose" mode renamed to "Page View". Can now auto-activate per language via
page_view: truein language config. Old keybinding names continue to work. -
256-Color Contrast Enforcement: When running in a 256-color terminal, foreground colors are automatically adjusted to meet WCAG 3.0:1 minimum contrast ratio against their background. Fixes illegible text in Solarized Dark, Nord, Dracula, and light themes under tmux without truecolor.
-
LSP in Library Files: Files in library paths (site-packages, node_modules, .cargo) now keep LSP enabled for Goto Definition, Hover, and Find References while remaining read-only (#1344).
-
Goto Matching Bracket: Works inside bracket bodies by searching backward for the nearest enclosing bracket, matching VS Code and JetBrains behavior. All bracket searches are bounded to prevent hangs on huge files (#1258).
-
LSP Head-of-Line Blocking Fix: LSP notifications (didClose, didChange, shutdown) are no longer blocked behind pending request responses.
-
New Settings:
show_tildeto hide EOF tilde markers (#1290),menu_bar_mnemonicsto disable Alt+key menu shortcuts (#1257). -
getPluginDir()Plugin API: Plugins can now locate their own package directory to find bundled scripts or install local dependencies.
Bug Fixes
-
Fixed CSI u and xterm modifyOtherKeys key sequences inserted as literal text in terminal session mode (#1113).
-
Fixed word selection (Ctrl+W) stopping at accented/Unicode characters (#1332).
-
Fixed double-click backward drag losing the initial word selection (#1334).
-
Fixed block cursor invisible in zellij due to double cursor-inversion (#1338).
-
Fixed cursor visibility and command palette rendering in zellij (#1255).
-
Fixed undo incorrectly clearing the modified flag after hot exit recovery, which could cause data loss.
-
Fixed bulk edit (e.g., toggle comment) displacing inlay hints on subsequent lines (#1263). Displaced markers are now restored to exact positions on undo.
-
Fixed large file syntax highlighting lost when revisiting a file, caused by checkpoint offset drift during partial cache updates.
-
Fixed embedded language highlighting (e.g., CSS in HTML) breaking at large file offsets.
-
Fixed Enter key leaking into the markdown buffer when the file explorer panel is focused.
-
Fixed large file recovery saving the entire file as individual chunks instead of using the recovery format.
-
Fixed read-only detection for files not owned by the current user (now checks effective uid/gid instead of file mode bits).
fresh-editor 0.2.18
0.2.18
Features
-
Bracketed Paste on Windows & Input Overhaul: Bracketed paste now works on Windows Terminal (reverted in v0.2.17 due to #1284), and keyboard issues are resolved (#1054). Mouse hover is disabled by default on Windows because reliable bracketed paste requires cell-motion tracking; enabling hover switches to all-motion tracking which can insert corrupt text under heavy mouse movement or slow CPU. Re-enable it in Settings UI under Editor → Mouse Hover Enabled. Under the hood, crossterm's Windows input handling is replaced with a new
fresh-wintermcrate using direct VT input reads, with corrupt mouse sequence detection, UTF-16 surrogate handling, and console mode heartbeat to counteract ConPTY drift. -
30 New Syntax Grammars: Dockerfile, CMake, INI, SCSS, LESS, PowerShell, Kotlin, Swift, Dart, Elixir, F#, Nix, Terraform/HCL, Protobuf, GraphQL, Julia, Nim, Gleam, V, Solidity, KDL, Nushell, Starlark, Justfile, Earthfile, Go Module, Vue, Svelte, Astro, Hyprlang (#1266). These grammars are preliminary — please report highlighting issues for your language so we can improve them.
-
Broad LSP Support: Added LSP configs and helper plugins (with install instructions) for Nix, Kotlin, Swift, Scala, Elixir, Erlang, Haskell, OCaml, Clojure, R, Julia, Perl, Nim, Gleam, F#, Dart (#1252), Nushell (#1031), Solidity (#857), Vue, Svelte, Astro, Tailwind CSS, Terraform/HCL, CMake, Protobuf, GraphQL, SQL, Bash, Lua, Ruby, PHP, YAML, TOML, and Typst. LSP integration for these languages is early-stage — feedback from users of these languages is welcome.
-
Deno LSP Auto-Detection: Automatically detects and uses the Deno language server for JS/TS projects (#1191).
-
show_prompt_lineSetting: New config option to auto-hide the prompt line. Applied immediately from Settings UI (#1273). -
use_tabsSetting: Globaleditor.use_tabsconfig option for default tab indentation (#1295).
Improvements
-
Plugin Commands in Keybinding Editor: Plugin-registered commands are now shown and searchable in the keybinding editor.
-
Theme Editor ANSI Colors: Named ANSI colors display as "terminal native" instead of misleading RGB values, with correct native color swatches (#1301).
-
Status Bar Language Info: Shows "[syntax only]" when a language has no LSP config entry.
-
Fallback Language Config: Undetected file types now get a fallback language configuration (#1219).
-
File Deletion Uses Trash:
removePathnow uses the system trash instead of permanent deletion. -
Package Manager Cross-Platform: Plugin package manager uses cross-platform APIs instead of Unix-specific commands on Windows (#1215).
Bug Fixes
-
Fixed arrow keys not working in
less/git login the embedded terminal, includingTERMenv var not being set on Unix. -
Fixed Tab key getting trapped in TextList editing mode in Settings UI.
-
Fixed
{,},;highlighted as operators instead of punctuation in C/C++ (#1318, #1319). -
Fixed auto-dedent for languages without tree-sitter, e.g. Dart.
-
Fixed auto-indent after closing brace in nested C++ blocks.
-
Fixed mouse click selecting wrong item in scrolled settings list.
-
Fixed keybindings for plugin-registered commands not executing (#1312).
-
Fixed Find Next/Find Previous ignoring cursor position (#1305).
-
Fixed Tab indent affecting lines outside selection (#1304).
-
Fixed Shift+letter keybinding deletion not persisting (#1303).
-
Fixed word selection not preserved when dragging after double-click (#1202, #1317).
-
Fixed
removePathfailing on Windows due to UNC path mismatch. -
Fixed external files missing from tab bar after session restore.
-
Fixed scroll wheel targeting focused split instead of split under pointer (#1270).
-
Fixed wrap indent not working with tab indentation (#1283).
-
Fixed LSP "no server configured" for Kotlin and 30+ other languages.
-
Fixed Diff syntax highlighting scope-to-category mappings.
-
Fixed extension mappings for
.cjs,.mjs,.mts,.cts,Jenkinsfile,Brewfile. -
Fixed LSP initialization timeout too short (increased from 10s to 60s).
Internal
-
Added syntax highlighting validation suite with 93 fixture files and e2e tests.
-
Added e2e tests for Settings UI, keybinding editor, search/replace, and plugin commands.
-
Fixed multiple flaky e2e tests (search/replace, plugin uninstall, Settings UI).
-
Removed redundant
SIGUSR1handler; relies on harness signal handler for backtraces. -
Cleaned up completed design docs.
fresh-editor 0.2.17
fresh-editor 0.2.16
0.2.16
Features
-
Project-Wide Search & Replace: Search and replace across the entire project. Works reliably with unsaved buffers, large files, and up to 10,000 results. Alt+Enter to replace in project.
-
Hot Exit: All buffers — including unnamed scratch buffers — persist across sessions automatically. Configurable via
hot_exitsetting (#1148, #1233). -
Workspace Storage: Session state always restored on startup, even when opening specific files from CLI. Plugin state also persists across sessions.
Improvements
-
Keybinding Editor: Collapsible section headers and plugin mode bindings shown as first-class entries.
-
Markdown Compose Mode: Easier to discover via global toggle and searchable command palette entries.
-
Tab Naming: Duplicate tab names are disambiguated with appended numbers.
-
View...Keybinding Style: Menu Checkboxes: Submenu items now show checkbox indicators for toggled settings.
Bug Fixes
-
Fixed crash when workspace references deleted files (#1278).
-
Fixed CapsLock breaking keyboard shortcuts like Ctrl+A, Ctrl+C, etc.
-
Fixed bracketed paste not working on Windows Terminal.
-
Fixed clipboard not working in client-server session mode.
-
Fixed Latin-1 files misdetected as UTF-8 for short files with trailing high bytes.
-
Fixed line number bugs: Delete key not updating status bar (#1261), relative line numbers miscounting (#1262).
-
Fixed C# LSP not working due to language ID mismatch.
-
Fixed remote editing using hardcoded
/tmpinstead of querying the remote system. -
Fixed high memory usage on Windows (#1205).
-
Fixed PageUp/PageDown not working in Theme Editor sidebar.
-
Fixed unbound keys being swallowed in plugin modes.
Packaging
- Linux: Icons and desktop files added to all packaging methods (deb, rpm, Flatpak, AppImage). Fixed Flatpak AppStream metadata for app stores.
fresh-editor 0.2.14
0.2.14
Improvements
- Keybinding Map Checkboxes: Submenu items in the keybinding map now show checkbox indicators for toggled settings.
Bug Fixes
- Windows Memory Usage: Fixed high memory usage on Windows caused by buffered input event draining before render (#1205).
fresh-editor 0.2.13
0.2.13
Features
-
Inline Diagnostics: Diagnostic text displayed at end of lines, right-aligned, with version-aware staleness dropping. Disabled by default — enable "diagnostics inline text" in the Settings UI (#1175).
-
Hanging Line Wrap: Wrapped continuation lines preserve the indentation of their parent logical line (#1169).
-
Theme Editor Redesign: Virtual scrolling, mouse support, flicker-free inline styling. New "Inspect Theme at Cursor" command and Ctrl+Right-Click theme info popup.
-
Open File Jump:
path:line[:col]syntax in Open File prompt and Quick Open (#1081, #1149).
Improvements
-
Plugin API:
registerHandler()replacingglobalThispattern,restartLspForLanguage, process-limits forregisterLspServer, asyncreloadGrammars(). Strict TypeScript across all plugins. -
Load Plugin from Buffer: Run and hot-reload plugins directly from an open buffer, with LSP support for plugin dev buffers.
-
Status Bar Toggle: Command palette command and config option to show/hide the status bar.
-
LSP Environment Variables: Pass environment variables to LSP server binaries via config (#1159).
-
LSP Language ID Overrides: Configurable
language_id_overridesin LSP server config. -
Rust LSP Mode Switching: Command palette action to switch between Full and Reduced Memory modes for rust-analyzer.
-
Signature Help Rendering: Markdown rendering for signature help popups with hanging indent and paragraph spacing.
-
Non-Blocking Grammar Builds:
SyntaxSet::build()moved to a background thread. Buffered input events drained before render for CPU-constrained responsiveness. -
Disabled LSP start/restart commands for languages without LSP config (#1168).
Bug Fixes
-
LSP Bracket Paths: Fixed LSP failing for file paths containing
[or](#953). -
Search F3 Navigation: Fixed F3 losing matches after viewport scroll (#1155).
-
Settings JSON Copy: Fixed Ctrl+C not working in settings JSON editor (#1159).
-
Line Numbers on New Files: Fixed line numbers showing when disabled in settings for newly opened files (#1181).
-
Client/Server Paste: Fixed bracketed paste mode and terminal feature parity in client/server sessions (#1168).
-
Popup Selection: Fixed popup text selection copying wrong text when lines wrap (#1170).
-
Suggestions Popup Border: Fixed bottom border overwritten by status bar (#1174).
-
TSX/JSX Language ID: Fixed wrong
languageIdsent to LSP for TSX/JSX files (#1174). -
LSP Error Suppression: Suppress ContentModified/ServerCancelled errors per LSP spec instead of logging as errors.
-
Semantic Tokens: Skip degraded semantic token responses to preserve syntax highlighting.
-
Theme Save: Fixed save failing when themes directory doesn't exist (#1180). Fixed saving incomplete theme files.
-
LSP Completion: Fixed completion debounce, cleanup-on-disable, and popup positioning issues.
fresh-editor 0.2.12
0.2.12
Features
-
Auto-Close Config: Separate
auto_closetoggle (default: true) to independently control bracket/quote auto-close, skip-over, and pair deletion — previously coupled toauto_indent. Per-language overrides vialanguages.<lang>.auto_close(#1144). -
Surround Selection: Typing an opening delimiter with a selection wraps it instead of replacing it (e.g. selecting
helloand typing(produces(hello)). Controlled byauto_surroundconfig with per-language overrides. -
Smart Quote Suppression: Quotes typed inside an existing string no longer auto-close, preventing unwanted doubled quotes (#1142).
-
Read-Only Mode: Files without write permission and library/toolchain paths (rustup, /usr/include, /nix/store, Homebrew Cellar, .nuget, Xcode SDKs) automatically open as read-only. New "Toggle Read Only" command to override. Status bar shows
[RO]indicator.
Bug Fixes
-
Multi-Cursor Enter: Fixed Enter key in markdown mode only inserting a newline at the last cursor, ignoring secondary cursors. Falls back to built-in insert_newline when multiple cursors are active (#1140).
-
Multi-Cursor Position Drift: Fixed cursors with no events during bulk edits (e.g. Delete at end of buffer) drifting to stale positions. Uses saturating arithmetic to prevent overflow with overlapping selections (#1140).
Improvements
- Log Noise Reduction: Disabled span close events (~90% of log volume) by default and moved 12 high-frequency log sites to trace level. Typical log size reduced from ~266MB to ~5-10MB. Set
FRESH_LOG_SPANS=1to re-enable (#1154).
Internal
- Added multi-cursor shadow model property-based tests with random operation sequences across 2-3 cursors.
- Added e2e regression tests for multi-cursor Enter with auto_indent, Ctrl+D selection, tree-sitter, and markdown grammar.
fresh-editor 0.2.11
0.2.11
Features
-
Whitespace Indicators: Granular control over whitespace visibility — configure space (·) and tab (→) indicators independently for leading, inner, and trailing positions. Master toggle, per-language overrides, and a new
whitespace_indicator_fgtheme color. -
Indent-Based Code Folding: Code folding now works in large file mode and for files without LSP folding ranges, using indentation analysis as a fallback. Fold from any line within a block (not just the header). Unified byte-offset pipeline for consistent gutter indicators.
-
Session Open-File Enhancements:
--waitflag blocks the CLI until the user dismisses a popup or closes the buffer — enables use asgit core.editor. Range selection syntax (file:L-EL,file:L:C-EL:EC) and hover messages (file:L@"markdown msg") for annotated file opening. Auto-attaches a client whenopen-filestarts a new session. -
GUI: macOS Native Integration (experimental): Native menu bar with dynamic when/checkbox conditions, Cmd keybindings (
macos-guikeymap), app icon, and.appbundle resources. Menu tracking detection prevents state mutations from causing menu jumps. -
Platform Icons: Application icons for Windows
.exe, Linux.deb/.rpmpackages, and macOS app bundles.
Bug Fixes
-
Bracket Highlight Hanging on Large Files: Bracket matching now caps scanning at 1MB and uses 16KB bulk reads instead of byte-at-a-time, preventing hangs on large files.
-
Markdown Plugin Activation: Plugin now activates based on buffer language (not just file extension), fixing cases where
Set Languageto markdown didn't enable smart editing (#1117). Reverse bullet cycling on Shift+Tab now works correctly (#1116). -
Settings UI: Fixed Save button mouse click not closing the dialog. Fixed Reset button not showing confirmation dialog. Fixed Discard dialog persisting on reopen.
-
Active Tab Styling Bleed: Fixed active tab border color bleeding through dropdown menus.
-
Cursor Corruption on Tab Click: Fixed hardware cursor appearing at wrong position when clicking a tab in an inactive split.
-
Comment Delimiter Colors: Fixed comment delimiter characters (e.g.
//) using the wrong color in syntax highlighting. -
Scroll Events Routing: Fixed mouse scroll events going to the file explorer panel regardless of mouse position.
-
File Explorer Border: Fixed hover/drag bugs on the file explorer resize border.
-
Windows Named Pipe Crash: Fixed crash in
Server::handle_new_connectionon Windows. -
Bar/Underline Cursor Invisible: Fixed bar and underline cursor styles being invisible on characters due to REVERSED modifier creating a block-like highlight (#851).
-
Wrapped Line Viewport Scroll: Fixed viewport scroll limit counting logical lines instead of visual rows, causing erratic scrolling, skipped wrapped rows, and stuck End key with line wrap enabled (#1147).
-
Search on Large Files: Fixed multi-GB memory consumption, O(N²) offset accumulation, and search scan never completing when capped at max matches. Chunked incremental search, viewport-only overlays, and 100K match cap (#1146).
-
macOS Menu Hover Jump: Fixed menu bar jumping to leftmost menu during hover by using
WaitUntilinstead ofPolland caching menu item states.
Improvements
- Status log and warning log buffers are now read-only.
- Replaced
buffer_modifiedJS plugin with native Rust diff indicators, eliminating JS↔Rust round-trips on every edit/scroll.
Internal
- Folding system refactored to use byte offsets instead of line numbers for gutter indicators, fixing consistency issues in large file mode.
- Unified fold indicator pipeline shared between LSP-based and indent-based folding.
- Fixed Nix build: include PNG files in source filter for GUI icon resources.
fresh-editor 0.2.9
0.2.9
Features
-
Code Folding: Fold/unfold code blocks via LSP foldingRange. Per-view fold state, gutter indicators for collapsed ranges, fold-aware scrolling. Toggle via command palette ("Toggle Fold") (#900). Thanks @asukaminato0721 !
-
Large File Line Numbers: Large files show byte offsets in gutter/status bar until scanned. On-demand parallel line index scanning (via Ctrl+G prompt or "Scan Line Index" command) gives exact line numbers with progress indicator. Remote scanning counts newlines server-side without data transfer.
-
Markdown Source Editing: New plugin for smart Markdown source-mode editing — auto-continues list items on Enter (bullets, ordered lists, checkboxes), removes empty markers, Tab indents + cycles bullet style (#1095).
-
GUI mode - can run without terminal (highly experimental): GPU-accelerated windowed mode via winit + wgpu. Build with
--features guiand run with--guito try it.
Improvements
-
Smart Backspace Dedent: Backspace in leading whitespace removes one indent unit (tab_size spaces or 1 tab) instead of a single character.
-
Diagnostics Panel: Up/Down now scrolls the editor to preview diagnostic location. Enter jumps and focuses the editor.
-
Glob Patterns in Language Config:
filenamesfield now supports glob patterns (*.conf,*rc,/etc/**/rc.*) for extensionless file detection (#1083). -
Disabled single-quote auto-close in Markdown files (interferes with apostrophes).
Bug Fixes
-
Auto-Indent: Fixed
tab_sizesetting ignored for auto-indent; fixed indent level lost on normal statement lines; fixed Go auto-dedent using spaces instead of tabs (#1068); fixed Python nested indent after consecutive:lines (#1069). -
File Explorer Dotfiles: Fixed dotfiles always visible regardless of "Show hidden files" toggle. Config
show_hidden/show_gitignorednow applied on init (#1079). -
LSP Toggle Desync: Fixed state corruption when toggling LSP off/on — now sends
didCloseso re-enable gets freshdidOpen(#952). -
LSP Client Capabilities: Now advertises all supported capabilities including
publishDiagnostics, enabling diagnostics from strict servers like pyright (#1006). -
LSP Status Indicator: Fixed status bar indicator disappearing after each request completion (#952).
-
Set Language: Fixed command storing display name instead of canonical ID, breaking LSP config lookups (#1078).
-
Escape Sequences in Client Mode: Fixed mouse codes, Shift+Tab, and standalone ESC not working in
fresh -aattach mode (#1089). -
Client Mode Terminal Reset: Fixed terminal not fully restored on exit in client mode (#1089).
-
Ctrl+End with Line Wrap: Fixed viewport not scrolling to trailing empty line; fixed Down arrow not reaching it (#992).
-
Diagnostics Panel Windows Paths: Fixed file URIs not decoded properly on Windows (#1071).
-
Debug Keyboard Dialog: Fixed not capturing keys in client/server mode (#1089).
Performance
- Replaced linear span lookups in syntax highlighting with O(1) amortized cursor.
- Eliminated JSON round-trip and JS re-parsing in plugin hook dispatch (~16% CPU reduction).
- Path-copying PieceTree mutations with structural diff via
Arc::ptr_eq— O(edit regions) instead of O(all leaves). - Viewport-aware filtering and batch API for large file gutter indicators (~780K IPC commands → ~50 per edit).
Internal
- Update flake.nix to rust 1.92.0
- Split GUI backend into separate
fresh-guicrate. - Unified language detection with
DetectedLanguagestruct and singleapply_language()mutation point. - CI now runs clippy with
--all-featuresto lint GUI code.