A beautiful, fast, and feature-rich terminal-based Excel and CSV editor with vim-style keybindings, live row filtering, instant data profiling, formula support, and chart export.

Press f to filter any dataset without leaving the keyboard:
f → type expression → Enter to apply • Esc to clear
| Expression | Matches |
|---|---|
apple |
rows containing "apple" (case-insensitive) |
>1000 |
rows where current column > 1000 |
<=50.5 |
rows where current column ≤ 50.5 |
=Canada |
exact match (text or number) |
▾ >1000Press W to get a full column-by-column breakdown of any dataset — like pandas.describe() right in your terminal:
Col Type Non-null Nulls Stats
A number 1,234 0 Σ 2.4M avg 1.9K [0 – 9,999]
B text 1,230 4 891 unique Alice, Bob, Carol…
C mixed 800 200 200 nulls, some numbers
s — sort current column ascendingS — sort current column descendingu — unsort — restore original row orderSort indicator shown in the column header (A↑) and in the title bar.
Numeric and text columns are sorted with the appropriate comparison.
When freeze header is enabled, the header row stays pinned during sort.
Press Ctrl+R to pin the first row permanently at the top while scrolling through large files. The ⌶ indicator appears in the title bar when active. Sort is freeze-header aware — the header row is never moved.
When the cursor is on any numeric column the status bar automatically shows:
Σ 45,230 avg 1,004 min 2 max 9,999 n=45
No selection required — just move your cursor.
Vex reads the first line of every CSV file and picks the most likely delimiter from , ; \t | automatically. You can also specify it explicitly:
vex data.csv # auto-detect
vex data.csv -d ';' # semicolon
vex data.tsv -d '\t' # tab
vex data.csv --delimiter '|' # pipe
Select a range with V, then press v to open the chart viewer:
Press p inside the chart to export a beautiful PNG image via freeze:
p → saves data-chart.png next to your file
If freeze is not installed, vex shows the install command. No other terminal spreadsheet lets you share charts as images.
Press t to switch theme live. All themes are 256-color and truecolor compatible.
Dark Themes: - Catppuccin Mocha — Soft pastels, perfect for all-day use - Nord — Cool Arctic blues, minimal and focused - Rosé Pine — Elegant rose tones, sophisticated - Tokyo Night — Vibrant cyberpunk aesthetic - Gruvbox — Warm retro colors, comfortable - Dracula — Classic high contrast theme
Light Themes: - Catppuccin Latte — Gentle pastel light theme - Solarized Light — Balanced contrast - GitHub Light — Clean and minimal - One Light — Soft Atom-inspired colors
Numbers, formulas, and text are visually distinct — no configuration needed: - Numbers — accent color, easy to scan down columns - Formulas — secondary color, instantly recognizable - Text — default theme color
i)●) in the title bar on first editTab / Shift+Tab in edit mode saves and jumps to the next/previous cellArithmetic: =A1+B1, =C1*D1/E1, =B2-B1
15+ built-in functions:
| Function | Description |
|---|---|
SUM(A1:A10) |
Sum a range |
AVERAGE(B1:B20) / AVG(...) |
Average values |
COUNT(C1:C50) |
Count numbers |
MAX(D1:D100) / MIN(...) |
Find extremes |
IF(A1>100,"High","Low") |
Conditional logic |
CONCAT(A1," ",B1) / CONCATENATE(...) |
Join text |
UPPER(A1) / LOWER(A1) |
Change case |
LEN(A1) |
Text length |
ROUND(A1,2) |
Round to decimals |
ABS(A1) / SQRT(A1) / POWER(2,8) |
Math functions |
Auto-recalculates on every edit. Formula references auto-adjust when applied to a range.
hjkl) and arrow keysCtrl+G) — supports A100, 500, or 10,5/) across cell values and formulas with n/N navigationHome/End, gg/GTab / Shift+Tabc) or entire row (C) to clipboardp) — multi-row/column paste from any appe) to CSV or JSONCtrl+S) with format preservation (xlsx / csv)Ctrl+Shift+S) to a new fileCtrl+F)Enter) — full value, formula, and typebrew install CodeOne45/tap/vex
go install github.com/CodeOne45/vex-tui@latest
Pre-built binaries on the releases page: - macOS (Intel & Apple Silicon) - Linux (x64 & ARM64) - Windows (x64)
git clone https://github.com/CodeOne45/vex-tui.git
cd vex-tui
make build
sudo mv vex /usr/local/bin/
vex data.xlsx # open Excel file
vex report.csv # open CSV (delimiter auto-detected)
vex data.csv -d ';' # explicit semicolon delimiter
vex data.tsv -d '\t' # tab-separated
vex file.xlsx --theme nord # start with a specific theme
vex --help # show all options
| Key | Action |
|---|---|
↑↓←→ / hjkl |
Move cursor |
PgUp / PgDn or Ctrl+U/D |
Scroll page |
Home / End or 0 / $ |
First / last column |
gg / G |
Top / bottom of file |
Tab / Shift+Tab |
Next / previous sheet |
Ctrl+G |
Jump to cell (A100, 500, 10,5) |
| Key | Action |
|---|---|
f |
Filter rows — >100, <=50, =exact, text |
W |
Data profile — types, nulls, unique counts, stats |
s / S |
Sort column ascending / descending |
u |
Unsort — restore original order |
Ctrl+R |
Toggle freeze header row |
/ |
Search cells and formulas |
n / N |
Next / previous search result |
Esc |
Clear filter / search / selection |
| Key | Action |
|---|---|
i |
Enter edit mode |
Tab / Shift+Tab |
Save and move right / left |
Ctrl+S |
Save file |
Esc |
Cancel edit |
x |
Delete cell content |
dd / dc |
Delete row / column |
o / O |
Insert row / column |
c / C |
Copy cell / row |
p |
Paste |
Ctrl+J / Ctrl+L |
Fill down / right (requires selection) |
Ctrl+A |
Apply formula to range (requires selection) |
| Key | Action |
|---|---|
> / < |
Widen / narrow column |
Ctrl+F |
Toggle formula display |
t |
Change theme |
? |
Toggle help |
| Key | Action |
|---|---|
V |
Start / finish range selection |
v |
Open chart (requires selection) |
1 / 2 / 3 / 4 |
Bar / Line / Sparkline / Pie |
p |
Export chart as PNG image (inside chart view) |
| Key | Action |
|---|---|
Ctrl+S |
Save |
Ctrl+Shift+S |
Save as |
e |
Export to CSV or JSON |
q |
Quit (press twice if unsaved) |
vex data.csv
# W → see column types, nulls, unique counts instantly
# f → type >1000 to show only matching rows
# s → sort the column under cursor
# u → restore original order
1. Press V — start range selection
2. Move to end of data, press V — finish selection
3. Press v — open chart
4. Press 1-4 — switch chart type
5. Press p — save as PNG (requires freeze: brew install charmbracelet/tap/freeze)
i Enter edit mode
=A1*B1 Type formula
Tab Save and move right
... Continue typing
Ctrl+S Save file
Or: enter one formula → select range with V → press Ctrl+A to apply with auto-adjusted references.
vex-tui/
├── main.go # Entry point + CLI flags
├── internal/
│ ├── app/
│ │ ├── model.go # State + filter/sort/stats logic
│ │ ├── update.go # Event handling
│ │ ├── view.go # Rendering, charts, data profile
│ │ ├── keys.go # Keybindings
│ │ ├── edit.go # Edit / save operations
│ │ └── formulas.go # Formula evaluation engine
│ ├── loader/
│ │ ├── loader.go # File loading + CSV delimiter detection
│ │ └── save.go # File saving
│ ├── theme/
│ │ └── theme.go # Theme definitions
│ └── ui/
│ └── ui.go # Styles + helpers
└── pkg/
└── models/
└── models.go # Data models + mode constants
Contributions are welcome! Please open an issue first for large changes.
git clone https://github.com/CodeOne45/vex-tui.git
cd vex-tui
make test # run tests
make build # build binary
make snapshot # local multi-platform build via goreleaser
make tag VER=v2.1.0 # tag + push → triggers GitHub Actions release
Follow Effective Go and run make fmt before opening a PR.
If Vex saves you time or you just enjoy using it:
Every coffee keeps the terminal dream alive. ☕
MIT — see LICENSE.
⭐ If Vex is useful to you, a star goes a long way — thank you!
Made with ❤️ for terminal enthusiasts and spreadsheet power users.
$ claude mcp add vex-tui \
-- python -m otcore.mcp_server <graph>