Releases: sinelaw/fresh
fresh-editor 0.2.24
0.2.24
Features
-
Review Diff Rewrite: Files list and diff are now one scrollable unified buffer. Use
n/pto jump to next/previous hunk. You can collapse per-file, and stage or unstage content on the cursor row (hunk, whole file, or a line-level visual selection). Review comments now saved per-repo across sessions, and a dedicated Comments panel makes them navigable. Two new entry points:Review: Commit Rangefor anyA..B/A...Brange, andReview: PR Branchfor walking a branch's commits with a livegit showside-by-side. In the future I plan to make a new UX for picking the diff target (PR, branch, etc.) -
Git Log Rewrite: Live-preview right panel updates as you move through the log, clickable toolbar, theme-aware colours, aligned columns, wrapped commit messages.
-
Rendering Performance Improvements: see the bugfix section below.
Improvements
-
Preview Tabs in File Explorer (#1403): Single-clicking a file opens it in an ephemeral "preview" tab that the next single-click replaces, instead of accumulating tabs. Any real commitment — editing, double-click / Enter, clicking the tab, or a layout action — promotes the preview to a permanent tab. Enabled by default; disable via Settings UI.
-
LSP:
- LSP status-bar indicator with a spinner during start-up and indexing (no more jitter as progress messages arrive); configured-but-dormant servers show as
LSP (off). Clicking opens a popup with per-server status, live progress, a "binary not in PATH" label for missing servers likepylsp/gopls(so they don't spawn failing processes), and a per-language mute option. - The LSP hover popup now fuses any overlapping diagnostic (severity-coloured, source-tagged like
rustc/clippy/clangd) above the hover body. .hfiles in C++ projects now route to the C++ LSP when there's a real signal (sibling.cpp/.hpp/.hxx).- LSP Correctness fixes: inlay hints re-request after every edit, anchor correctly at end of line (#1572), vanish when their anchor is deleted, track theme changes, and populate on every open buffer when the server becomes quiescent (previously only one); fold indicators no longer drift after edits around a fold (#1571); and diagnostic / inlay-hint refresh no longer pulls from buffers of the wrong language.
- LSP status-bar indicator with a spinner during start-up and indexing (no more jitter as progress messages arrive); configured-but-dormant servers show as
-
Markdown Table Frames: Tables in Page View now render full box borders — top and bottom frames plus a separator between every data row.
-
Read-only state persists across sessions: Buffers marked read-only stay read-only after restart.
-
Narrow-terminal status bar: The right side drops low-priority elements (palette hint, warning counts, encoding, …) in order so the filename and cursor position stay visible.
-
Shift+Mouse-wheel now scrolls horizontally even when the currently visible lines fit the viewport (previously required a long line to have been rendered first).
-
Explorer auto-expands on first open (#1569):
Ctrl+Bwith a nested file active now reveals the file on the first toggle — no more double-toggle. -
Grammar / language fixes: Bare-filename scripts (
Gemfile,Rakefile,Makefile) highlight correctly;.jsx/.mjs/.cjsroute to JavaScript; TypeScript chosen via Set Language now highlights and appears infresh --cmd grammar list. -
Plugin API: Virtual lines accept theme keys for
fg/bgand follow theme changes live. Plugin modes can inherit Normal-mode bindings instead of redeclaring motions. Themouse_clickhook payload now carries buffer coordinates.
Bug Fixes
-
Fixed scrolling in heavily wrapped buffers (#1574): Up/Down no longer drifts the viewport one row per keystroke, and mouse-wheel scroll in Page View on long markdown lists now reaches EOF reliably.
-
Fixed multi-byte / grapheme handling in the view pipeline: fullwidth and CJK text, ZWJ emoji families (
👨👩👧👦), and long combining-mark clusters now render, advance by cursor, and participate in Home/End as a single unit (#1577). Note: different terminals handle ZWJ differently, I recommend ghostty if you need these characters for some reason... -
Fixed
Format Bufferhanging on formatters that emit more than ~64KB — stdout / stderr are now drained concurrently with the write (#1573). -
Fixed arrow keys with an active selection (#1566): Left/Right now collapse to the selection's start/end edge (matching VSCode, Sublime, IntelliJ); Up/Down start from the appropriate edge.
-
Fixed
Shift+Backspacenow behaves like Backspace (previously silently dropped on many terminals) (#1588). -
Fixed session-restored folds landing on unrelated lines after external edits — they now relocate by header text or are dropped (#1568).
-
Fixed project-wide Search & Replace: replace is now undoable with a confirm prompt, repeated
Alt+Enterno longer corrupts files, the file-watch mtime is refreshed after save, and the 100% CPU hang on large-repo scans is fixed (#1575). -
Fixed 100% CPU when a fold hid thousands of lines — fold-indicator detection no longer scans the whole buffer per visible row.
-
Fixed plugin-panel buffers (audit mode, git log, review diff): cursor positions preserved across tab switches, clicks on scrollable panels register,
qcloses the group from any panel, and the active tab in an inactive split is now visible under the high-contrast theme. -
Fixed cursor being able to land on plugin-virtual rows (markdown table borders, gutters) when moving up/down.
fresh-editor 0.2.23
0.2.23
Improvements
-
Windows-1251 Encoding: Added support for Windows-1251 (Cyrillic) encoding for loading and saving Cyrillic-script text files (#1453). Available in the encoding selector; auto-detected for text mixing uppercase and lowercase Cyrillic letters.
-
Theme Editor and Package Manager: Multi-panel plugin UIs now behave like native splits — per-panel mouse-wheel scrolling and scrollbars, draggable panel dividers, and the theme editor's own colors now use the active theme.
-
File Finder in Command Palette (Ctrl+P): Much faster and more responsive on large local and remote trees — file enumeration runs in the background with results streaming in as they're found, typing a path like
etc/hostsproduces instant filesystem-confirmed matches, and ranking now reliably prefers contiguous matches (resultsfindsresults.jsonfirst) including multi-term queries that reconstruct a path or identifier (etc hosts→/etc/hosts,save file→save_file.rs). -
Review Diff: Brought back features that were dropped in the rewrite in version 0.2.22: stage, unstage, and discard individual hunks; jump between hunks with
n/p; leave line comments (c) and overall session notes (N), edit or delete them with confirmation, see notes in the file list panel, and export your review notes to a markdown file. Redesigned toolbar of styled key hints that adapts to the focused panel. -
Keybinding Editor: Special keys like Esc, Tab, and Enter can now be bound — press Enter on the key field to enter capture mode, then the next keypress is recorded as-is (#1501). Fixed parent modal to be dimmed while a sub-dialog is open.
-
Customizable Status Bar: The left and right sides of the status bar are now configurable via the Settings UI using a new DualList picker (transfer items between Available/Included columns, reorder with arrows). Includes a new
{clock}element that displays HH:MM with a blinking colon. Thanks @1612elphi! -
LSP Status Bar Indicator: Simplified to a single color-coded "LSP" label — clicking LSP in the status bar now opens an interactive popup with per-server status and actions (restart, stop, view log).
-
Universal LSP Servers: LSP servers configured for all languages are now spawned once per project instead of once per opened language, eliminating duplicate processes.
Bug Fixes
-
Regression - Fixed multi-byte UTF-8 characters not being parsed correctly in the input handler, and IME-composed characters delivered as key-up events being ignored on Windows (#1538). Thanks @wellorbetter! Reported by @AugustusZane.
-
Fixed blank panels appearing after terminal resize.
-
Fixed terminal mode not being exited when the active buffer is switched to a non-terminal.
-
Fixed Review Diff hunk navigation (
n/p) not working in the diff panel, files panel not receiving focus on launch, hunk-level comments not displaying (#1503), and deleted-file drill-down crashing. -
Fixed Settings UI section headers being invisible in the high-contrast theme.
-
Fixed word wrap producing single-character-per-line output on narrow terminals with deeply indented code — the hanging indent was being double-counted (#1502).
-
Fixed LSP completion popup showing duplicate entries when reopened (#1514).
-
Fixed LSP
auto_startbeing ignored on a per-server basis when multiple servers are configured for one language — opening a file no longer drags in every enabled server, only those individually markedauto_start. -
Fixed mouse input issue - mouse state not being restored in the terminal - after leaving Fresh (Windows only, #1530).
fresh-editor 0.2.22
0.2.22
Features
-
Review Diff Rewrite: The review diff view has been rewritten with a magit-style split-panel UI. The left panel lists files grouped by staged/unstaged/untracked sections (sorted by category), and the right panel shows the diff for the selected file. Navigate with arrow keys, switch focus between panels with Tab, and drill down into individual files. Hunk navigation jumps between changes with auto-centering. Untracked and newly added files are now shown correctly. Diff colors are now theme-aware with per-theme highlight overrides.
-
Remote Mode: SSH connections now auto-reconnect in the background with a disconnected indicator in the status bar. Filesystem operations no longer block the event loop. File explorer roots at the provided remote path instead of the home directory. File finder (Ctrl+P) works on remote filesystems. Error messages are cleaner — hints about SSH installation, and a "Connecting via SSH to ..." message on startup.
Improvements
-
Create Directories on Save: When saving a file to a path where the parent directory doesn't exist, Fresh now prompts to create the directory instead of failing (#1434).
-
Grammar Short Name Aliases: Grammars can now be referenced by short names (e.g.,
"bash"instead of"Bourne Again Shell (bash)") in config and the Set Language popup. Packages can declare ashortNamein their grammar definition. -
Default Language Setting: The
default_languagesetting replaces the previousfallbackobject. Set it to a language key (e.g.,"bash") so unrecognized file types use that language's full configuration (#1219). -
AutoHotkey Syntax Highlighting: Built-in grammar for
.ahkand.ahk2files with v1/v2 command coverage. -
Settings UI: Added inherit/unset support for nullable settings with an Inherit button and inherited badge. The Delete key now unsets a setting override.
-
Theme Selector: Installed theme packages now appear correctly even when multiple themes share the same name. The selector strips URL schemes and sizes the name column to content.
-
File Finder (Ctrl+P): Fixed showing no files on Windows when git isn't being used.
-
Selection Prompts: Pre-filled text is now selected so typing immediately replaces it.
-
Theme Fixes: Fixed low contrast in Nord, Solarized Dark, Light, and Dracula themes. Fixed command palette selected row using wrong foreground color. Syntax highlighting colors are now preserved in text selections.
Bug Fixes
-
Fixed out-of-memory crash caused by an infinite loop in the line-wrapping transform when indentation exceeds half the available width (#1454).
-
Fixed
didOpennotification only being sent to the first LSP server when multiple are configured for a language. -
Fixed status bar line number not updating when stepping through search matches with F3.
-
Fixed
.bash_profileappearing read-only when symlinked to a macOS library path (#1469). -
Fixed session
open-filecommand failing when a session exists but its name doesn't match the socket. -
Fixed scrollbar track hover highlighting more than the hovered cell.
-
Fixed self-update URL pattern not matching all release URLs.
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.