Skip to content

Releases: sinelaw/fresh

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.

fresh-editor 0.2.5

19 Feb 14:04
Immutable release. Only release title and notes can be modified.

Choose a tag to compare

0.2.5

Features

  • Persistent Auto-Save: New auto_save_enabled config 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) to auto_recovery_save_interval_secs to distinguish it from the new persistent auto-save feature. Added auto_recovery_save_interval_secs config option (default: 2s).

Internal

  • Introduced typed LeafId and ContainerId wrappers around SplitId to enforce leaf-vs-container constraints at compile time.
  • Enabled #![deny(clippy::let_underscore_must_use)] crate-wide; all ignored Result values now have explicit annotations or proper error handling.
  • Made request_completion and request_signature_help infallible, removing dead Result return types.
  • Added CONTRIBUTING.md with development guidelines.

fresh-editor 0.2.4

18 Feb 09:44
Immutable release. Only release title and notes can be modified.

Choose a tag to compare

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 clipboard config with use_osc52 and use_system_clipboard toggles 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_scrollbar and show_horizontal_scrollbar config 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 in fresh.d.ts (#1045).

  • Split Labels: Splits can be labeled to prevent files opening in managed splits. Labels persist across save/restore. New before option 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

11 Feb 18:00
Immutable release. Only release title and notes can be modified.

Choose a tag to compare

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 name field 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 UpgradeBehavior indentation 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

10 Feb 20:58
Immutable release. Only release title and notes can be modified.

Choose a tag to compare

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

09 Feb 21:17
Immutable release. Only release title and notes can be modified.

Choose a tag to compare

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> or fresh -a (directory-based), detach via File menu or command palette. Sessions persist across terminal disconnections. Use fresh --cmd session list/kill/attach and fresh --cmd session open-file NAME FILES to 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 .typ files (#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