Terminal GuideTerminal Guide
fresh icon

Fresh

Text Editors•
macOSLinuxWindows
•Rust

Zero-config terminal IDE in Rust with familiar keybindings, mouse support, and built-in LSP.

Official Website

Features

Zero ConfigurationFamiliar KeybindingsBuilt-in LSPMulti-CursorIntegrated TerminalGit Review

Installation

Homebrew
brew install fresh-editor
Cargo (Rust)
cargo install --locked fresh-editor
npm
npm install -g @fresh-editor/fresh-editor
winget
winget install fresh-editor

Why 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

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 --version

Debian/Ubuntu .deb, Fedora/RHEL .rpm, Nix, and pre-built binaries for Linux, macOS, Windows, and FreeBSD are published on GitHub Releases.

Basic Usage

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-check

Command 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.

PrefixModeDescription
(none)File finderFuzzy search for files in the project
>CommandsSearch and run editor commands
#BuffersSwitch between open buffers by name
:Go to lineJump to a line number, with live preview as you type
  • •Search terms are space separated and match independently across the path, so etc hosts finds /etc/hosts.
  • •Append :line[:col] to a filename to open it at that position.
  • •Start the filter with . to reveal hidden dotfiles.
  • •Press Tab to 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

KeyDescription
Ctrl+SSave
Ctrl+C / Ctrl+X / Ctrl+VCopy / Cut / Paste
Ctrl+Z / Ctrl+YUndo / Redo
Tab / Shift+TabIndent / Dedent
Ctrl+/Toggle comment
Ctrl+TTranspose characters
Alt+U / Alt+LConvert selection to uppercase / lowercase

Deletion

KeyDescription
Backspace / DelDelete backward / forward
Ctrl+Backspace / Ctrl+DelDelete word backward / forward
Ctrl+KDelete to end of line

Multiple Cursors and Block Selection

KeyDescription
Ctrl+DAdd cursor at next occurrence
Ctrl+Alt+Up / DownAdd cursor above / below
EscRemove secondary cursors
Alt+Shift+Up / DownBlock select up / down
Alt+Shift+Left / RightBlock select left / right

Navigation

KeyDescription
Ctrl+PCommand palette / file finder
Ctrl+OQuick open (jump to a file)
Alt+Left / Alt+RightMove back / forward through edit locations

Macros and Bookmarks

KeyDescription
F5Stop macro recording
F4Play last recorded macro
Ctrl+Shift+0-9Set bookmark
Alt+0-9Jump 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

KeyDescription
n / pJump to next / previous hunk
bRe-blame at the parent commit
qStep back one hop in blame history
EscDismiss 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.

LayerPath
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)
~/.config/fresh/config.json
{
  "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.

~/.config/fresh/config.json
{
  "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+P and type >. Almost every feature is reachable from there.
  • •Run Show Keyboard Shortcuts from 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.json to 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-check or in the config file.
Written by Dai AokiPublished: 2026-09-18

Related Articles

Explore More