A minimal, colorful and sleek terminal file manager for macOS.
u — keybindings
╭──────────────────────────────────────────────────────╮
│ NAVIGATION SELECTION │
│ j / ↓ move down space toggle mark │
│ k / ↑ move up x cut selection │
│ h / ← parent dir y copy selection │
│ l / → open p paste here │
╰──────────────────────────────────────────────────────╯
- Vim-like navigation —
j/k/h/l, arrow keys,g/Gto jump top/bottom - Split-pane preview — see the contents of text files, source code, and directories without opening them
- Archive peeking — look inside
.zipand.tar.gz/.tgzfiles without extracting - Cut / copy / paste — move or duplicate files and folders, with smart name-collision handling
- Multi-select — mark several files at once for bulk delete/cut/copy
- Themes — five preinstalled color themes (
default,dracula,nord,gruvbox,mono), switchable at launch with--themeor on the fly withT - Git-aware — folders containing a
.gitdirectory are highlighted in purple - Language-aware colors —
.py,.js,.rb,.c/.cpp,.rsfiles get distinct colors at a glance - In-app help — press
uor?anytime for a full keybinding reference
- macOS (Ruby ships preinstalled)
- A terminal emulator that supports ANSI escape codes (Terminal.app, iTerm2, etc..)
Quick install (recommended):
curl -fsSL https://raw.githubusercontent.com/ufuayk/u/macos/install.sh | bashThis downloads the source and installs it under share/u (the launcher u goes on your PATH; falls back to ~/.local/bin if you don't have write access to /usr/local/bin or sudo).
Manual install (not recommended):
git clone --branch macos https://github.com/ufuayk/u
cd u
./u.rbRunning ./u.rb straight from a clone works because the entry point loads the modules next to it with require_relative. To put it on your PATH yourself, install the launcher and payload as install.sh does, or simply symlink from a directory that keeps u.rb and libr/ together.
u # opens in your home directory (default)
u /path/to/somewhere # opens in a specific directory
u --start /path/to/dir # same as above, explicit flag form
u --width 100 --height 30 # override the forced terminal size (default 136x40)
u --no-resize # don't force-resize the terminal at all
u --theme dracula # pick a color theme (default: default)
u --themes # list available themes and exit
u --help # print CLI usage and exitBy default, u asks your terminal to resize itself to 136×40 on launch — that's the size it's tuned for. Most modern terminal emulators honor this automatically; if yours doesn't, the layout still adapts gracefully to whatever size you have.
| Key | Action |
|---|---|
j / ↓ |
Move down |
k / ↑ |
Move up |
h / ← |
Go to parent directory |
l / → / Enter |
Open directory, open file, or peek inside an archive |
g / Home |
Jump to top |
G / End |
Jump to bottom |
PgUp / PgDn |
Page up / down the listing |
space |
Toggle mark on the current entry |
x |
Cut (marked entries, or current) |
y |
Copy / yank (marked entries, or current) |
p |
Paste into the current directory |
d |
Delete (marked entries, or current) — asks to confirm |
r |
Rename current entry |
n |
Create a new file |
N |
Create a new directory |
. |
Toggle hidden files |
/ |
Filter entries by text |
R |
Refresh the listing |
v |
Toggle the preview pane |
T |
Cycle through color themes |
u / ? |
Toggle the in-app help screen |
q / Ctrl-C |
Quit |
Press u or ? inside the app anytime — the full reference above is always one keypress away.
Toggle it with v. It shows, on the right half of the screen:
- Text & source files (
.txt,.md,.py,.js,.rb,.sh,.c, and more) — the actual file contents, read-only. Nothing is ever executed. - Directories — a quick listing of what's inside.
.zip/.tar.gz/.tgzarchives — the list of files inside the archive, with sizes, without extracting anything to disk.
ycopies the current (or marked) entries to an in-memory clipboard. It persists — paste it into as many places as you like.xcuts them instead. Cut is one-shot: it clears itself after a single paste (a move).ppastes into whatever directory you're currently browsing.- Pasting into a directory that already has a file with the same name won't overwrite it —
uautomatically names the copyfile copy.ext,file copy 2.ext, and so on, the same way Finder does.
Five themes ship with u:
| Theme | Look |
|---|---|
default |
The original 16-color ANSI look — follows your terminal palette |
dracula |
Dark purple / pink |
nord |
Cool blue-grey |
gruvbox |
Warm retro |
mono |
Greyscale, no hues |
- Everything is implemented with Ruby's standard library only —
io/console,fileutils,zlib. Norubyzip, no third-party gems, no network calls. - The
.zipreader parses the ZIP central directory by hand; the.tar.gzreader parses USTAR headers over aZlib::GzipReaderstream. Both only list archive contents — extraction isn't implemented (yet). - The code is split into small
libr/files (color,themes,zip_peek,tar_gz_peek,terminal,file_ops,preview,renderer,app), pulled together by theu.rbentry point withrequire_relative. Running./u.rbfrom a clone just works. - Rendering is theme-driven: the app never hardcodes a color, it asks the active theme for a role (
:dir,:error,:help_key, ...). Colors are disabled automatically when stdout isn't a TTY.
MIT.