Fresh
Zero-config terminal IDE in Rust with familiar keybindings, mouse support, and built-in LSP.
Official WebsiteFeatures
Installation
brew install fresh-editorcargo install --locked fresh-editornpm install -g @fresh-editor/fresh-editorwinget install fresh-editorWhy Use Fresh?
Fresh is a terminal editor written in Rust that aims to bring the UX of a modern GUI editor into the terminal. It ships with the keybindings you already know, mouse support, and IDE features like LSP and git review enabled out of the box — there is no config file to write before you can be productive.
Zero Configuration
Syntax highlighting, completion, and sensible defaults work on first launch. Configure later only if you want to.
Built-in LSP
Go to definition, find references, hover, rename, code actions, diagnostics, and autocompletion — no plugin setup needed.
Magit-Style Git Review
Stage, unstage, and discard individual hunks, browse git log with live diff preview, and read blame history without leaving the editor.
Integrated Terminal
Terminals live in tabs and splits alongside buffers, with persistent scrollback for long-running commands.
Installation
# macOS (Homebrew)
brew install fresh-editor
# Linux (universal installer, self-updating, no root required)
curl -fsSL https://raw.githubusercontent.com/sinelaw/fresh/refs/heads/master/scripts/install.sh | sh
# Arch Linux (AUR)
yay -S fresh-editor-bin
# Windows (winget)
winget install fresh-editor
# Rust toolchain (Cargo)
cargo install --locked fresh-editor
# npm
npm install -g @fresh-editor/fresh-editor
# Try it without installing
npx @fresh-editor/fresh-editor
# Check version
fresh --versionDebian/Ubuntu .deb, Fedora/RHEL .rpm, Nix, and pre-built binaries for Linux, macOS, Windows, and FreeBSD are published on GitHub Releases.
Basic Usage
# Open an empty buffer
fresh
# Open a file
fresh src/main.rs
# Open at a specific line
fresh src/main.rs:42
# Open at a specific line and column
fresh src/main.rs:42:10
# Open multiple files at once
fresh Cargo.toml src/lib.rs:100:5
# Edit a file on a remote host over SSH
fresh user@host:/path/to/file.txt
# Open a remote directory as a workspace
fresh user@host:~/projects
# Skip the daily update check
fresh --no-upgrade-checkCommand Palette
Ctrl+P opens the command palette, which is the main entry point to everything in Fresh. A prefix character switches between modes, and a hints line at the bottom reminds you which prefixes are available.
| Prefix | Mode | Description |
|---|---|---|
(none) | File finder | Fuzzy search for files in the project |
> | Commands | Search and run editor commands |
# | Buffers | Switch between open buffers by name |
: | Go to line | Jump to a line number, with live preview as you type |
- •Search terms are space separated and match independently across the path, so
etc hostsfinds/etc/hosts. - •Append
:line[:col]to a filename to open it at that position. - •Start the filter with
.to reveal hidden dotfiles. - •Press
Tabto accept the top suggestion.
Frequently Used Keybindings
Fresh uses the same shortcuts as mainstream GUI editors, so most of these need no learning. Run Show Keyboard Shortcuts or the Keybinding Editor from the command palette for the authoritative list on your platform.
Editing
| Key | Description |
|---|---|
Ctrl+S | Save |
Ctrl+C / Ctrl+X / Ctrl+V | Copy / Cut / Paste |
Ctrl+Z / Ctrl+Y | Undo / Redo |
Tab / Shift+Tab | Indent / Dedent |
Ctrl+/ | Toggle comment |
Ctrl+T | Transpose characters |
Alt+U / Alt+L | Convert selection to uppercase / lowercase |
Deletion
| Key | Description |
|---|---|
Backspace / Del | Delete backward / forward |
Ctrl+Backspace / Ctrl+Del | Delete word backward / forward |
Ctrl+K | Delete to end of line |
Multiple Cursors and Block Selection
| Key | Description |
|---|---|
Ctrl+D | Add cursor at next occurrence |
Ctrl+Alt+Up / Down | Add cursor above / below |
Esc | Remove secondary cursors |
Alt+Shift+Up / Down | Block select up / down |
Alt+Shift+Left / Right | Block select left / right |
Navigation
| Key | Description |
|---|---|
Ctrl+P | Command palette / file finder |
Ctrl+O | Quick open (jump to a file) |
Alt+Left / Alt+Right | Move back / forward through edit locations |
Macros and Bookmarks
| Key | Description |
|---|---|
F5 | Stop macro recording |
F4 | Play last recorded macro |
Ctrl+Shift+0-9 | Set bookmark |
Alt+0-9 | Jump to bookmark |
Git Integration
Fresh treats git review as a first-class editor feature rather than a plugin. Open these from the command palette with the > prefix.
Review Diff
A unified buffer of working-tree changes where you can stage, unstage, or discard individual hunks. Arbitrary commit ranges and stash entries can be reviewed the same way.
Git Log
Commit history with live preview: selecting a commit shows its diff in a side panel. A PR variant lists only commits on the current branch against a base ref.
Git Blame
Magit-style blame annotations that let you walk a line backward through parent commits while holding your position on screen.
Live Diff
Changed lines are marked in the gutter against HEAD, disk, or a branch ref, with word-level highlighting for small edits.
Diff and Blame Panel Keys
| Key | Description |
|---|---|
n / p | Jump to next / previous hunk |
b | Re-blame at the parent commit |
q | Step back one hop in blame history |
Esc | Dismiss the blame panel |
Configuration
Fresh runs fine with no config at all. When you do want to change something, settings live in JSONC (JSON with comments and trailing commas) and cascade through layers: system defaults, then user, then project, then session.
| Layer | Path |
|---|---|
| User | ~/.config/fresh/config.json (Windows: %APPDATA%\fresh\config.json) |
| Project | .fresh/config.json in the project root |
| Session | .fresh/session.json (current run only) |
{
"version": 1,
"theme": "builtin://dracula",
"editor": {
"tab_size": 4,
"line_numbers": true,
"line_wrap": false
}
}Customize Keybindings
Bindings are declared in the same config file. A binding can also be a sequence of key presses rather than a single combination, which is how the emacs keymap expresses C-x C-s for save.
{
"keybindings": [
{
"key": "s",
"modifiers": ["ctrl"],
"action": "save",
"when": "normal"
}
]
}You can also edit settings and keybindings interactively: open Edit → Settings... or run the Keybinding Editor from the command palette, which lists, rebinds, and disables existing bindings without touching the file by hand.
Plugins and Advanced Features
TypeScript Plugins
Plugins are written in TypeScript and run in a sandboxed QuickJS runtime. Built-ins include a color highlighter, TODO highlighter, merge conflict helper, path completion, and alternative keymaps.
Startup Script
An init.ts file runs at startup for setup that static JSON cannot express, such as environment-dependent configuration.
Orchestrator
One workspace per git worktree, each with its own terminals and long-running commands, so parallel branches of work stay separated.
Remote and Daemon Modes
Edit over SSH with user@host:path syntax, and run Fresh as a detachable daemon so sessions survive a disconnect.
Tips
- •When in doubt, press
Ctrl+Pand type>. Almost every feature is reachable from there. - •Run
Show Keyboard Shortcutsfrom the command palette instead of memorizing a list — it reflects your platform and any rebinding. - •Coming from Vim? Enable the vim keymap plugin to keep modal editing while retaining the IDE features.
- •Large files are opened without blocking the UI. The gutter shows byte offsets, so use go to line when you need exact line numbers.
- •Commit a
.fresh/config.jsonto share tab size, theme, and LSP settings across a team without overriding personal settings. - •Fresh checks for updates daily and sends anonymous telemetry (version, OS/architecture, terminal type). Disable it with
--no-upgrade-checkor in the config file.