Skip to main content

Core Keys Cheatsheet

All the essential VisiData keystrokes organized for fast lookup during daily use.

Launching VisiData​

vd file.csv # open CSV
vd -f tsv file.txt # open as TSV
vd -f fixed --skip 1 file.txt # open as fixed-width
command | vd -f fixed # pipe command output
vd -b input.csv -o output.json # batch convert
vd --play session.vdj # replay CommandLog

Global Commands​

^Q abort VisiData immediately
^C cancel current input / abort async threads
q quit current sheet
gq quit all sheets (exit VisiData)
Q quit current sheet, remove from CommandLog
zq [local custom] force-save default path, then quit
^H open man page (full reference)
Alt+H open help menu
z^H view command sheet for current sheet type
Space open command palette (type longname)
^G show cursor position and sheet bounds
^V show VisiData version

Cursor Movement​

h j k l ← ↓ ↑ → (also arrow keys)
gh gj gk gl go all the way to edge of sheet
gg go to first row
G go to last row
^F scroll page forward (down)
^B scroll page back (up)
zz scroll current row to center
zr N go to row number N (0-based)
zc N go to column number N (0-based)
c regex go to next column matching regex
r regex go to next row (key) matching regex

Sheet Stack​

Shift+S open Sheets Sheet (all open sheets)
Ctrl+^ jump to previous sheet
Alt+1–9 jump to sheet by number
q pop current sheet
gq quit all sheets
Z split screen (view two sheets)
Tab switch focus between panes
gZ close split

Local Common-Config Shortcuts​

zn open current cell directly in Neovim
use :wq in Neovim to save and return
zq force-save current sheet to its default path, then quit

zn and zq are local configuration additions, not built-in VisiData defaults. zq overwrites without asking; use Ctrl+S for the normal save prompts.

Row Selection​

s select current row
u unselect current row
t toggle selection
gs / gu / gt select / unselect / toggle ALL rows
| regex select matching rows in current column
g| regex select matching rows in ANY column
z| expr select rows matching Python expression
, select rows matching current cell value
" open filtered sheet (selected rows only)
{ } jump to prev/next selected row

Column Operations​

^ rename current column
_ toggle column width (full ↔ default)
g_ toggle ALL column widths
- hide current column
gv unhide all columns
H L slide column left / right
gH gL slide column to far left / far right
! toggle key column (blue)
z! unset key column
~ # % $ @ z# set type: str/int/float/currency/date/len
= expr create derived column from Python expression
g= expr set column for selected rows to expression result
: regex split column into multiple by regex
; regex extract capture groups as new columns
+ aggregator add aggregator to current column

Sorting​

[ sort ascending by current column
] sort descending by current column
g[ sort ascending by all key columns
g] sort descending by all key columns
z[ sort ascending, preserve existing sort

Analysis Sheets​

Shift+F frequency table for current column
gF frequency table grouped by all key columns
zF one-line summary for current/selected rows
Shift+I Describe Sheet (statistics for all columns)
gI Describe Sheet for all sheets
Shift+W pivot table (key column × aggregated column)
Shift+C Columns Sheet (edit all column metadata)
Shift+D CommandLog for current sheet
gD global CommandLog
Shift+M Melt Sheet (unpivot)
/ regex search forward in current column
? regex search backward
n N next / previous match
g/ regex search forward in ALL columns
g? regex search backward in ALL columns
z/ expr search by Python expression (current column)

Visualization​

. plot current numeric column vs key column(s)
g. plot ALL numeric columns vs key column(s)
# In canvas (graph) sheet:
+ - zoom in / out
_ zoom to fit all data
x set x-axis range
y set y-axis range
Enter open source rows at canvas cursor

Editing​

e edit current cell
ge text set current column for selected rows
Ctrl+O (while editing) open cell value in external $EDITOR
g Ctrl+O edit selected rows (visible columns) in external $EDITOR
U R undo / redo
a append blank row
ga N append N blank rows
d delete current row
gd delete selected rows
y gy yank (copy) current / selected rows (ROWS)
p P paste clipboard rows after / before cursor (inserts rows)
zy zp yank / paste a SINGLE CELL (cell → cell)
gzp paste yanked cell into column for selected rows
x gx cut current / selected rows
Ctrl+S save current sheet to file
g Ctrl+S save all sheets

When a custom in-place filter is active (gf, g r, z Shift+C, Space fk, Space fx), Ctrl+S saves the full dataset — hidden rows are not deleted. Run gc first if you want a filtered export. g r replays a stored g f so it is protected the same way; the gD reminder toggle is not covered. This is custom common-config behavior (save-all-rows) and does not apply to the built-in " filtered sheet.

Data Import / Export​

o file open file in VisiData
o $alias open a registered alias (registry launcher plugin; o then $ for fzf)
^S file save current sheet to file
g^S save all sheets
z^S file save current column only
Ctrl+D file save CommandLog to .vdj file

Custom Commands​

gf filter rows by natural-language condition (g then f)
gr search and reuse the last 20 friendly filters with fzf (g then r, custom)
g Shift+R delete a saved friendly filter from history with fzf (does not apply it, custom)
z Shift+C filter the column under the cursor (type only <op> <value>)
z f search and run custom VisiData commands with fzf
gc restore all rows (clear filter, shortcut for fclear)
Space fk kw filter rows by keyword (OR across columns)
Space fx expr filter rows by Python expression
Space ff expr filter rows by natural-language condition (English operators, cross-column and/or)
Space fc cond val filter the cursor column only (no column name)
Space fclear restore previous filter view
Space fr ... bulk find-and-replace: <col> <find> <replace> [, pairs] [and <col> ...]
U undo entire last fr operation (batch undo)

Filter commands (gf, gr, g Shift+R, fk, fx, ff, fc) are custom commands defined in 35-filter.py, 36-filter-friendly.py, and the filter-history feature under common-config, not built-in VisiData bindings. gf is the reliable keyboard shortcut for friendly filtering, while gr opens fzf history for the last 20 unique successful filters and g Shift+R opens it in delete mode to remove an entry without applying it. gc is the keyboard shortcut for fclear. z Shift+C (longname filter-friendly-current, alias fc) filters the column under the cursor so the column name does not have to be retyped. Unlike z| + " which opens a new sheet, these hide rows in-place. The _all_rows master list ensures new rows added during a filter survive gc/fclear.

The fr command is defined in 37-friendly-replace.py and supports batch undo — one U reverts all changes across all columns.

Auto-Fill on Add Row​

When a is pressed, the following columns auto-populate:

no → sequential number (max + 1)
pid → s-{no} (e.g. s-19)
c_date → YYYY-MM-DD-HH-MM (creation datetime)

Also available: Space backfill-cdate (fill empty c_date), Space today (insert date into cell).

Miscellaneous​

Ctrl+E view last error traceback
Ctrl+T open Threads Sheet
Ctrl+L redraw screen
Ctrl+R reload current sheet from source
m key record macro (start/stop)
gm open Macro Index

Next​