Instant startup over SSH. No config files. Just works.
Emacs keybindings, mg-like lightness. For those who don't want to learn vim, but find nano lacking.
- You want comfortable editing over SSH without configuration
- Emacs keybindings are in your muscle memory
- You prefer composing with Unix tools (sort, jq, sed)
- You're tired of managing dotfiles
- You need IDE features like completion or LSP
- You want to customize everything
- You prefer vim's modal editing
- Under 500KB — No dependencies, single binary
- Zero-config — No dotfiles, just copy and use
- Emacs-style editing — Multi-buffer, window splitting, kill ring
- Shell integration — Pipe to sort, jq, awk directly
- Full UTF-8 support — Japanese, emoji, grapheme clusters
- Linux (x86_64, aarch64)
- macOS (Intel, Apple Silicon)
- WSL2
brew tap sanohiro/ze
brew install zeDownload from Releases and place in your PATH.
# Requires Zig 0.15+
zig build -Doptimize=ReleaseFast
cp ./zig-out/bin/ze ~/.local/bin/ze file.txt # Open a file
ze -R file.txt # View file (read-only)
ze # Start with empty bufferSave and quit: C-x C-s → C-x C-c
ze follows the Unix philosophy: "Text is a stream."
Advanced text processing is delegated to existing tools like sort, jq, awk, sed. ze acts as the pipeline connecting these tools to your buffer. No reinventing the wheel.
M-| executes shell commands, piping selection or buffer content.
[source] | command [destination]
| Source | Input |
|---|---|
| (none) | Selection |
% |
Entire buffer |
. |
Current line |
| Destination | Output |
|---|---|
| (none) | Display in command buffer |
> |
Replace source (insert at cursor if no selection) |
+> |
Insert at cursor |
n> |
New buffer |
| date +> # Insert date at cursor
| sort > # Sort selection and replace
% | jq . > # Format entire JSON buffer
. | sh > # Execute current line as shell
% | grep TODO n> # Extract TODO lines to new buffer
| upper > # Convert selection to uppercase (with alias)
| lower > # Convert selection to lowercase (with alias)C-g cancels at any time. Long-running processes (LLM calls, etc.) are fine.
Prefix history matching: Type part of a command, then press ↑/↓ to cycle through matching history only.
| git # Press ↑
| git push origin main # Only "git" commands shown
| git commit -m "fix" # Press ↑ again
Tab completion: Press Tab to complete commands and file paths (uses bash's compgen).
| gi<Tab> → git
| cat /tmp/<Tab> → shows files in /tmp/
Create ~/.ze/aliases to define shortcuts for common operations:
alias upper='tr a-z A-Z'
alias lower='tr A-Z a-z'
alias trim='sed "s/^[[:space:]]*//;s/[[:space:]]*$//"'
alias uniq='sort | uniq'When this file exists and bash is available, ze automatically loads your aliases.
Not familiar with Unix text tools? Check out:
- awesome-text-tools — Curated list of text processing tools
- txtk — Simple text toolkit for common operations (includes Japanese text handling)
ze uses Emacs-style keybindings. C- means Ctrl, M- means Alt/Option.
| Key | Action |
|---|---|
C-f / C-b / C-n / C-p |
Move cursor |
C-s / C-r |
Search forward/backward |
M-% |
Query replace |
M-| |
Shell command |
C-Space |
Start selection |
C-w / M-w / C-y |
Cut/copy/paste |
C-x 2 / C-x 3 |
Split window (horizontal/vertical) |
C-x b |
Switch buffer |
C-x C-s |
Save |
C-x C-c |
Quit |
Full keybindings: KEYBINDINGS.md
ze highlights comments only. This is intentional:
- Readability — Comments stand out in config files
- Not an IDE — Full syntax highlighting adds complexity without benefit for ze's use case
- Speed — Minimal parsing overhead
- Syntax highlighting — ze is for config files, not coding
- LSP — Use VSCode for serious development
- Plugins — Simplicity over extensibility
- Mouse / GUI — Keyboard and terminal only
- Text selection: Drag to select text with your terminal's native selection. Copies to system clipboard.
- Scrolling: Use
C-v/M-vorPageDown/PageUpfor scrolling (trackpad scrolling is disabled).
- Optimized for UTF-8 + LF. Zero-copy mmap for UTF-8+LF files.
- Auto-detects and converts: UTF-8 (with/without BOM), UTF-16 (with BOM), Shift_JIS, EUC-JP
- Auto-detects line endings (LF, CRLF, CR)
- Saves in original encoding (encoding, BOM, and line endings are preserved)
| Command | Description |
|---|---|
line N |
Jump to line N |
ln |
Toggle line numbers |
tab / tab N |
Show/set tab width |
indent |
Show/set indent style |
mode / mode X |
Show/set language mode |
key |
Describe key binding |
revert |
Reload file |
ro |
Toggle read-only |
exit / quit |
Quit with confirmation |
? |
List commands |
- Piece Table buffer with Undo/Redo
- Grapheme cluster support (emoji, CJK)
- Incremental search, regex, Query Replace
- Multi-buffer, window splitting
- Shell integration (M-|)
- Comment/indent settings for 48 languages
- Keyboard macros (
C-x (/)/e) - In-app help (
M-?)
- Speed — Responsiveness is our top priority.
- Minimal — Do one thing well.
- Unix — Text is a stream. Pipes are first-class.
- Zero-config — Copy and run. (History stored in
~/.ze/)
MIT
"Do one thing well. Fast."
