Releases: sinelaw/fresh
fresh-editor 0.4.1
0.4.1
This is mostly a bug-fix release.
For live updates on Fresh, follow me on X.
Renamed features and clarified docs
This releases introduces new names (in docs, cli, etc) to clarify the ambiguously used word: "session". The new vocabulary:
- daemon — the persistent background process you attach to and detach from.
- workspace — the editor's per-project unit. Multiple workspaces are managed by the Orchestrator.
- backend — where a workspace runs (local / SSH / dev container / Kubernetes).
The cli now supports --cmd daemon, but still accepts the now-deprecated --cmd session as an alias. The new vocabulary also reaches the user-facing surfaces of the editor: the Orchestrator now lists, dives into, and manages workspaces (commands, dialogs, dock chrome, and status messages), and the replace-in-project confirmation refers to files open "in this workspace". Localized strings were updated to match in every supported locale.
Features
- New language support:
- Assembly via asm-lsp (opt-in) — GAS and NASM/Intel across x86/x86_64/ARM/RISC-V, with an offer to generate
.asm-lsp.tomlfrom the detected dialect (#1964, requested by @viti95). - Fish highlighting and auto-indentation (#2272), by @asukaminato0721.
- Smali highlighting (#2265), by @asukaminato0721.
yarn.lockand other well-known lock/config files now highlight by their real format (#2326, reported by @asukaminato0721).
- Assembly via asm-lsp (opt-in) — GAS and NASM/Intel across x86/x86_64/ARM/RISC-V, with an offer to generate
- Windows on ARM release artifacts (#784, requested by @teobugslayer; by @NihilDigit).
CancelMark/ClearMarkactions for fine-grained selection-anchor management (#2371, by @masmu).- Git Log (Current File) command, plus concurrent git-blame buffers.
Improvements
- Workspace trust & environments:
- A single trust prompt for every project — folders with a shell environment (
.envrc/mise/.tool-versions) no longer get the env-manager plugin's separate popup; the one prompt names the detected markers and activates on trust. - Environment detection is defined once in core and user-extensible (
env.detectors, now also covering pipenv and poetry); the activated environment applies uniformly across every backend — integrated terminal, Docker, Kubernetes, SSH. - Hardening: plugins can request but never grant trust; a lone
.venvno longer silently auto-trusts; venv activation uses a relativesource .venv/bin/activatesnippet to avoid shell injection (cf. CVE-2024-9287).
- A single trust prompt for every project — folders with a shell environment (
- Settings: distinct, keyboard-reachable
[Inherit]/[Reset]/[Clear]per field; the language entry dialog no longer clobbers inherited fields (#2345, reported by @ren-lv). - Orchestrator localization: the Orchestrator plugin is now fully internationalized — all 225 user-facing strings go through the editor's i18n mechanism, with translations for the 14 supported locales (cs, de, es, fr, it, ja, ko, pt-BR, ru, th, uk, vi, zh-CN, and en).
- The Orchestrator New Workspace dialog has a clearer, keyboard-linear focus model (Tab accepts the highlighted completion).
Bug Fixes
- vi-mode: delete/change/yank update the unnamed register (#2368, by @NihilDigit); the cursor moves one column left on leaving insert mode (#2349, by @ianyepan);
%jumps to the matching bracket (#2346, by @ianyepan). - Theme inspector & plugin panels (#2321):
- Opening the theme editor no longer breaks Orchestrator dock clicks/scrolling — plugin panels are scoped to their owning plugin.
- Ctrl+Right-Click reports accurate theme keys for the status bar, tab bar, scrollbar, file explorer, menus, and dock, drawing above the dock.
- The plugin bridge no longer corrupts integers larger than 32 bits (timestamps, byte offsets).
- Java (jdtls) and other Eclipse LSP4J servers: features registered via
client/registerCapabilitynow work — their string JSON-RPC ids were misparsed as notifications and dropped (#2340, reported by @maxandersen). - LSP/plugin popups follow the active theme's
popup_*colors instead of a hard-wired dark background (#2379, by @peanball). - Paste falls back to the internal clipboard and works again on Termux (#2343, reported by @nightshade427).
- npm
.cmd/.batshims resolve on Windows, so npm-installed language servers spawn (#2324, reported by @SupertigerDev). - Occurrence highlighting uses a theme-appropriate background in every shipped theme (#2312).
- Review Diff lists files inside untracked directories (#2315).
- The embedded terminal forwards the wheel as a mouse report to mouse-tracking programs, so scrolling no longer cycles their history (#2366).
- Replace toolbar: checked search options are visible in every theme (#2363).
- Alt+W and other search toggles no longer leak into the close prompt (#2359).
- Fixed a crash on a stale soft-wrap position in multi-byte text (#2320).
- Trusting a workspace with a shell or virtualenv environment (
.envrc/mise/.venv) no longer restarts the whole editor: other windows keep their running terminals, language servers, and Orchestrator dock; only the active window refreshes to pick up the new environment. - A file opened while a split is maximized — for example via an embedded
fresh <file>forwarded from a maximized terminal dock — is now revealed instead of rendering hidden behind the maximized split (which previously looked like the terminal had hung).
Internals
- Refactored the UI element rendering pipeline to make it easier to introduce alternative rendering frontends.
fresh-editor 0.4.0
0.4.0
For live updates on Fresh, follow me on X.
Features
- Review Diff, reworked: a file sidebar with per-file status, change counts, and comment badges, grouped by directory; an in-panel side-by-side view that keeps the sidebar; a multi-line comments panel, with commenting available anywhere in the diff; a watch mode (
W) that reloads the diff on save; reviewing a git stash; split/stack/auto layout toggles, a/file filter, and reworked keyboard navigation (Tab focus model, cross-filen/p). - Workspace trust & environments: a first-class, clickable
{trust}element now leads the status bar; virtualenvs activate without a prompt, shell envs get a single combined trust-and-activate prompt, and env pills in the status bar are clickable. Changing the trust level resets only the active session instead of the whole editor. - Per-session backends: each session now owns its environment, trust level, and backend (local / SSH / Kubernetes / devcontainer). Remote sessions survive a restart and reconnect when activated; restored agent sessions re-run their agent instead of coming back as a blank terminal, and the New Session dialog gained an agent-command dropdown.
- Terminal: send the selection (or current line) to the terminal (#1871, requested by @aquasync); Ctrl+Click or Ctrl+hover opens file paths from terminal output, including scrollback; the shell working directory is tracked via OSC 7.
- Configurable indentation rules per language via
[languages.<id>.indent], including VS Code-style regex rules. 14 indent-only tree-sitter grammars were replaced by these rules, shrinking the binary by ~18 MB. - GDScript language support (#2238, by @richiehowelll).
lsp_enabledmaster switch to disable all LSP features globally (#1770, requested by @XhstormR).auto_read_onlyoption to turn off automatic read-only mode for foreign files (#2048).- Occurrence highlighting toggle with configuration (#2154, by @masmu), and the current-line highlight now hides while text is selected (#2153, by @masmu).
- Clear Search action and a plugin API exposing the active search state (#2152, by @masmu).
- File Explorer slot override API for plugins: icons, status, and name color (#2241, by @Agrejus).
- '+' new-tab button in the tab bar, with a New Terminal / New File popup.
- A color-transition animation on theme switch, and a wave animation — available as a command and as an optional idle screensaver.
Improvements
- Live Diff: word-level highlighting inside changed line pairs (#1949, requested by @masapu).
- Status bar: configurable separator with dedicated theme keys; the default separator is now padding-only and the default left side leads with
{trust}. - Orchestrator dock: seamless-tab look for the active session, a hover-only overlay scrollbar, a stable session order, keyboard-navigable project dropdown, and clicking an inactive worktree opens it without an extra confirmation.
- File Explorer: natural-order filename sorting (#2073, requested by @mandolyte).
qcloses the Keyboard Shortcuts and Fresh Manual viewers (#2165).- Undoing a format-on-save or trim rewrite keeps the view in place (#2027, requested by @SolarLune).
Bug Fixes
- Windows: the TUI attaches to the parent process's stdio instead of failing in
-guibuilds (#2276, reported and fixed by @mokurin000 in #2277). - Right-side status bar elements render with configurable separators (#2088, reported and fixed by @PavelLoparev), and cursor column numbers are grapheme-correct (#2090, reported and fixed by @PavelLoparev).
- Scroll panels compute focus offsets from the render width when a scrollbar is present (#2175, by @masmu).
- Restored windows no longer show a blank editor pane from an orphaned split leaf (#2267).
- Paste reaches Settings/dialog text fields instead of the buffer behind them, and buffer pastes work again after closing the dialog (#2246).
- Tab bar scroll re-anchors after closing many tabs, keeping the surviving tab visible (#2229, reported by @dmknght).
- LSP code actions now include diagnostics context, so diagnostic-based fixes appear (#2212).
- Devcontainer CLI detection works when the CLI is installed via Bun on Windows (#2201, reported by @steve-price-immybot).
install.sh/ AURfresh-editor-binpackaging fixed (#2249, reported by @asukaminato0721; #2250, reported by @bandrefilipe).- Focusing a restored terminal tab activates terminal mode.
fresh-editor 0.3.12
0.3.12
For live updates on Fresh, follow me on X.
Features
-
Orchestrator Dock: a persistent, non-modal left-column session switcher. Alt+O toggles focus; arrows live-switch the active session. Each row shows status (working/idle), project, branch, git summary, and a PR badge. Project dropdown, card/compact view toggle, and a Manage button for the Orchestrator dialog.
-
Create SSH sessions from within the UI: You could already open a remote host from the cli, now you can do it via the Orchestrator: New dialog - it has a type selector (Local / SSH, and experimental Kubernetes / Devcontainer). Like the cli invocation - SSH attaches a full remote session:filesystem, LSP, process spawners, and a terminal on the remote host; switching retargets without a restart.
-
Kubernetes sessions (initial, experimental): connect over
kubectl execto any cluster, with a keepalive heartbeat and reconnect. -
Go to LSP Symbol: a symbol finder with live preview, a precise jump to the symbol name (line and column), source-line snippets, and preselection of the symbol under the cursor (#1886, by @PavelLoparev).
-
Terminal tab auto-naming: tabs follow the foreground process and OSC title. Setting
editor.terminal_auto_title(on by default). -
Open file from a diff: in the side-by-side and review-diff views, Enter opens the working-tree file (NEW pane) or the read-only HEAD version (OLD pane) at that line.
-
Rainbow bracket colorization for matching brackets across the viewport (#1088, by @asukaminato0721).
-
Minimal static Linux binary release artifact (musl, x86_64 and aarch64) optimized for a small binary size.
Improvements
variable.builtinsyntax category forthis/self/super(#2150, by @masmu).storage.typekeywords highlight as keywords rather than types (#2151, by @masmu).- Async clipboard paste: paste no longer blocks the editor, and a hung X11/Wayland clipboard owner should no longer freeze it (#2155, reported by @EtienneMaire37)
- Nested
freshlaunches ($EDITOR,git commit) inside Fresh's terminal open in the parent editor instead of a second editor; falls back to inline if the parent is unreachable. - Python indentation: Enter after
return/pass/raise/break/continuededents out of the block, and an extra indent level after a statement inside a block is fixed (#2192, reported by @WorldChallenge1). - Terminal scrollback survives resize,
clear, and alternate-screen programs; the scroll-back view soft-wraps long lines. - SSH remote editing is documented in
fresh --help.
Bug Fixes
- Inlay hints participate in line wrapping and horizontal scroll (#2190, reported by @TakemiSora).
- LSP capabilities: dynamic
client/registerCapabilityis now applied, andworkspace/configurationand the diagnostic / inlay-hint / semantic-token refresh capabilities are advertised, so more servers pull config and re-pull stale results. - No crash on a malformed mouse input sequence (#2234).
- Failed SSH/Kubernetes connects show their error instead of corrupting the screen.
- Fixed stuck keyboard input after using a session terminal and then opening a file (#2237, #2234).
- Fixed a client/server freeze when copying a large terminal-scrollback selection.
- File Explorer no longer re-roots the wrong window when previewing a restored session.
- Every session is archivable and deletable, including the launch session and the last window.
- The dock's working/idle indicator tracks the right session and idles when output stops.
- A worktree session in a repo with no commits reports git's real error.
- Text-input fields in dialogs focus on click (#2234).
- Diff "removed" lines no longer wrap one character per row at narrow widths, or when a language overrides the wrap column to 0 (#2177, reported by @biscuitvicious).
- LSP hover popups no longer appear while the LSP status popup is open (#2244, reported by @biscuitvicious).
editor.scroll_offsetis respected (#2162, reported and fixed by @PavelLoparev).- Windows: long paths middle-truncate, and short-name /
\\?\path differences no longer reorder the dock. - Fixed a marker-tree corruption that could drop edits to markers and highlights.
fresh-editor 0.3.10
0.3.10
A lot of work on bug fixes and polish in this release.
Improvements
- Live Grep: previews highlight all matches and center on the match in wrapped documents; keyboard nav re-reveals the selection after a wheel scroll; prompt text is readable on all themes (new
suggestion_fgtheme key) and toolbar labels readable on light themes. - The Workspace Trust prompt and the env-manager plugin's commands and status messages are now localized across all 14 supported languages (#2158).
- Session model reworked: one session per directory,
windows.jsondropped (sessions are discovered from the per-dir workspace cache), only the foreground window is materialized at startup with the rest lazy-restored, and the base session is no longer magic — it can be deleted like any other. - Orchestrator picker hides empty / single-file sessions by default, with a toggle to show them (#2137).
- The Live Grep => Quickfix (persisted) list is now a Finder dock panel instead of a bespoke buffer: Enter navigates to the match, the dock stays open when jumping, and
live_grep_export_quickfixis bound by default (#2124).
Bug Fixes
- Mouse-wheel scrolling fixed in File Explorer, Live Grep, and Git Log panels (#2119, reported by @brunnerh in #2107).
- Search highlights no longer grow over adjacent typing (#2053, reported by @mandolyte) and stale matches now clear after edits inside a match (#2133).
- Search / Replace: panel no longer gets stuck on "Searching…" with zero matches; Search and Replace in Current File now works for unnamed buffers and for files outside the workspace root (#2112).
- LSP: diagnostics now display in Markdown compose/preview mode (#2146);
workspace/configurationis answered per-server instead of with a fixed rust-analyzer blob; newly configured servers default toauto_start = true. - Diagnostics panel
q/a/rshortcuts work again instead of tripping "Editing disabled" (#2125). - Review Diff: Discard hunk now succeeds for files with an unterminated final line (#2117).
- Macro replay is now a single undo unit instead of per-char (#2062).
- Submenus align so the first item is inline with the selected parent item (#2118, reported by @RandomGHUser).
- File Explorer:
Ctrl+Oworks and keeps focus on the opened buffer. - Settings: text fields commit and advance focus on
Enter;Ctrl+Uclears the prompt. - Gutter no longer eats text width in non-compose mode when line numbers are off.
- Windows: the Microsoft Store
pwshApp Execution Alias is skipped when opening a terminal (#2077, reported by @ket000), with an opt-out flag. - Session working trees stored under the data dir are now editable.
fresh-editor 0.3.9
0.3.9
Features
Universal Search (multi-scope Live Grep)
Live Grep grows into a universal search overlay: search across multiple scopes — project files, open Buffers, and Terminals scrollback — with Word and Regex search modes (each keybindable). The overlay gets a clickable widget toolbar (focusable provider button, toggle controls), a full-width header band, and inline status shown in the overlay itself. Closed-terminal scrollback is retained so it stays searchable (#2099).
Orchestrator & git worktrees
- Attach sessions to existing git worktrees and discover them automatically (#2095).
- Multi-select bulk actions, worktree ordering, and a Show all worktrees filter toggle.
- Draggable scrollbars on the picker lists, with bulk-pane reorder.
Editor
- Move to Next / Previous Paragraph actions, including translations (#2084, contributed by @PavelLoparev; requested in #2083).
Language Support
Plugins & API
- New
getWorkingDataDir()(per-working-dir data root) andgetTerminalDir()plugin APIs. - Overlay toolbar widget APIs — clickable
Toggle/Buttoncontrols,toggleOverlayToolbarWidget, and aRow { wrap }layout that reflows toolbars across lines.
Improvements
- The dashboard no longer opens automatically on startup by default. To re-enable it, open Settings, select Plugin: dashboard, and turn on AutoOpen ("Show the dashboard automatically when Fresh starts with no real files open."). The dashboard remains available any time via the Show Dashboard command.
- Homebrew install simplified now that fresh-editor is in homebrew-core —
brew install fresh-editor, no tap step.
Bug Fixes
- Plugin
getCursorLine()now returns the real cursor line instead of0(#2076, reported by @pmburov). - Reduced serial-console lag by not repainting on non-visual plugin async events (#2100, reported by @jetpax).
- Custom theme colours no longer silently ignored for many UI fields (#2080, contributed by @flexiondotorg; reported in #2079).
PageDown/PageUpno longer overshoot on a single soft-wrapped line (#2085).- Workspace restore no longer mixes tabs from multiple projects in one window (#2056, reported by @mandolyte).
- Live Grep: Resume keeps the query and opens the selected result; overlay preview and input-box undo/redo corrected; Buffers scope finds unmodified open buffers; non-file-scope previews and read-only data-dir files fixed.
getKeybindingLabelresolves correctly for bound plugin actions.
Internal
- Major window refactor: window-scoped save/restore (
Window::from_workspace),WindowId-parameterized persistence,working_dirderived from the active window, andopen_file/LSP/watch helpers moved ontoWindow. - Orchestrator bring-up characterization tests and fixtures across persistence layouts.
- Serial-console lag benchmark/diagnostic scripts; theme-key resolver schema-drift guard.
- Internal docs excluded from the public docs build.
fresh-editor 0.3.8
0.3.8
Features / Improvements
Remote Development
- LSP over SSH now runs the language server on the remote host
Orchestrator
- The Open dialog is now scoped to the current project by default, with a visible scope toggle to reach other projects, a tabular picker, and
/to filter. - New windows open atomically with their terminal (no
[No Name]placeholder), and terminal output shows immediately.
Settings UI
A broad pass on the Settings editor: number fields now accept direct typing instead of [-]/[+] spinners; list editing gets inline [+] Add new / [x] rows, mouse support, and Del to remove; Ctrl+R resets a field to its default; the focused field's description is shown above the dialog buttons; and confirmations are required before deleting or discarding dirty edits.
Editor
- Next / Previous Window commands to cycle open windows without the Switch-Project picker (#2031).
- Move File Explorer to Other Side command, persisted to config (#1468, requested by @asukaminato0721).
- Templ (
.templ) syntax highlighting (#463, requested by @TS22082). - New
editor.confirm_quitsetting (default off) to prompt before quitting a clean session.
Plugins & API
- Built-in
editor.httpFetch(url, path)for downloading files —curlis no longer bundled. - "Install from URL" accepts direct
file://URLs.
Bug Fixes
- Quit binding overrides honored (#2030): binding
Ctrl+Qtonoop/nonenow actually disables it in every context. - Terminals: line-number gutter and current-line highlight no longer leak on terminal exit; scroll-back viewport anchors correctly;
Shift+Tabis forwarded to the child asESC[Z(#2029). - File explorer keeps keyboard focus when leaving a live terminal (#2029).
- Closed terminals no longer reappear, and buffer groups stay visible when a split closes (#2027, reported by @SolarLune).
- Git Log: selected commit stays aligned with the cursor; selection follows scrolling and row clicks.
- Adjacent tab indicators no longer double up (#1997, reported by @brunnerh).
- Theming / Live Diff: light-theme dim fixes, markdown popup body text inherits the terminal fg, and diff lines preserve syntax foreground.
- Tree-sitter
.scmquery files are included in the Nix source filter, fixing a source-build failure (#2055, reported by @melekbadreddine).
Preview work (will be enabled in next release)
Environment Managers (venv / direnv / mise)
New built-in environment-manager plugin: it detects a project's environment manager — .venv/venv, .envrc (direnv), or mise.toml/.tool-versions — and, via Env: Activate, injects that environment into every editor-spawned process (LSP, formatters, terminals, spawnProcess). Env: Use System (Deactivate) restores the system environment, and Env: Show Status reports the current state. Activation is on-demand (not automatic) and respects Workspace Trust. Adds an opt-in env status-bar element.
Workspace Trust (groundwork)
Foundational Workspace Trust support — a per-project trust level (persisted in the project state dir), a Set Workspace Trust Level command-palette control, and a workspaceTrustLevel() plugin API. The enforcement gate is off by default this release (no prompt on open; undecided folders are treated as Trusted) while the trust UX is reworked around sandboxed execution — so there is no behavior change unless you set a trust level yourself.
fresh-editor 0.3.7
0.3.7
Introduces an experimental multi-window orchestrator command (Alt+Q) - a UI that manages multiple Fresh windows side by side in a single Fresh process.
Features / Improvements
Orchestrator (early experiment)
The new orchestrator command (Alt+Q) lets one Fresh process juggle several independent windows — switch between sessions, open new ones from a project path / branch, or visit one in a separate Fresh process. This is an early experiment; expect rough edges. Please share your ideas and bug reports!
Search and Replace
Made an effort to improve the search & replace command, tackling several issues:
- All Files scope toggle + dedicated current-file command.
- Editor shortcuts (
Ctrl+Petc.) pass through the panel. - Proper empty / searching / no-results states.
- Large result sets stay responsive — incremental tree, throttled streaming, capped per-iteration work.
Git Log / Review Diff
- Performance: Per-commit diffs stream into file-backed buffers with full syntax highlighting, per-line add/delete backgrounds, working scrollbar, and
Fold by File/Fold by Hunkcommands. Now opens the famous "rewrite bun in rust" commit instantly! - Open file at commit (#1962): jump from a diff line in the review-branch detail panel to the file at that commit (read-only,
qto go back).
File Explorer
- Compact directories (#1406, thanks @Nandaleio!): a directory containing a single child directory renders inline as
com.example.name, VSCode/IntelliJ-style. On by default; toggle withfile_explorer.compact_directories. - Configurable tree indicators (#1940, reported by @MicTheSquid): expand/collapse glyphs themable via File Explorer → Tree Indicator Expanded / Collapsed in the Settings UI.
Plugins & API
git_statusbarplugin + status-bar token registration API (thanks @PavelLoparev!): show the current git branch in the status bar; plugins register their own tokens viaeditor.registerStatusBarElement. Add via Settings → Editor → Status Bar → Left / Right.tab_actionsplugin (#1844, thanks @PavelLoparev!): close all / to-the-left / to-the-right and move tabs within the current split.- Plugins can register their own config items: a new typed registration API lets plugins declare settings that appear in the Settings UI alongside built-in ones (sorted at the bottom of the category list), so users can toggle plugin behaviour from the same place as everything else. The bundled
vi_modeplugin uses it to expose an autoStart option.
Editing & Widgets
- Add Cursors to Line Ends (#1870, reported by @aquasync): places a cursor at the end of every line in the selection.
- Widget text inputs gain real selection rendering,
Shift+arrow/Ctrl+Shift+arrowextension, andCtrl+C/V/X/A— used by Search & Replace and plugin dialogs. - Floating completion popup on widget
Textinputs.
Live Diff
- Word-level underline highlights on deletion lines; similarity threshold and size caps are runtime-tunable, so large diffs render as modified lines rather than paired add/remove blocks.
Bug Fixes
init.tssetAutoOpen(false)ignored: dashboard auto-open is now driven by thereadyhook so userinit.tsruns first.
Git Log / Review Diff
- Detail panel
PageUp/PageDown(action name was wrong); scrollbar now functional on the streamed buffer.
File Explorer
- UI / navigation shortcuts (#1903):
Ctrl+Pand friends are no longer swallowed when the file explorer has focus. - Switch Project double-click (#1931, reported by @SolarLune): double-clicking a directory navigates into it instead of dismissing the dialog.
Plugins
- Plugin init scaffold (#1986, @PavelLoparev): new plugins now generate
fresh.entry(the current entry-point name) instead of stalefresh.main. - Idle CPU from git plugins (#2009, #2012):
git_statusbarandmerge_conflictno longer spawn idle subprocesses;git_statusbaris driven offwatchPath(.git/HEAD).
Editing
- Smart Home with multiple cursors: now runs for every cursor, not only the primary.
- Soft wrap at trailing space (#1363, reported by @dragonfyre13): when a trailing space would overflow the wrap column, wrap backs up one word instead of breaking mid-token.
- Horizontal scroll-to-view on long lines (#1873): the viewport now follows the cursor on long lines.
Live Diff
- Wrapped overlay backgrounds now extend across every visual row of a wrapped line.
Rendering
- Highlighter cache preserved across bulk edits (#1958): large pastes and replace-all no longer trigger a whole-file reparse.
- Phantom cursor offscreen (#1965): a buffer cursor scrolled past the viewport no longer leaves a stray block at the screen edge.
- Split separator background (#1963): separator cells now paint with
editor_bgso split borders blend with the panes. - Next / Prev Split un-maximizes (#1961): navigating to another split un-maximizes first.
- Stable cursor-position indicator (#1967):
Ln L, Col Cno longer jitters as the column count grows. - PTY terminal background now fills the render rect with the editor bg.
- Nostalgia theme (#1890, reported by @NGRIT41): terminal-pane blue now covers full pane.
- Column rulers suppressed on virtual buffers (dashboard, PTY panes, etc.).
Misc
- No more stray
.fresh/directory in your working dir (#1991): orchestrator/cross-restart state now lives underdata_dirinstead of being dropped next to your project files. - Buffer "library path" detection (#1970, reported by @FF-AntiK): only
.cargo/registryand.cargo/gitare treated as Cargo library paths — local.cargo/config.tomletc. are no longer flagged. - Julia grammar (#1852, reported by @goszlanyi): the adjoint operator (
') no longer flips the rest of the line into string mode. move_word_end/select_word_endlabels (#1878, reported by @sour-dani): translated in all locales.
fresh-editor 0.3.6
0.3.6
This version includes a major internal refactoring to support multiple windows in a single Fresh process. The work will be used to add a multi-window orchestrator in a future version.
Features
-
Go to line with selection (#1764, thanks @PavelLoparev!): New action extends the selection from cursor to target line. Supports absolute and relative (
+10) jumps. -
File explorer "follow active buffer" (#1569, #1803, thanks @ko3n1g!): New
file_explorer.follow_active_buffersetting (default off). When on, switching tabs expands and highlights the corresponding file without stealing focus. -
Live Diff: Near-identical lines now render as modified lines, with new words decorated as underline (instead of two separate add/remove rows). Deletion virtual lines get gutter markers. Fixed live diff colors in
terminaltheme. -
Auto-start
vi_mode(#1086, reported by @jmcblane): Vi mode plugin now exposestoggle / enable / disablesoinit.tscan flip vi mode at startup. Add this to yourinit.tsto enable:editor.getPluginApi("vi-mode")?.enable();.
In the future I plan to add a way for plugins to register custom config sections in the Settings UI, and then enabling vi-mode auto-start will be available through the UI.
Improvements
-
openSUSE install instructions (#1897, thanks @ilmanzo!) added to the README.
-
Quick Open ranking: Matches at the start of a path segment now beat arbitrary substring hits —
tssurfacestsconfig.jsonandtsc/...before random.tsfiles. -
Search & Replace no longer freezes on result sets in the thousands.
-
Rust code actions (#1915):
rust-analyzernow returnsWorkspaceEdit-based assists like "Fill struct fields" instead of "No code actions available" — Fresh wasn't advertising the capability. -
Status-bar indicator menus: Clicking another indicator's icon dismisses the currently-open menu instead of stacking a second one on top.
-
LSP-Servers popup is extensible: Plugins (starting with the bundled
rust-lsp) can contribute their own rows. -
terminalbuilt-in theme (#1914): Diff backgrounds no longer collide with syntax foregrounds, so keywords on deletion lines and strings on addition lines stay readable on terminals (e.g. xfce-terminal) where each ANSI palette index renders identically for fg and bg. -
Dashboard matches the editor background and no longer slides in.
-
AppImage install script has error handling and a
/tmpfallback so it no longer silently fails when the target directory isn't writable.
Bug Fixes
-
Crash on startup from a corrupt workspace (#1939, reported by @zdooder): Restoring a session whose persisted split pointed at a buffer no longer in the buffer map crashed in
render.rs. The active-buffer pointer is now validated and falls back to a live buffer if it's stale. -
Completion popup + multicursor (#1901, reported by @dtwilliamson): Typing a word character or
Backspacewhile the popup was open only edited the primary cursor — secondary cursors silently went out of sync after the first keystroke. Accepting a completion now also applies at every cursor. -
LSP indicator click (#1941): Bugs fixed: plugin popup stacked under the built-in one; plugin popup ignored the active theme's
popup_bg; state stayed stale after the LSP process was killed externally; "Disable LSP" didn't actually stop the running server; repeated clicks stacked further popups. -
Scrollbar theme overrides (#1554, reported by @klonuo): User themes setting
ui.scrollbar_track_fg,ui.scrollbar_track_hover_fg, orui.scrollbar_thumb_hover_fghad their overrides silently dropped. -
Utility dock routing (#1932):
Ctrl+P→ filename now opens the file in the editor area instead of inside the bottom dock when the dock has focus. The split tab-bar□button now maximizes the split you clicked, not the active one. -
Tab drag: Dropping a tab onto a fresh split (e.g. a Search & Replace result row) no longer panics on the next keystroke.
-
File explorer: A directory whose
.gitignorefilters out all its contents (e.g.build/with*inside) stays visible when expanded. -
Live Diff visual-line motion:
Down/Upno longer freezes when traversing a deletion block that starts with a blank line. -
S-Tabplugin bindings now register correctly (terminals deliver Shift+Tab asBackTab).
fresh-editor 0.3.5
0.3.5
Improvements
- Live Grep overlay polish: Surrounding editor is now visibly dimmed; shortcut hints and the active provider moved into a toolbar row with plainer labels; match cap raised from 100 to 1000 (with a
1000+ matchesindicator); provider errors render as a disabled result entry instead of a silent "0 matches";ripgrepprovider renamed torg.
Bug Fixes
-
Live Grep on Windows returned no results:
git grepoutputs\r\n; splitting on\nleft a trailing\rthat broke the result regex. Split on\r?\ninstead. -
Plain
grepprovider was broken:--columnis a ripgrep-only flag and was being passed unconditionally. Removed.
Under the Hood
- Plugin API:
setPromptTitletakes styled segments ({ text, style? }[]) instead of a single string, so plugins control hint colouring directly instead of the renderer guessing structure from punctuation.
fresh-editor 0.3.4
0.3.4
Features
-
Smaller release binaries: (#1860, contributed by @PanAchy) Updated release profile (
lto=fat,codegen-units=1,opt-level=z) shrinks binary size before stripping from 62 MB to 46 MB (-26%). Backtraces are still included in panics. -
Live Grep floating overlay + Utility Dock (#1796): Live Grep now opens as a centered floating overlay with results on the left and a real-buffer file preview on the right (full syntax highlighting, gutter, soft-wrap).
Escreturns you to your prior layout exactly. Resume (Alt+r) reopens the last query with cached results. Export to Quickfix (Alt+M) sends results into a dockable list. -
New Utility Dock at the workspace root hosts the terminal (
Alt+`), Quickfix, Diagnostics, and Find References — they share one pane spanning the full width instead of nesting under whichever split was focused. -
Pluggable Live Grep providers: Built-in chain is now ripgrep → git-grep (default in repos) → grep, with
ag/ackavailable via plugin registration.Alt+Pcycles to the next available provider; the active one shows in the overlay's title bar. Plugins can register custom backends viaeditor.getPluginApi("live-grep"). -
Settings tree-view: The left category list is now an expandable tree — categories with multiple sections show chevrons, expanding reveals jumpable section rows, and the tree cursor follows scrolling so you can see where you are in the body. Section jumps snap to the top of the section. Toggle controls render as a chip-style
[ ✓ ACTIVE ]indicator. -
HDL language support (#1528, reported by @bqinTT): Syntax highlighting for Verilog (
.vleft mapped to vlang for compatibility,.vh/.verilog), SystemVerilog (.sv/.svh/.svi/.svp), and VHDL (.vhd/.vhdl/.vho).svlswired as the default LSP for Verilog/SystemVerilog (opt-in per project). -
New
terminalbuilt-in theme (#1457, #1798, reported by @AmethystGosling169 and @BrettKinny): Colors come from your terminal's own palette instead of hard-coded RGB — backgrounds useDefaultso transparency and your terminal's background show through; accents use ANSI named colors that remap to whatever your terminal colorscheme defines. Selection uses reverse-video so it inverts whatever colors are already on screen. -
Theme inheritance with
extends: User themes can nowextends: "builtin://light"(ordark/high-contrast/nostalgia/terminal) and layer overrides on top — the same model VSCode/Helix/Sublime/Zed use. With noextends, an expliciteditor.bgtriggers luminance-based auto-inference (bright bg → light base, dim → dark), so partial light themes no longer end up with dark UI chrome (#1281, reported by @nico2004444). -
File explorer context-menu additions (#1576, reported by @RandomGHUser): Duplicate (creates
name copy[.ext]next to the source, multi-select supported), Copy Full Path and Copy Relative Path (newline-joined for multi-select). The new entries don't appear on the project root. -
Distribute clipboard across cursors (#1057, reported by @graphixillusion): With N cursors and an N-line clipboard, paste now gives each cursor one line in top-to-bottom order — VSCode / Notepad++ "column-mode paste" semantics. A block-selected copy/paste round-trip preserves its rectangular shape. Behavior is unchanged when counts don't match.
-
Discard option in quit prompt (#1839, reported by @turkishmaid): With
hot_exiton (the default), the unsaved-changes prompt now offers "(d)iscard and quit" so accidental edits no longer require disabling hot_exit globally to throw away. Picking "save" on quit also chains a Save As prompt for each dirty unnamed buffer instead of silently dropping it. -
Project name in window title (#1793, reported by @dAnjou): Title is now
<file> — <project> — Freshso multiple Fresh sessions in different projects are distinguishable in your taskbar/window list. -
Cursor-jump animation toggle (#1788): New
editor.cursor_jump_animationsetting lets you keep ambient animations (tab slides, dashboard) while disabling just the cursor-jump trail. The mastereditor.animationssetting still wins.
Improvements
-
Search & Replace across project no longer hangs on large binary files (#1342, reported by @dragonfyre13): Hardcoded extension fast-path skips known-binary files (compiled artifacts, archives, media, ML weights, fonts) before any I/O. Per-file size cap and stronger header sniff (PNG, ZIP-based archives like
.pth, ELF) catch the formats whose first bytes can look text-like. -
POSIX ACL writability (#1765, reported by @cherouize): A file granted write access via
setfacl -m u:NAME:rwis no longer reported read-only — Fresh now asks the kernel viafaccessat(W_OK)instead of walking inode mode bits, so ACLs, capabilities, and read-only mounts are all honored. -
LSP status popup doesn't auto-show: Auto-popping on first file open stole focus and swallowed keystrokes for users who hadn't asked to enable LSP. The
LSPindicator is now a manual click target; itsOffstate (configured but not running) is rendered with a more prominent attention-grabbing color so discoverability isn't lost. -
Hover popup no longer flickers on mouse moves (#692) inside the editor (gutter, end-of-line, between words). It only dismisses when the mouse leaves the editor area entirely. New hover responses replace the existing popup instead of stacking.
-
Multi-cursor
Ctrl-Dafter substring search (#1697, reported by @dtwilliamson): When the cursor is inside an active search match, "Add cursor at next match" selects the next search match instead of expanding to the surrounding word. -
JavaScript syntax highlighting (#899, reported by @comesuccingfuccsloot): Routed through tree-sitter, so template literals containing arrow functions or
${expr}no longer leak@stringstyling across the rest of the file. -
Smarter auto-indent for Lua / Ruby / Bash / Pascal: Tree-sitter
indents.scmis now the single source of truth for keyword-delimited languages, so(opening a function call no longer gets treated as a block-opening delimiter. -
Enter at column 0 doesn't push the line right anymore (#1425, reported by @goszlanyi): Auto-indent now detects "cursor at column 0 of a non-empty line" and inserts a bare newline. Closing-delimiter lines still get the established indent-before-close behavior.
-
Live Diff virtual lines soft-wrap (#1787) instead of being truncated at the right edge.
-
Per-workspace hot-exit recovery (#1550, reported by @goszlanyi): Standalone-mode recovery files are now scoped per working directory. Quitting Fresh in folder B no longer wipes folder A's recovered unnamed-buffer state.
-
Terminal PTY resyncs on tab reveal (#1795): Resizing the host while a terminal was hidden behind another tab now correctly forwards
SIGWINCHwhen you switch back —$COLUMNS/stty sizestay accurate. -
Open File dialog scrolls correctly on small terminals (#245): Selection no longer slides past the bottom of the visible list.
-
Keybinding editor scrollbar responds to mouse (#1593, reported by @Kodiak-01): Click and drag both work; wheel scrolls the viewport instead of moving the selection (so a scrollbar drag isn't undone by the next wheel tick).
-
Settings Number controls (#1825, e.g. Tab Size): Tab now commits and exits the input; clicking the value cell enters edit mode (matches Enter).
-
Plugin keybinding labels refresh on every prompt open so plugins surfacing key hints ("
Alt+Pto cycle", overlay headers, etc.) reflect mid-session rebinds without restart. -
New plugin hook
after_file_explorer_changefires on FS-mutating explorer actions (Duplicate, Paste, New File, Rename, Delete) so plugins like git_explorer can refresh badges immediately. -
Theme picker consistency: The Theme Editor plugin's picker now shows the same set of themes as the native
Select Themeprompt — no more divergence from a separatecwd/themesscan or normalization mismatches. New plugin APIeditor.getAllThemes()returns the cached map directly so plugins can drop their own filesystem walks.
Bug Fixes
-
Crash fixes:
Option::unwrap()panic when pasting in the Theme Editor (event apply used the wrong split).DeleteBackwardpanics on stale cursor state in vi-mode count prefixes and plugin action batches. Theme editor crash on the newterminaltheme's modifier fields. Embedded-plugin extraction race across concurrent test processes. -
Search (#1537, reported by @pstahle):
Find Selection Next/Previouson a non-word character (e.g.}after goto-matching-bracket) no longer hijacks the search query — it now navigates the existing search instead. -
OpenLine (Emacs
C-o): Cursor stays on the original line instead of advancing — was previously indistinguishable from Enter. -
Markdown compose (#1789, #1790): Wrap budget widened by one column to prevent orphan-word re-wrapping on Windows; current-line highlight now extends across soft-wrapped sub-rows.
-
Viewport (#1794): Popup anchoring counts true visual rows under wrap, so completion popups appear next to the cursor instead of several rows above in heavily-wrapped buffers.
Under the Hood
-
Build performance:
oxcandrquickjsnow build atopt-level=3in dev/test profiles to keep iteration fast despite their size. -
Semantic test framework + ~250 migrated cases: A new "scenario" test layer dispatches
Actions straight against an isolated editor instance, skipping plugin loading where the assertion surface (buffer text + caret) can't observe it — about 440 ms saved per test harness. ~250 e2e claims have been migrated across multicursor, block selection, auto-indent, paste, undo/redo, search-modal flows, m...