Releases: sinelaw/fresh
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.
fresh-editor 0.2.5
0.2.5
Features
-
Persistent Auto-Save: New
auto_save_enabledconfig option (default: false) to automatically save modified buffers to their original file at a configurable interval (auto_save_interval_secs, default: 30s) (#542) -
Smart Home: Home key now uses smart home behavior by default, toggling between the first non-whitespace character and column 0. On soft-wrapped lines, smart home respects visual line boundaries instead of jumping to the physical line start (#1064).
Bug Fixes
-
Diff View Scrollbar: Fixed scrollbar click-to-jump and thumb drag not working in side-by-side diff views. Composite buffer views now use row-based scrolling via CompositeViewState.
-
Terminal Bracket Paste: Fixed pasted text going into the editor buffer instead of the terminal PTY when in terminal mode (#1056).
-
LSP did_open Reliability: Fixed buffer being incorrectly marked as LSP-opened when the did_open send fails, which prevented retry and could corrupt server document state.
-
Remote Editing Data Loss: Fixed intermittent data loss when loading large files via SSH remote editing on macOS. The bounded channel now uses backpressure instead of silently dropping data when the buffer overflows (#1059).
Configuration
- Renamed
auto_save_interval_secs(recovery) toauto_recovery_save_interval_secsto distinguish it from the new persistent auto-save feature. Addedauto_recovery_save_interval_secsconfig option (default: 2s).
Internal
- Introduced typed
LeafIdandContainerIdwrappers aroundSplitIdto enforce leaf-vs-container constraints at compile time. - Enabled
#![deny(clippy::let_underscore_must_use)]crate-wide; all ignoredResultvalues now have explicit annotations or proper error handling. - Made
request_completionandrequest_signature_helpinfallible, removing deadResultreturn types. - Added CONTRIBUTING.md with development guidelines.
fresh-editor 0.2.4
0.2.4
Features
-
Markdown Compose Mode: Distraction-free writing mode with concealed markup, soft breaks, table rendering, and mouse support. Split-view allows editing source and rendered markdown side-by-side with synchronized scrolling.
-
Vertical Rulers: Configurable column rulers with add/remove commands via command palette. Per-buffer state and Settings UI JSON editor support (#1028).
-
Horizontal Scrollbar: New horizontal scrollbar with drag support and toggle commands (#972).
-
Smooth Scrolling: Cursor movement now scrolls one line at a time instead of jumping/recentering the viewport (#1040).
Improvements
-
Macro Keybinding: F4 shortcut for Play Last Macro. Removed Ctrl+0-9 and Alt+Shift+0-9 macro keybindings (#700).
-
Configurable Clipboard: New
clipboardconfig withuse_osc52anduse_system_clipboardtoggles to prevent hangs in certain terminals (#964). Useful for Putty and other terminals that sometimes cause Fresh to hang on OSC 52. -
Scrollbar Visibility: New
show_vertical_scrollbarandshow_horizontal_scrollbarconfig options (#974). -
Package Manager: Reinstall support for local-path packages.
-
File Explorer Persistence: Show hidden and show gitignored toggles now persist to config immediately (#569).
Bug Fixes
-
Macro correctness: Replaying a macro now respects the exact same effect as interactive flow.
-
Cursor Navigation: Cursor up/down now lands at end-of-line when goal column is past content (#514).
-
Line Numbers: Fixed line numbers leaking between splits due to shared margins state. Line numbers now live exclusively in per-split BufferViewState.
Plugin API
-
Plugin API v2: Versioned plugin API with
createTerminal,sendTerminalInput,closeTerminal,getAllCursors, and plugin state API. Improved type declarations infresh.d.ts(#1045). -
Split Labels: Splits can be labeled to prevent files opening in managed splits. Labels persist across save/restore. New
beforeoption to place buffers left/top.
Internal
- Refactored per-buffer view state: cursors owned by SplitViewState, ComposeState extracted from EditorState.
- Conceal ranges, soft breaks, and overlay filtering by view_mode at render time.
- Plugin state snapshot reports active split's view_mode and compose flag.
- i18n updates for vertical rulers and macro shortcuts across all locales.
- PieceTree Performance: Use binary search instead of linear scan in line lookup.
fresh-editor 0.2.3
0.2.3
Bug Fixes
-
Undo Corruption After Save: Fixed undo corrupting text after a bulk edit (e.g. multi-cursor or replace-all) followed by save. Piece tree buffers are now restored alongside the tree during undo.
-
Theme Not Found After Restart: Fixed theme reverting to default when the JSON
namefield differs from the filename (#1001). -
AltGr+Shift Input on Windows: Fixed AltGr+Shift key combinations not being recognized as text input (#993).
-
Winget Manifest: Fixed
UpgradeBehaviorindentation causing schema validation failure in winget publishing.
Internal
- Added shadow model undo/redo property-based tests for increased piece tree correctness confidence.
- Added blog showcase system with animated GIF demos for the documentation site.
fresh-editor 0.2.2
Release 0.2.2
Bug Fixes
-
Regex Find-and-Replace: Fixed regex mode not working. Added capture group support (
$1,$2,${name}) and a toolbar hint when regex mode is active. -
Keybinding Editor: Fixed actions with no default keybinding missing from the editor; all actions are now listed. Fixed inability to delete built-in keymap bindings. Fixed deleted bindings reappearing after save.
-
LSP Completion Popup: Fixed completion popup blocking typing when using non-English locales.
-
Revised in-editor help: Rewrote the in-editor help manual, should be a bit more useful.
Internal
- Refactored keybinding editor into multi-file module.
- Locked Cargo.toml dependency versions to minor; docs recommend
--locked. Dependency updates. - ~53 documentation clarity fixes.
fresh-editor 0.2.1
Release 0.2.1
Features
-
Experimental Session Persistence: Fresh now supports a client/server mode, attach/detach/reattach to editor sessions with full state preservation. Start with
fresh -a <name>orfresh -a(directory-based), detach via File menu or command palette. Sessions persist across terminal disconnections. Usefresh --cmd session list/kill/attachandfresh --cmd session open-file NAME FILESto manage sessions from the command line. Allows using Fresh like tmux, or by opening files across other applications, e.g. yazi edit action triggers a file open in Fresh. -
Keybinding Editor: Full-featured editor for customizing keybindings. Search by text or record key, filter by context/source, add/edit/delete bindings with conflict detection and autocomplete. Try menus: Edit..Keybinding Editor, or command palette. Changes are saved in config.json
Improvements
-
Line Editing: Move lines up/down and duplicate lines, matching modern editor behavior. Multi-cursor support (@Asuka-Minato).
-
Triple-Click Selection: Triple-click selects entire line (#597).
-
Vietnamese Localization: Full Vietnamese (Tiếng Việt) language support.
-
Typst Language Support: Syntax highlighting and tinymist LSP configuration for
.typfiles (#944). -
LSP Improvements:
- Per-buffer LSP toggle command to enable/disable LSP for individual files
- Default LSP configs for bash, lua, ruby, php, yaml, toml (#946)
Bug Fixes
-
LSP Document Sync: Fixed document corruption when LSP servers received didChange after didOpen, and when bulk edits (selection replacement, multi-cursor) bypassed LSP notifications.
-
LSP Completion Popup: Fixed popup swallowing non-word characters, arrow keys, and other keys. Popup now dismisses correctly allowing keystrokes to pass through (#931)
-
LSP Diagnostics: Fixed diagnostic gutter markers not appearing on implicit trailing lines with zero-width ranges (clangd-style diagnostics).
-
Line Wrapping: End/Home keys now navigate by visual line when wrapping is enabled, matching VS Code/Notepad behavior (#979).
-
Syntax Highlighting: Fixed highlighting lost when saving files without extension (shebang detection) outside working directory (#978).
-
Buffer Settings: User-configured tab size, indentation, and line numbers now preserved across auto-revert.
-
Terminal Scrollback: Any character key exits scrollback mode instead of just 'q' (#863).
-
32-bit ARM Build: Fixed setrlimit type mismatch on ARMv7l platforms (#957).
Configuration
- Added C++20 module extensions (.cppm, .ixx) for C++ syntax highlighting (#955).
Documentation
- Added FreeBSD installation note (@lwhsu).
Internal
- Build time & RAM reduced