Skip to content

Releases: sinelaw/fresh

fresh-editor 0.2.21

31 Mar 21:16
Immutable release. Only release title and notes can be modified.

Choose a tag to compare

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 list and editor.listGrammars() plugin API show all available grammars with source and extensions. When specifying a grammar in a languages entry 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

29 Mar 12:42
Immutable release. Only release title and notes can be modified.

Choose a tag to compare

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_features filters, 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, and page_width can 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 type from "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_markers field 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: true in 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_tilde to hide EOF tilde markers (#1290), menu_bar_mnemonics to 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

23 Mar 00:15
Immutable release. Only release title and notes can be modified.

Choose a tag to compare

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-winterm crate 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_line Setting: New config option to auto-hide the prompt line. Applied immediately from Settings UI (#1273).

  • use_tabs Setting: Global editor.use_tabs config 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: removePath now 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 log in the embedded terminal, including TERM env 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 removePath failing 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 SIGUSR1 handler; relies on harness signal handler for backtraces.

  • Cleaned up completed design docs.

fresh-editor 0.2.17

19 Mar 00:31
Immutable release. Only release title and notes can be modified.

Choose a tag to compare

0.2.17

Bug Fixes

  • Reverted Windows Bracketed Paste Fix: Reverted the bracketed paste fix for Windows Terminal (#1218) as it broke mouse input (#1284). The fix enabled ENABLE_VIRTUAL_TERMINAL_INPUT which interfered with mouse event handling.

fresh-editor 0.2.16

18 Mar 18:47
Immutable release. Only release title and notes can be modified.

Choose a tag to compare

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_exit setting (#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 /tmp instead 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

06 Mar 15:21
Immutable release. Only release title and notes can be modified.

Choose a tag to compare

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

05 Mar 21:45
Immutable release. Only release title and notes can be modified.

Choose a tag to compare

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() replacing globalThis pattern, restartLspForLanguage, process-limits for registerLspServer, async reloadGrammars(). 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_overrides in 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 languageId sent 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

02 Mar 15:50
Immutable release. Only release title and notes can be modified.

Choose a tag to compare

0.2.12

Features

  • Auto-Close Config: Separate auto_close toggle (default: true) to independently control bracket/quote auto-close, skip-over, and pair deletion — previously coupled to auto_indent. Per-language overrides via languages.<lang>.auto_close (#1144).

  • Surround Selection: Typing an opening delimiter with a selection wraps it instead of replacing it (e.g. selecting hello and typing ( produces (hello)). Controlled by auto_surround config 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=1 to 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

01 Mar 17:13
Immutable release. Only release title and notes can be modified.

Choose a tag to compare

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_fg theme 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: --wait flag blocks the CLI until the user dismisses a popup or closes the buffer — enables use as git 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 when open-file starts a new session.

  • GUI: macOS Native Integration (experimental): Native menu bar with dynamic when/checkbox conditions, Cmd keybindings (macos-gui keymap), app icon, and .app bundle resources. Menu tracking detection prevents state mutations from causing menu jumps.

  • Platform Icons: Application icons for Windows .exe, Linux .deb/.rpm packages, 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 Language to 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_connection on 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 WaitUntil instead of Poll and caching menu item states.

Improvements

  • Status log and warning log buffers are now read-only.
  • Replaced buffer_modified JS 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

25 Feb 08:00
Immutable release. Only release title and notes can be modified.

Choose a tag to compare

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 gui and run with --gui to 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: filenames field 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_size setting 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_gitignored now applied on init (#1079).

  • LSP Toggle Desync: Fixed state corruption when toggling LSP off/on — now sends didClose so re-enable gets fresh didOpen (#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 -a attach 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-gui crate.
  • Unified language detection with DetectedLanguage struct and single apply_language() mutation point.
  • CI now runs clippy with --all-features to lint GUI code.