ebba is a minimal terminal editor.
Ebba is inspired by all the things i like about all sorts of different editors: fresh, ne, nano, edit, eb, notepad etc. It is a minimal implementation of a terminal style editor with modern navigation and clipboard-style shortcuts.
- Line select mode:
ctrl+c/v/x/awithout selecting copies the whole line. - Standard select:
shift+arrows, `ctrl+c/v/x/a etc. Select-mode-F3/Ctrl+space/Alt+s, toggles on/off,arrowsselect,ctrl+c/v/xworks as usual.- Terminal copy/paste:
ctrl+shift+c/v
- Arrow key/pgup/pgdn/home/end navigation.
- Line-wrap, with up/down-navigation.
- Mandatory line numbering.
- Multiple keybindings for each function for compatibility.
- Multi-line tab indentation:
selectthentab. - Multiple keybindings for exiting.
- Hotkey for showing invisible characters and line endings.
- Read only hex mode fallback for binary files.
- Cut/copy-guard. Repeated cut/copy requires extra keypress.
- No dialogs. Will not exit (except force-quit) with unsaved changes.
- Condensed help always visible on startup,
ctrl+h/F1for full.
- Background: Dark gray/Light gray(inverted)/Black/Blue.
- Text: Default/Green/Amber (Light gray background is black text only).
./inst.shcargo build --releaseBinary path:
target/release/ebba
cargo install --path .inst.sh currently runs cargo install --path . for user install, then sudo-copies target/release/ebba to /usr/local/bin/ebba for all users (mostly for sudo), and does optional gb integration if available.
.\inst.ps1inst.ps1 installs with cargo install --path . and ensures the user Cargo bin directory is present in the user PATH.
ebba FILE [OPTIONS]Example:
ebba README.md -w 80 -c -iFILE
Path to the file to open.-e, --encoding <ENCODING>Save encoding override:utf-8,utf-8-bom,utf-16le-bom,utf-16be-bom.-l, --line-ending <lf|cr|crlf>Force line endings on save (otherwise preserve mode).-t, --textForce text startup mode.-b, --binaryForce binary fallback mode (read-only hex view).-w, --wrap [COLUMN]Enable wrapping; optional fixed wrap column (for example--wrap 80). WithoutCOLUMN, wrap uses the available text width in the viewport.-c, --centerCenter wrapped text after the gutter and enable wrapping. With bare--center(or--wrap --center), ebba auto-selects a wrap width from the longest line (capped at 140). For empty files it falls back to viewport width (capped at 120), and the final width is clamped to the available viewport text width.-i, --invisiblesShow invisible characters (space·, LF␊, CR␍, CRLF␍␊).-C, --config <PATH>Load YAML config from explicit path.-k, --keymap <auto|mac|linux|linux-console|windows>Force keybinding profile at startup (useful for cross-platform keymap testing).
--text and --binary are mutually exclusive.
- Navigation & rendering:
\n,\r\n, and bare\r(old Mac-style) are all treated as line breaks for cursor movement, selection, indent/outdent, and rendering — including files with mixed endings. The underlying bytes are left untouched (see Preserve below), so this only affects how the buffer is navigated/displayed, not what's stored. - Typing/paste normalization: whenever text you type (
Enter) or paste contains a newline, it is rewritten to match the file's own dominant line ending before insertion. Pasting\n-terminated text into a CRLF file produces\r\n; pasting terminal-supplied bare\r(a known quirk of some terminals, e.g. Windows Terminal under WSL) into an LF file produces\n. This keeps a consistently-ended file from becoming mixed by a paste. - Status bar indicator: shows
LF,CRLF,CR, orMIXED, recomputed live from the current buffer content (not just a snapshot from when the file was opened), so it always reflects the real state of the document as you edit. - Save modes (
-l, --line-ending <lf|cr|crlf>ordefault_line_endingin config):- Default is Preserve: bytes are saved exactly as they are in the buffer.
lf/cr/crlfforces the whole buffer onto that convention immediately on load (not only at save time), converting any\r\n/bare\r/\naccordingly, so the in-editor buffer and status indicator match the forced mode right away; saving simply persists that already-normalized content.
Default auto-load path is ~/.config/ebba/config.yaml on all platforms.
On Windows, if that file does not exist, ebba falls back to %APPDATA%\ebba\config.yaml.
- Save:
Ctrl+S - Help:
Ctrl+H,Alt+H - Quit:
Ctrl+Q,Alt+Q,F10 - Force quit:
Ctrl+Alt+Q,Alt+Shift+Q,Ctrl+Shift+Q,Ctrl+G,F12 - Copy/Cut/Paste:
Ctrl+C,Ctrl+X,Ctrl+V - Terminal clipboard copy/paste:
Ctrl+Shift+C,Ctrl+Shift+V - Select all:
Ctrl+A - Toggle selection mode:
F3,Ctrl+Space - Undo/Redo:
Ctrl+Z,Ctrl+Y,Ctrl+Shift+Z - Word move:
Ctrl+←,Ctrl+→ - Line move:
Home,End - Document move:
Ctrl+Home,Ctrl+End - Delete previous word:
Ctrl+Backspace - Delete to line start:
Ctrl+U - Toggle BOM:
Ctrl+B,Alt+B,Ctrl+Shift+B - Toggle tab width (2 → 4 → 8):
Ctrl+T - Toggle wrap:
Ctrl+W - Toggle invisibles:
Ctrl+K,Alt+I
Auto-selected on Linux virtual consoles (TERM=linux).
Adds function-key fallbacks and avoids desktop-terminal-specific assumptions.
- Save:
F2,Ctrl+S - Help:
F1,Alt+H(Ctrl+His terminal-dependent in Linux console) - Quit:
F10,Ctrl+Q - Force quit:
F12,Ctrl+Alt+Q,Ctrl+Shift+Q,Ctrl+G - Copy/Cut/Paste:
Ctrl+C,Ctrl+X,Ctrl+V Ctrl+C/Ctrl+Xon a caret (no selection) copies/cuts the whole current line- Select all:
Ctrl+A - Toggle selection mode:
F3,Ctrl+Space(while on, move keys extend selection) - Undo/Redo:
Ctrl+Z,Ctrl+Y,Ctrl+Shift+Z - Word move:
Ctrl+←,Ctrl+→ - Line move:
Home,End - Document move:
Ctrl+Home,Ctrl+End - Delete previous word:
Ctrl+Backspace - Delete to line start:
Ctrl+U - Toggle BOM:
Ctrl+B - Toggle tab width (2 → 4 → 8):
Ctrl+T - Toggle wrap:
Ctrl+W - Toggle invisibles:
Ctrl+K
Targeted for modern VT-capable terminals (for example Windows Terminal).
Terminal-level copy/paste (Ctrl+Shift+C/V) depends on terminal settings.
- Save:
Ctrl+S - Help:
F1,Ctrl+H - Quit:
Ctrl+Q,F10 - Force quit:
Ctrl+Alt+Q,Ctrl+Shift+Q,Ctrl+G,F12 - Copy/Cut/Paste:
Ctrl+C,Ctrl+X,Ctrl+V - Terminal clipboard copy/paste:
Ctrl+Shift+C,Ctrl+Shift+V - Select all:
Ctrl+A - Toggle selection mode:
F3,Ctrl+Space - Undo/Redo:
Ctrl+Z,Ctrl+Y,Ctrl+Shift+Z - Word move:
Ctrl+←,Ctrl+→ - Line move:
Home,End - Document move:
Ctrl+Home,Ctrl+End - Delete previous word:
Ctrl+Backspace - Delete to line start:
Ctrl+U - Toggle BOM:
Ctrl+B - Toggle tab width (2 → 4 → 8):
Ctrl+T - Toggle wrap:
Ctrl+W - Toggle invisibles:
Ctrl+K
ebba auto-detects macOS and switches to a macOS-oriented profile.
Terminal apps on macOS may intercept some ⌘ keys before ebba receives them. Control fallbacks remain available for all core actions.
- Save:
⌘S, fallbackCtrl+S - Help:
⇧⌘?, fallbackCtrl+H - Quit:
⌘Q, fallbackCtrl+Q,F10 - Force quit:
Ctrl+Alt+Q,Ctrl+Shift+Q,Ctrl+G,F12 - Copy/Cut/Paste:
⌘C,⌘X,⌘V(plusCtrl+C/X/V) - Select all:
⌘A(plusCtrl+A) - Toggle selection mode:
F3,Ctrl+Space(terminal-dependent on macOS) - Undo/Redo:
⌘Z,⇧⌘Z(plusCtrl+Y) - Word move:
⌥←,⌥→(plusCtrl+←,Ctrl+→) - Line move:
⌘←,⌘→ - Document move:
⌘↑,⌘↓(plusCtrl+Home,Ctrl+End) - Delete previous word:
⌥Backspace(plusCtrl+Backspace) - Delete to line start:
⌘Backspace(plusCtrl+U) - Editor toggles (editor-specific):
Ctrl+BBOM,Ctrl+Ttab width,Ctrl+Wwrap,Ctrl+Kinvisibles
- Insert newline:
Enter - Backspace:
Backspace - Delete forward:
Delete(fn+Backspaceon many Mac keyboards) - Insert tab / indent selection:
Tab - Outdent selection:
Shift+Tab - Extend selection: add
Shiftto movement keys (arrows, page keys, word/document jumps) - Linux console fallback: toggle selection mode with
Ctrl+Space, then move with arrows/page/home/end
- Opened via binary detection or
--binary. - Read-only.
- Scroll uses:
↑,↓,PageUp,PageDown,Home,End. - Quit also accepts plain
q/Qin addition to global quit keys.
GPL-2.0-only. See LICENSE.