---
name: "visidata"
section: "1"
platform: "linux"
package: "visidata"
version: "3.5-1"
release: "Arch Linux 2026-11-01"
platforms: ["linux"]
url: "https://new.carta.tech/visidata"
---

# visidata(1)

a terminal utility for exploring and arranging tabular data

## NAME

**VisiData** – a terminal utility for exploring and arranging tabular data

## SYNOPSIS

**vd** \[*options*\] \[*input* ...\]

**visidata** \[*options*\] \[*input* ...\]

**vd** \[*options*\] **--play** *cmdlog* \[**-w** *waitsecs*\] \[**--batch**\] \[**-i**\] \[**-of** *filetype*\] \[**-o** *output*\] \[*field***=***value*\]

**vd** \[*options*\] \[*input* ...\] **+***toplevel*:*subsheet*:*col*:*row*

## DESCRIPTION

**VisiData** is an easy-to-use multipurpose tool to explore, clean, edit, and restructure data. Rows can be selected, filtered, and grouped; columns can be rearranged, transformed, and derived via regex or Python expressions; and workflows can be saved, documented, and replayed.

### REPLAY MODE

- **-p**, **--play**=*cmdlog*

  replay a saved *cmdlog* within the interface

- **-w**, **--replay-wait**=*seconds*

  wait *seconds* between commands

- **-b**, **--batch**

  replay in batch mode (with no interface)

- **-i**, **--interactive**

  launch VisiData in interactive mode after batch

- **-o**, **--output**=*file*

  save final visible sheet to *file* as .tsv

- *field***=***value*

  replace "{*field*}" in *cmdlog* contents with *value*

### Commands During Replay

- **^K**

  cancel current replay

### GLOBAL COMMANDS

All keystrokes are case sensitive. The **^** prefix is shorthand for **Ctrl**.

### Keystrokes to start off with

- **^Q**

  abort program immediately

- **^C**

  cancel user input or abort all async threads on current sheet

- **g^C**

  abort all secondary threads

- **q**

  quit current sheet or menu

- **Q**

  quit current sheet and free associated memory

- **gq**

  quit all sheets (clean exit)

- **Alt+H**

  activate help menu (**Enter**/**left-mouse** to expand submenu or execute command)

- **g^H**

  view this man page

- **z^H**

  view sheet of command longnames and keybindings for current sheet

- **gb**

  open sidebar in a new sheet

- **b**

  toggle sidebar

- **U**

  undo the most recent modification (requires enabled **options.undo**)

- **R**

  redo the most recent undo (requires enabled **options.undo**)

- **zU**

  undo the most recent modification and rerun it, editing its previous input (requires enabled **options.undo**)

- **Space** *longname*

  open command palette; execute top command by its *longname*

### Command Palette

- **Tab**

  Move to command palette, and cycle through commands

- **0-9**

  Execute numbered command

- **Enter**

  Execute highlighted command

### Cursor Movement

- **Arrow PgUp**

  go as expected

- **h j k l**

  go left/down/up/right

- **gh gj gk gl**

  go all the way to the left/bottom/top/right of sheet

- **G gg**

  go all the way to the bottom/top of sheet

- Ic. End Home

  go all the way to the bottom/top of sheet

- **^B ^F**

  scroll one page back/forward

- **^Left ^Right**

  scroll one page left/right

- **zz**

  scroll current row to center of screen

- **^^** (Ctrl+^)

  jump to previous sheet (swaps with current sheet)

- **/ ?** *regex*

  search for *regex* forward/backward in current column's displayed values

- **g/ g?** *regex*

  search for *regex* forward/backward over all visible columns' displayed values

- **z/ z?** *expr*

  search by Python *expr* forward/backward in current column (with column names as variables)

- **n N**

  go to next/previous match from last search

  Search matches are highlighted when **options.highlight\_search** is set (default: on).

- (*highlight-col*)

  highlight a regex in current column (without moving)

- (*highlight-sheet*)

  highlight a regex in all columns (without moving)

- (*highlight-clear*)

  clear all highlight patterns

  Undoing a search does not clear the highlighting; use *highlight-clear* instead.

- **\< \>**

  go up/down current column to next value

- **z\< z\>**

  go up/down current column to next null value

- **{ }**

  go up/down current column to next selected row

- **c** *regex*

  go to next column with name matching *regex*

- **r** *regex*

  go to next row with key matching *regex*

- **zc zr** *number*

  go to column/row *number* (0-based, negative from end); warn if clamped

- **H J K L**

  slide current row/column left/down/up/right

- **gH gJ gK gL**

  slide current row/column all the way to the left/bottom/top/right of sheet

- **zH zJ zK zK** *number*

  slide current row/column *number* positions to the left/down/up/right

- **zh zj zk zl**

  scroll one left/down/up/right

### Column Manipulation

- **\_** (underbar)

  toggle width of current column between full and default width

- **g\_**

  toggle widths of all visible columns between full and default width

- **z\_** *number*

  adjust width of current column to *number*

- **gz\_** *number*

  adjust widths of all visible columns to Ar number

- **resize-col-max-all**

  toggle width of current column between default width and the widest value in all rows, not only those on screen

- **resize-cols-max-all**

  toggle widths of all visible columns between default width and the widest value in all rows

- **-** (hyphen)

  hide current column

- **g-** (hyphen)

  hide any column that has multiple rows but only one distinct value

- **z-**

  reduce width of current column by half

- **gv**

  unhide all columns

- **! z!**

  toggle/unset current column as a key column

- **~ # % $ @ z#**

  set type of current column to str/int/float/currency/date/len

- **Alt++ Alt+-**

  show more/less precision in current numerical column

- **^**

  rename current column

- **g^**

  rename all unnamed visible columns to contents of selected rows (or current row)

- **z^**

  rename current column to combined contents of current cell in selected rows (or current row)

- **gz^**

  rename all visible columns to combined contents of current column for selected rows (or current row)

- **=** *\[name=\]expr*

  create new column from Python *expr*, with column names, and attributes, as variables. Optionally specify column *name*.

- **g=** *expr*

  set current column for selected rows to result of Python *expr*

- **gz=** *expr*

  set current column for selected rows to the items in result of Python sequence *expr*

- **z=** *expr*

  evaluate Python expression on current row and set current cell with result of Python *expr*

- i

  add column with incremental values

- **addcol-incr-key**

  add column with incremental values, restarting at each change in key columns

- gi

  set current column for selected rows to incremental values

- zi *step*

  add column with values at increment *step*

- gzi *step*

  set current column for selected rows at increment *step*

- **'** (tick)

  add a frozen copy of current column with all cells evaluated

- **g'**

  open a frozen copy of current sheet with all visible columns evaluated

- **z' gz'**

  add/reset cache for current/all visible column(s)

- Note that regex operations apply to the displayed value in a cell.

  - **:** *regex*

  add new columns from *regex* split; number of columns determined by example row at cursor

- **;** *regex*

  add new columns from capture groups of *regex* (also requires example row)

- **z****;** *expr*

  create new column from bash *expr*, with **$**columnNames as variables

- **\*** *search* **Tab** *replace*

  add column derived from current column, replacing *search* regex with *replace* (may include **\\1** backrefs)

- **g\* gz\*** *search* **Tab** *replace*

  modify selected rows in current/all visible column(s), replacing *search* with *replace* (may include **\\1** backrefs)

- **( g(**

  expand current/all visible column(s) of lists (e.g. **\[3\]**) or dicts (e.g. **{3}**) one level

- **z( gz(** *depth*

  expand current/all visible column(s) of lists (e.g. **\[3\]**) or dicts (e.g. **{3}**) to given *depth* ( *0*= fully)

- **) g(**

  unexpand current/all visible column(s); restore original column and remove other columns at this level

- **z) gz)** *depth*

  contract current/all visible column(s) of former lists (e.g. **\[3\]**) or dicts (e.g. **{3}**) to given *depth* ( *0*= fully)

- **zM**

  row-wise expand current column of lists (e.g. **\[3\]**) or dicts (e.g. **{3}**) within that column

### Row Selection

- **s t u**

  select/toggle/unselect current row

- **gs gt gu**

  select/toggle/unselect all rows

- **zs zt zu**

  select/toggle/unselect all rows from top to cursor

- **gzs gzt gzu**

  select/toggle/unselect all rows from cursor to bottom

- **\| \\** *regex*

  select/unselect rows matching *regex* in current column

- **g\| g\\** *regex*

  select/unselect rows matching *regex* in any visible column

- **z\| z\\** *expr*

  select/unselect rows matching Python *expr* in any visible column

- **,** (comma)

  select rows matching display value of current cell in current column

- **g,**

  select rows matching display value of current row in all visible columns

- **z, gz,**

  select rows matching typed value of current cell/row in current column/all visible columns

### Row Sorting/Filtering

- **\[ \]**

  sort ascending/descending by current column; replace any existing sort criteria

- **g\[ g\]**

  sort ascending/descending by all key columns; replace any existing sort criteria

- **z\[ z\]**

  sort ascending/descending by current column; keep higher priority sort criteria

- **gz\[ gz\]**

  sort ascending/descending by all key columns; add to existing sort criteria

- **"**

  open duplicate sheet with only selected rows

- **g"**

  open duplicate sheet with all rows

- **gz"**

  open duplicate sheet with deepcopy of selected rows

The rows in these duplicated sheets (except deepcopy) are references to rows on the original source sheets, and so edits to the filtered rows will naturally be reflected in the original rows.  Use **g'** to freeze sheet contents in a deliberate copy. **z'** replace current column with a frozen copy, with all cells evaluated

### Editing Rows and Cells

- **a za**

  append blank row/column; appended columns cannot be copied to clipboard

- **ga gza** *number*

  append *number* blank rows/columns

- **d gd**

  delete current/selected row(s)

- **y gy**

  yank (copy) current/all selected row(s) to clipboard in **Memory** **Sheet**

- **x gx**

  cut (copy and delete) current/all selected row(s) to clipboard in **Memory** **Sheet**

- **zy gzy**

  yank (copy) contents of current column for current/selected row(s) to clipboard in **Memory** **Sheet**

- **zd gzd**

  set contents of current column for current/selected row(s) to **options.null\_value**

- **zx gzx**

  cut (copy and delete) contents of current column for current/selected row(s) to clipboard in **Memory** **Sheet**

- **p P**

  paste clipboard rows after/before current row

- **zp gzp**

  set cells of current column for current/selected row(s) to last clipboard value

- **zP gzP**

  paste to cells of current column for current/selected row(s) using the system clipboard

- **Y gY**

  yank (copy) current/all selected row(s) to system clipboard (using **options.clipboard\_copy\_cmd**)

- **zY gzY**

  yank (copy) contents of current column for current/selected row(s) to system clipboard (using **options.clipboard\_copy\_cmd**)

- **f**

  fill null cells in current column with contents of non-null cells up the current column

- **e** *text*

  edit contents of current cell

- **^O**

  edit contents of current cell in external **EDITOR**

- **ge** *text*

  set contents of current column for selected rows to *text*

### Commands While Editing Input

- **Enter ^C**

  accept/abort input

- **^O g^O**

  open external $EDITOR to edit contents of current/selected rows in current column

- **^R**

  reload initial value

- **^A ^E**

  go to beginning/end of line

- **^B ^F**

  go back/forward one character

- **^← ^→** (arrow)

  go back/forward one word

- **^H ^D**

  delete previous/current character

- **^T**

  transpose previous and current characters

- **^U ^K**

  clear from cursor to beginning/end of line

- **^Y**

  paste from cell clipboard

- **Backspace Del**

  delete previous/current character

- **Insert**

  toggle insert mode

- **Up Down**

  set contents to previous/next in history

- **Tab Shift+Tab**

  move cursor left/right and re-enter edit mode

- **Shift+Arrow**

  move cursor in direction of **Arrow** and re-enter edit mode

### Data Toolkit

- **o** *input*

  open *input* in **VisiData**

- **zo**

  open file or url from path in current cell

- **^S g^S** *filename*

  save current/all sheet(s) to *filename* with given filetype

-

  Note: if the format does not support multisave, or the *filename* ends in a **/**, a directory will be created.

- **z^S** *filename*

  save current column only to *filename* with given filetype

- **^D** *filename.vdj*

  save **CommandLog** to *filename.vdj* file

- **A**

  open new blank sheet with one column

- **T**

  open new sheet that has rows and columns of current sheet transposed

- **+** *aggregator*

  add *aggregator* to current column (see **Frequency Table**)

- **z+** *aggregator*

  display result of *aggregator* over values in selected rows for current column; store result in **Memory** **Sheet**

- **&**

  append top two sheets in **Sheets** **Stack**

- **g&**

  append all sheets in **Sheets** **Stack**

- **w** *nBefore* *nAfter*

  add column where each row contains a list of that row, *nBefore* rows, and *nAfter* rows

### Data Visualization

- **.** (dot)

  plot current numeric column vs key columns. The numeric key column is used for the x-axis; categorical key column values determine color.

- **g.**

  plot a graph of all visible numeric columns vs key columns.

If rows on the current sheet represent plottable coordinates (as in .shp or vector .mbtiles sources),  **.** plots the current row, and **g.** plots all selected rows (or all rows if none selected).

### Canvas-specific Commands

- **+ -**

  increase/decrease zoom level, centered on cursor

- **\_** (underbar)

  zoom to fit full extent

- **z\_** (underbar)

  set aspect ratio

- **g\_** (underbar)

  Zoom y-axis to fit all visible data points

- **x** *xmin* *xmax*

  set *xmin*/*xmax* on graph

- **y** *ymin* *ymax*

  set *ymin*/*ymax* on graph

- **s t u**

  select/toggle/unselect rows on source sheet contained within canvas cursor

- **gs gt gu**

  select/toggle/unselect rows on source sheet visible on screen

- **d**

  delete rows on source sheet contained within canvas cursor

- **gd**

  delete rows on source sheet visible on screen

- **Enter**

  open sheet of source rows contained within canvas cursor

- **gEnter**

  open sheet of source rows visible on screen

- **1** - **9**

  toggle display of layers

- **^L**

  redraw all pixels on canvas

- **v**

  toggle **show\_graph\_labels** option

- **mouse scrollwheel**

  zoom in/out of canvas

- **left click-drag**

  set canvas cursor

- **right click-drag**

  scroll canvas

### Split Screen

- **Z**

  split screen in half, so that second sheet on the stack is visible in a second pane

- **zZ**

  split screen, and queries for height of second pane

### Split Window specific Commands

- **gZ**

  close an already split screen, current pane full screens

- **Z**

  push second sheet on current pane's stack to the top of the other pane's stack

- **Tab**

  jump to other pane

- **gTab**

  swap panes

- **g Ctrl+^**

  cycle through sheets

### Other Commands

- **Q**

  quit current sheet and remove it from the **CommandLog**

- **v**

  toggle sheet-specific visibility (multi-line rows on Sheet, legends/axes on Graph)

- **^E g^E**

  view traceback for most recent error(s)

- **z^E**

  view traceback for error in current cell

- **^L**

  refresh screen

- **^R**

  reload current sheet

- **^Z**

  suspend VisiData process

- **^G**

  show cursor position and bounds of current sheet on status line

- **^V**

  show version and copyright information on status line

- **^P**

  open **Status** **History**

- m *keystroke*

  first, begin recording macro; second, prompt for *keystroke*, and complete recording. Macro can then be executed everytime provided keystroke is used. Will override existing keybinding. Macros will run on current row, column, sheet.

- gm

  open an index of all existing macros. Can be directly viewed with **Enter**, and then modified with **^S**.

- **^Y z^Y g^Y**

  open current row/cell/sheet as Python object

- **^X** *expr*

  evaluate Python *expr* and opens result as Python object

- **z^X** *expr*

  evaluate Python *expr*, in context of current row, and open result as Python object

- **g^X** *module*

  import Python *module* in the global scope

### Internal Sheets List

- **.**

  **Directory** **Sheet**             browse properties of files in a directory

- **.**

  **Guide** **Index**                 read documentation from within VisiData

- **.**

  **Memory** **Sheet** (Alt+Shift+M)  browse saved values, including clipboard

-

  - **Metasheets**

  - **.**

  **Columns** **Sheet** (Shift+C)     edit column properties

- **.**

  **Sheets** **Sheet** (Shift+S)      jump between sheets or join them together

- **.**

  **Options** **Sheet** (Shift+O)     edit configuration options

- **.**

  **Commandlog** (Shift+D)        modify and save commands for replay

- **.**

  **Error** **Sheet** (Ctrl+E)            view last error

- **.**

  **Status** **History** (Ctrl+P)         view history of status messages

- **.**

  **Threads** **Sheet** (Ctrl+T)          view, cancel, and profile asynchronous threads

- **Derived** **Sheets**

  - **.**

  **Frequency** **Table** (Shift+F)   group rows by column value, with aggregations of other columns

- **.**

  **Describe** **Sheet** (Shift+I)    view summary statistics for each column

- **.**

  **Pivot** **Table** (Shift+W)       group rows by key and summarize current column

- **.**

  **Melted** **Sheet** (Shift+M)      unpivot non-key columns into variable/value columns

- **.**

  **Transposed** **Sheet** (Shift+T)   open new sheet with rows and columns transposed

### INTERNAL SHEETS

### Directory Sheet

- (global commands)

  - **Space** *open-dir-current*

  open the **Directory** **Sheet** for the current directory

- (sheet-specific commands)

  - **Enter gEnter**

  open current/selected file(s) as new sheet(s)

- **^O g^O**

  open current/selected file(s) in external $EDITOR

- **^R z^R gz^R**

  reload information for all/current/selected file(s)

- **d gd**

  delete current/selected file(s) from filesystem, upon commit

- **y gy** *directory*

  copy current/selected file(s) to given *directory*, upon commit

- **e ge** *name*

  rename current/selected file(s) to *name*

- **\` (backtick)**

  open parent directory

- **z^S**

  commit changes to file system

### Guide Index

- Browse through a list of available guides. Each guide shows you how to use a particular feature. Gray guides have not been written yet.

  - (global commands)

  - **Space** *open-guide-index*

  open the **Guide** **Index**

- (sheet-specific commands)

  - **Enter**

  open a guide

### Memory Sheet

- Browse through a list of stored values, referanceable in expressions through their **name**.

  - (global commands)

  - **Alt+Shift+M**

  open the **Memory** **Sheet**

- **Alt+M** *name*

  store value in current cell in **Memory** **Sheet** under *name*

- (sheet-specific commands)

  - **e**

  edit either value or name, to edit reference

### METASHEETS

### Columns Sheet (Shift+C)

- Properties of columns on the source sheet can be changed with standard editing commands (**e** **ge** **g=** **Del**) on the **Columns** **Sheet**. Multiple aggregators can be set by listing them (separated by spaces) in the aggregators column. The 'g' commands affect the selected rows, which are the literal columns on the source sheet.

  - (global commands)

  - **gC**

  open **Columns** **Sheet** with all columns from all sheets

- (sheet-specific commands)

  - **&**

  add column from appending selected source columns

- **g! gz!**

  toggle/unset selected columns as key columns on source sheet

- **g+** *aggregator*

  add Ar aggregator No to selected source columns

- **g-** (hyphen)

  hide selected columns on source sheet

- **g~ g# g% g$ g@ gz# z%**

  set type of selected columns on source sheet to str/int/float/currency/date/len/floatsi

- **Enter**

  open a **Frequency** **Table** sheet grouped by column referenced in current row

### Sheets Sheet (Shift+S)

- open **Sheets** **Stack**, which contains only the active sheets on the current stack

  - (global commands)

  - **gS**

  open **Sheets** **Sheet**, which contains all sheets from current session, active and inactive

- **Alt** *number*

  jump to sheet *number*

- (sheet-specific commands)

  - **Enter**

  jump to sheet referenced in current row

- **gEnter**

  push selected sheets to top of sheet stack

- **a**

  add row to reference a new blank sheet

- **gC**

  open **Columns** **Sheet** with all columns from selected sheets

- **gI**

  open **Describe** **Sheet** with all visible columns from selected sheets

- **g^R**

  reload all selected sheets

- **z^C gz^C**

  abort async threads for current/selected sheets(s)

- **g^S**

  save selected or all sheets

- **&** *jointype*

  merge selected sheets with visible columns from all, keeping rows according to *jointype*:

- **.**

  **inner**  keep only rows which match keys on all sheets

- **.**

  **outer**  keep all rows from first selected sheet

- **.**

  **full**   keep all rows from all sheets (union)

- **.**

  **diff**   keep only rows NOT in all sheets

- **.**

  **append** combine all rows from all sheets into a generic sheet, matching columns by name

- **.**

  **concat** combine all rows from same-type sheets, matching columns by position, keeping first sheet type, column names and types

- **.**

  **extend** copy first selected sheet, keeping all rows and sheet type, and extend with columns from other sheets

- **.**

  **merge**  keep all rows from first sheet, updating any False-y cells with non-False-y values from second sheet; add unique rows from second sheet

### Options Sheet (Shift+O)

- (global commands)

  - **Shift+O**

  edit global options (apply to **all** **sheets**)

- **zO**

  edit sheet options (apply to **current** **sheet** only)

- **gO**

  open **options.config** as **TextSheet**

- (sheet-specific commands)

  - **Enter e**

  edit option at current row

- **d**

  remove option override for this context

- **^S**

  save option configuration to **foo.visidatarc**

- **z^S**

  save option overrides to config file

### CommandLog (Shift+D)

- (global commands)

  - **D**

  open current sheet's **CommandLog** with all other loose ends removed; includes commands from parent sheets

- **gD**

  open global **CommandLog** for all commands executed in the current session

- **zD**

  open current sheet's **CommandLog** with the parent sheets commands' removed

- **set-envvar** *name* *value*

  set an environment variable and record it for replay; refresh locale for LANG and LC\_\* variables

- (sheet-specific commands)

  - **x**

  replay command in current row

- **gx**

  replay contents of entire CommandLog

- **^C**

  abort replay

### Threads Sheet (Ctrl+T)

- (global commands)

  - **^T**

  open global **Threads** **Sheet** for all asynchronous threads running

- **z^T**

  open current sheet's **Threads** **Sheet**

- (sheet-specific commands)

  - **^C**

  abort thread at current row

- **g^C**

  abort all threads on current **Threads** **Sheet**

### DERIVED SHEETS

### Frequency Table (Shift+F)

- A **Frequency** **Table** groups rows by one or more columns, and includes summary columns for those with aggregators.

  - (global commands)

  - **gF**

  open Frequency Table, grouped by all key columns on source sheet

- **zF**

  open one-line summary for all rows and selected rows

- (sheet-specific commands)

  - **s t u**

  select/toggle/unselect these entries in source sheet

- **Enter gEnter**

  open copy of source sheet with rows that are grouped in current cell / selected rows

### Describe Sheet (Shift+I)

- A **Describe** **Sheet** contains descriptive statistics for all visible columns.

  - (global commands)

  - **gI**

  open **Describe** **Sheet** for all visible columns on all sheets

- (sheet-specific commands)

  - **zs zu**

  select/unselect rows on source sheet that are being described in current cell

- **!**

  toggle/unset current column as a key column on source sheet

- **Enter**

  open a **Frequency** **Table** sheet grouped on column referenced in current row

- **zEnter**

  open copy of source sheet with rows described in current cell

### Pivot Table (Shift+W)

- Set key column(s) and aggregators on column(s) before pressing **Shift+W** on the column to pivot.

  - (sheet-specific commands)

  - **Enter**

  open sheet of source rows aggregated in current pivot row

- **zEnter**

  open sheet of source rows aggregated in current pivot cell

### Melted Sheet (Shift+M)

- Open Melted Sheet (unpivot), with key columns retained and all non-key columns reduced to Variable-Value rows.

  - (global commands)

  - **gM** *regex*

  open Melted Sheet (unpivot), with key columns retained and *regex* capture groups determining how the non-key columns will be reduced to Variable-Value rows.

### Python Object Sheet (^X ^Y g^Y z^Y)

- (sheet-specific commands)

  - **Enter**

  dive further into Python object

- **v**

  toggle show/hide for methods and hidden properties

- **gv zv**

  show/hide methods and hidden properties

## COMMANDLINE OPTIONS

Add **-n**/**--nonglobal** to make subsequent CLI options sheet-specific (applying only to paths specified directly on the CLI). By default, CLI options apply to all sheets.

Options can also be set via the *Options* *Sheet* or a *.visidatarc* (see FILES).

- **-P**=*longname*

  preplay *longname* before replay or regular launch; limited to **Base** **Sheet** bound commands

- **+***toplevel*:*subsheet*:*col*:*row*

  launch vd with *subsheet* of *toplevel* at top-of-stack, and cursor at *col* and *row*; all arguments are optional

- **--overwrite**=*c*

  Overwrite with confirmation

- **--guides**

  open Guide Index

- **-f**, **--filetype**=*filetype*

  tsv                set input loader to use for *filetype* instead of file extension (aliases **-if**, **--input-filetype**); applies to subsequent input paths on the CLI, not to the **-o** output or files opened later in the session

- **-of**, **--output-filetype**=*filetype*

                     set the saver for the **-o** output to *filetype* instead of its extension

- **-d**, **--delimiter**=*delimiter*

  \\t                 field delimiter to use for tsv/usv filetype

- **-y**, **--confirm**=*y*

  y                  auto-accept all confirmation prompts (including file overwrite)

- **-ro**, **--overwrite**=*n*

  n                  do not overwrite existing files

- **-N**, **--nothing**=*T*

  False              disable loading .visidatarc and plugin addons

- **--visidata-dir**=*str* /build/.config/visidata

  VisiData directory for plugins and other files; set with $VD\_DIR or --visidata-dir

- **--debug** False

  exit on error and display stacktrace

- **--undo**=*bool* True

  enable undo/redo

- **--col-cache-size**=*int* 0

  max number of cache entries in each cached column

- **--scroll-incr**=*int* -3

  amount to scroll with scrollwheel

- **--force-256-colors** False

  use 256 colors even if curses reports fewer

- **--quitguard** False

  confirm before quitting modified sheet

- **--default-width**=*int* 20

  default column width

- **--default-height**=*int* 4

  default column height

- **--name-joiner**=*str* \_

  string to join sheet or column names

- **--value-joiner**=*str*

  string to join display values

- **--max-rows**=*int* 1000000000

  number of rows to load from source

- **--wrap** False

  wrap text to fit window width on TextSheet

- **--save-filetype**=*str* tsv

  specify default file type to save as

- **--profile** False

  enable profiling on threads

- **--min-memory-mb**=*int* 0

  minimum memory to continue loading and async processing

- **--max-threads**=*int* 10

  maximum number of concurrent processes for addcol-shell

- **--encoding**=*str* utf-8-sig

  encoding passed to codecs.open when reading a file

- **--encoding-errors**=*str* surrogateescape

  encoding\_errors passed to codecs.open

- **--tmp-prefix**=*str* visidata-

  prefix for temporary files and directories

- **--confirm**=*str* a

  confirm interactive prompts {a=ask\|y=yes}

- **--mouse-interval**=*int* 1

  max time between press/release for click (ms)

- **--bulk-select-clear** False

  clear selected rows before new bulk selections

- **--some-selected-rows** False

  if no rows selected, if True, someSelectedRows returns all rows; if False, fails

- **--regex-skip**=*str*

  regex of lines to skip in text sources

- **--regex-flags**=*str* I

  flags to pass to re.compile() \[AILMSUX\]

- **--load-lazy** False

  load subsheets always (False) or lazily (True)

- **--skip**=*int* 0

  skip N rows before header

- **--header**=*int* 1

  parse first N rows as column names

- **--delimiter**=*str*

  field delimiter to use for tsv/csv filetype

- **--row-delimiter**=*str*

  " row delimiter to use for tsv/csv filetype

- **--tsv-safe-newline**=*str*

  replacement for newline character when saving to tsv

- **--tsv-safe-tab**=*str*

  replacement for tab character when saving to tsv

- **--visibility**=*int* 0

  visibility level

- **--default-sample-size**=*int* 100

  number of rows to sample for regex.split (0=all)

- **--fmt-expand-dict**=*str* %s.%s

  format str to use for names of columns expanded from dict (colname, key)

- **--fmt-expand-list**=*str* %s\[%s\]

  format str to use for names of columns expanded from list (colname, index)

- **--json-indent**=*NoneType* None

  indent to use when saving json

- **--json-sort-keys** False

  sort object keys when saving to json

- **--json-ensure-ascii**=*bool* True

  ensure ascii encode when saving json

- **--default-colname**=*str*

  column name to use for non-dict rows

- **--filetype**=*str*

  input filetype; overrides file extension

- **--safe-error**=*str* #ERR

  error string to use while saving

- **--save-encoding**=*str* utf-8

  encoding passed to codecs.open when saving a file

- **--clean-names** False

  clean column/sheet names to be valid Python identifiers

- **--replay-wait**=*float* 0.0

  time to wait between replayed commands, in seconds

- **--replay-ignore-errors** False

  continue replay on error instead of aborting

- **--rowkey-prefix**=*str* キ

  string prefix for rowkey in the cmdlog

- **--clipboard-copy-cmd**=*str* xclip -selection clipboard -filter

  command to copy stdin to system clipboard

- **--clipboard-paste-cmd**=*str* xclip -selection clipboard -o

  command to send contents of system clipboard to stdout

- **--fancy-chooser** False

  use nicer selection interface for aggregators and jointype

- **--null-value**=*NoneType* None

  a value to be counted as null

- **--histogram-bins**=*int* 0

  number of bins for histogram of numeric columns

- **--numeric-binning** False

  bin numeric columns into ranges

- **--plot-colors**=*str*

  list of distinct colors to use for plotting distinct objects

- **--motd-url**=*str*

  source of randomized startup messages

- **--dir-depth**=*int* 0

  folder recursion depth on DirSheet

- **--dir-hidden** False

  load hidden files on DirSheet

- **--active-procs**=*int* 10

  number of concurrent processes on DirSheet

- **--config**=*Path* /build/.visidatarc

  config file to exec in Python

- **--play**=*str*

  file.vdj to replay

- **--batch** False

  replay in batch mode (with no interface and all status sent to stdout)

- **--output**=*NoneType* None

  save the final visible sheet to output at the end of replay

- **--output-filetype**=*str*

  filetype for output path; overrides file extension

- **--output-cell**=*NoneType* None

  output the cursor cell display value at exit

- **--preplay**=*str*

  longnames to preplay before replay

- **--imports**=*str* plugins

  imports to preload before .visidatarc (command-line only)

- **--nothing** False

  no config, no plugins, nothing extra

- **--interactive** False

  run interactive mode after batch replay

- **--s3-anon** False

  run S3 in anonymous mode

- **--overwrite**=*str* c

  allow overwriting existing files {c=check\|n=no/readonly}

- **--plugins-autoload**=*bool* True

  do not autoload plugins if False

- **--theme**=*str*

  display/color theme to use

- **--pandas-allow-pickle** False

  pandas allow unpickling objects (unsafe)

- **--airtable-auth-token**=*str*

  Airtable API key from https://airtable.com/account

- **--matrix-token**=*str*

  matrix API token

- **--matrix-user-id**=*str*

  matrix user ID associated with token

- **--matrix-device-id**=*str* VisiData

  device ID associated with matrix login

- **--reddit-client-id**=*str*

  client\_id for reddit API

- **--reddit-client-secret**=*str*

  client\_secret for reddit API

- **--reddit-user-agent**=*str* VisiData v3.5

  user\_agent for reddit API

- **--zulip-batch-size**=*int* -100

  number of messages to fetch per call (\<0 to fetch before anchor)

- **--zulip-anchor**=*int* 1000000000

  message id to start fetching from

- **--zulip-delay-s**=*float* 1e-05

  seconds to wait between calls (0 to stop after first)

- **--zulip-api-key**=*str*

  API key for Zulip

- **--zulip-email**=*str*

  email address for use with Zulip API key

- **--csv-dialect**=*str* excel

  dialect passed to csv.reader

- **--csv-delimiter**=*str* ,

  delimiter passed to csv.reader

- **--csv-doublequote**=*bool* True

  quote-doubling setting passed to csv.reader

- **--csv-quotechar**=*str* "

  quotechar passed to csv.reader

- **--csv-quoting**=*int* 0

  quoting style passed to csv.reader and csv.writer

- **--csv-skipinitialspace**=*bool* True

  skipinitialspace passed to csv.reader

- **--csv-escapechar**=*NoneType* None

  escapechar passed to csv.reader

- **--csv-lineterminator**=*str*

  " lineterminator passed to csv.writer

- **--safety-first** False

  sanitize input/output to handle edge cases, with a performance cost

- **--duckdb-onconnect**=*str*

  duckdb statement to execute after opening a connection

- **--f5log-object-regex**=*NoneType* None

  regex to apply to the object name. Useful where object names have a structure to extract. Use the (?P\<foo\>...) named groups form to get column names.

- **--f5log-log-year**=*NoneType* None

  override the default year used for log parsing. Use all four digits of the year (e.g., 2022). By default (None) use the year from the ctime of the file, or failing that the current year.

- **--f5log-log-timezone**=*str* UTC

  timezone of the source file

- **--fixed-rows**=*int* 1000

  number of rows to check for fixed width columns

- **--fixed-maxcols**=*int* 0

  max number of fixed-width columns to create (0 is no max)

- **--graphviz-edge-labels**=*bool* True

  whether to include edge labels on graphviz diagrams

- **--grep-base-dir**=*NoneType* None

  base directory for relative paths opened with sysopen-row

- **--hdf5-matrix-enumerate** False

  enumerate matrix rows and columns

- **--html-title**=*str* \<h2\>{sheet.name}\</h2\>

  table header when saving to html

- **--http-max-next**=*int* 0

  max next.url pages to follow in http response

- **--http-req-headers**=*dict* {'User-Agent': 'VisiData v3.5'}

  http headers to send to requests

- **--http-ssl-verify**=*bool* True

  verify host and certificates for https

- **--npy-allow-pickle** False

  numpy allow unpickling objects (unsafe)

- **--npy-matrix-enumerate** False

  enumerate matrix rows and columns

- **--pcap-internet**=*str* n

  (y/s/n) if save\_dot includes all internet hosts separately (y), combined (s), or does not include the internet (n)

- **--pdf-tables** False

  parse PDF for tables instead of pages of text

- **--postgres-schema**=*str* public

  desired schema for the Postgres database

- **--s3-endpoint**=*str*

  alternate S3 endpoint, used for local testing or alternative S3-compatible services

- **--s3-glob**=*bool* True

  enable glob-matching for S3 paths

- **--s3-version-aware** False

  show all object versions in a versioned bucket

- **--sqlite-onconnect**=*str*

  sqlite statement to execute after opening a connection

- **--xlsx-meta-columns** False

  include columns for cell objects, font colors, and fill colors

- **--xlsx-color-cells**=*bool* True

  color cells based on xlsx source

- **--xml-parser-huge-tree**=*bool* True

  allow very deep trees and very long text content

- **--xml-parser-recover**=*bool* True

  try hard to parse through broken XML

- **--plt-marker**=*str* .

  matplotlib.markers

- **--plt-linestyle**=*str*

  matplotlib linestyle for save-svg; "-" to connect points as a line chart

- **--plot-palette**=*str* Set3

  colorbrewer palette to use

- **--server-addr**=*str* 127.0.0.1

  IP address to listen for commands

- **--server-port**=*int* 0

  port to listen for commands

- **--server-socket**=*str*

  path to Unix domain socket to listen for commands (takes precedence over server\_port)

- **--server-cursor-width**=*int* 200

  max display width per cell in cursor row echo

- **--fixer-api-key**=*str*

  API key for api.apilayer.com/fixer

- **--fixer-cache-days**=*int* 1

  how long to cache currency conversions, in days

- **--describe-aggrs**=*str* mean stdev

  numeric aggregators to calculate on Describe sheet

- **--highlight-search**=*bool* True

  whether to highlight strings in searches

- **--incr-base**=*float* 1.0

  start value for column increments

- **--ping-count**=*int* 3

  send this many pings to each host

- **--ping-interval**=*float* 0.1

  wait between ping rounds, in seconds

- **--regex-maxsplit**=*int* 0

  maxsplit to pass to regex.split

- **--rename-cascade** False

  cascade column renames into expressions

- **--faker-locale**=*str* en\_US

  default locale to use for Faker

- **--faker-extra-providers**=*NoneType* None

  list of additional Provider classes to load via add\_provider()

- **--faker-salt**=*str*

  make fakes deterministic, when seed string is non-empty

- **--mailcap-mimetype**=*str*

  force mimetype for sysopen-mailcap

- **--unfurl-empty** False

  if unfurl includes rows for empty containers

### DISPLAY OPTIONS

Display options can only be set via the Options Sheet or a *.visidatarc* (see FILES).

- **disp\_menu** True

  show menu on top line when not active

- **disp\_menu\_keys** True

  show keystrokes inline in submenus

- **color\_menu** black on 75 blue

  color of menu items in general

- **color\_menu\_active** 223 yellow on black

  color of active menu items

- **color\_menu\_spec** black on 34 green

  color of sheet-specific menu items

- **color\_menu\_help** black italic on 75 blue

  color of helpbox

- **disp\_menu\_boxchars** ││──┌┐└┘├┤

  box characters to use for menus

- **disp\_menu\_more** »

  command submenu indicator

- **disp\_menu\_push** ⎘

  indicator if command pushes sheet onto sheet stack

- **disp\_menu\_input** …

  indicator if input required for command

- **disp\_menu\_fmt** \| VisiData {vd.version} \| {vd.motd}

  right-side menu format string

- **disp\_float\_fmt** {:.2f}

  default fmtstr to format float values

- **disp\_int\_fmt** {:d}

  default fmtstr to format int values

- **disp\_formatter** generic

  formatter to create the text in each cell (also used by text savers)

- **disp\_displayer** generic

  displayer to render the text in each cell

- **disp\_note\_none** ⌀

  visible contents of a cell whose value is None

- **disp\_truncator** …

  indicator that the contents are only partially visible

- **disp\_oddspace** ·

  displayable character for odd whitespace

- **disp\_more\_left** \<

  header note indicating more columns to the left

- **disp\_more\_right** \>

  header note indicating more columns to the right

- **disp\_error\_val**

  displayed contents for computation exception

- **disp\_ambig\_width** 1

  width to use for unicode chars marked ambiguous

- **disp\_pending**

  string to display in pending cells

- **disp\_note\_pending** :

  note to display for pending cells

- **disp\_note\_fmtexc** ?

  cell note for an exception during formatting

- **disp\_note\_getexc** !

  cell note for an exception during computation

- **disp\_note\_typeexc** !

  cell note for an exception during type conversion

- **color\_note\_pending** bold green

  color of note in pending cells

- **color\_note\_type** 226 yellow

  color of cell note for non-str types in anytype columns

- **color\_note\_row** 220 yellow

  color of row note on left edge

- **disp\_column\_sep** │

  separator between columns

- **disp\_keycol\_sep** ║

  separator between key columns and rest of columns

- **disp\_rowtop\_sep** │

  - **disp\_rowmid\_sep** ⁝

  - **disp\_rowbot\_sep** ⁝

  - **disp\_rowend\_sep** ║

  - **disp\_keytop\_sep** ║

  - **disp\_keymid\_sep** ║

  - **disp\_keybot\_sep** ║

  - **disp\_endtop\_sep** ║

  - **disp\_endmid\_sep** ║

  - **disp\_endbot\_sep** ║

  - **disp\_selected\_note** •

  - **disp\_sort\_asc** ↑↟⇞⇡⇧⇑

  characters for ascending sort

- **disp\_sort\_desc** ↓↡⇟⇣⇩⇓

  characters for descending sort

- **color\_default** white on black

  the default fg and bg colors

- **color\_default\_hdr** bold white on black

  color of the column headers

- **color\_bottom\_hdr** underline white on black

  color of the bottom header row

- **color\_current\_row** reverse

  color of the cursor row

- **color\_current\_col** bold on 232

  color of the cursor column

- **color\_current\_cell**

  color of current cell, if different from color\_current\_row+color\_current\_col

- **color\_current\_hdr** bold reverse

  color of the header for the cursor column

- **color\_column\_sep** white on black

  color of column separators

- **color\_key\_col** 81 cyan

  color of key columns

- **color\_hidden\_col** 8

  color of hidden columns on metasheets

- **color\_selected\_row** 215 yellow

  color of selected rows

- **color\_clickable** bold

  color of internally clickable item

- **color\_code** bold white on 237

  color of code sample

- **color\_heading** bold black on yellow

  color of header

- **color\_guide\_unwritten** 243 on black

  color of unwritten guides in GuideGuide

- **disp\_wrap\_max\_lines** 3

  max lines for multiline view

- **disp\_wrap\_break\_long\_words** True

  break words longer than column width in multiline

- **disp\_wrap\_replace\_whitespace** False

  replace whitespace with spaces in multiline

- **disp\_wrap\_placeholder** …

  multiline string to indicate truncation

- **disp\_multiline\_focus** True

  only multiline cursor row

- **color\_multiline\_bottom**

  color of bottom line of multiline rows

- **color\_aggregator** bold 255 white on 240 black

  color of aggregator summary on bottom row

- **disp\_splitwin\_pct** 0

  height of second sheet on screen

- **disp\_rstatus\_fmt** {sheet.threadStatus} {sheet.keystrokeStatus} \[:longname\_status\]{sheet.longname}\[/\] {sheet.nRows:9d} {sheet.rowtype} {sheet.modifiedStatus}{sheet.selectedStatus}{vd.replayStatus}{vd.sidebarStatus}

  right-side status format string

- **disp\_status\_fmt** {sheet.sheetlist}\|

  left-side status format string

- **disp\_lstatus\_max** 0

  maximum length of left status line

- **disp\_status\_sep** │

  separator between statuses

- **color\_keystrokes** bold white on 237

  color of input keystrokes

- **color\_longname\_guide** 237

  color of command longnames

- **color\_longname\_status** white

  color of command longnames

- **color\_keys** bold reverse

  color of keystrokes in help

- **color\_status** bold on 238

  status line color

- **color\_error** 202 1

  error message color

- **color\_warning** 166 15

  warning message color

- **color\_top\_status** underline

  top window status bar color

- **color\_active\_status** black on 68 blue

  active window status bar color

- **color\_inactive\_status** 8 on black

  inactive window status bar color

- **color\_highlight\_status** black on green

  color of highlighted elements in statusbar

- **color\_working** 118 5

  color of system running smoothly

- **color\_edit\_unfocused** 238 on 110

  display color for unfocused input in form

- **color\_edit\_cell** 233 on 110

  cell color to use when editing cell

- **disp\_edit\_fill** \_

  edit field fill character

- **disp\_unprintable** ·

  substitute character for unprintables

- **disp\_date\_fmt** %Y-%m-%d

  default fmtstr passed to strftime for date values

- **disp\_currency\_fmt** %.02f

  default fmtstr to format for currency values

- **color\_currency\_neg** red

  color for negative values in currency displayer

- **disp\_replay\_play** ▶

  status indicator for active replay

- **disp\_replay\_record** ⏺

  status indicator for macro record

- **color\_status\_replay** green

  color of replay status indicator

- **disp\_histogram** ■

  histogram element character

- **disp\_graph\_labels** True

  show axes and legend on graph

- **disp\_canvas\_charset** ⠀⠁⠂⠃⠄⠅⠆⠇⠈⠉⠊⠋⠌⠍⠎⠏⠐⠑⠒⠓⠔⠕⠖⠗⠘⠙⠚⠛⠜⠝⠞⠟⠠⠡⠢⠣⠤⠥⠦⠧⠨⠩⠪⠫⠬⠭⠮⠯⠰⠱⠲⠳⠴⠵⠶⠷⠸⠹⠺⠻⠼⠽⠾⠿⡀⡁⡂⡃⡄⡅⡆⡇⡈⡉⡊⡋⡌⡍⡎⡏⡐⡑⡒⡓⡔⡕⡖⡗⡘⡙⡚⡛⡜⡝⡞⡟⡠⡡⡢⡣⡤⡥⡦⡧⡨⡩⡪⡫⡬⡭⡮⡯⡰⡱⡲⡳⡴⡵⡶⡷⡸⡹⡺⡻⡼⡽⡾⡿⢀⢁⢂⢃⢄⢅⢆⢇⢈⢉⢊⢋⢌⢍⢎⢏⢐⢑⢒⢓⢔⢕⢖⢗⢘⢙⢚⢛⢜⢝⢞⢟⢠⢡⢢⢣⢤⢥⢦⢧⢨⢩⢪⢫⢬⢭⢮⢯⢰⢱⢲⢳⢴⢵⢶⢷⢸⢹⢺⢻⢼⢽⢾⢿⣀⣁⣂⣃⣄⣅⣆⣇⣈⣉⣊⣋⣌⣍⣎⣏⣐⣑⣒⣓⣔⣕⣖⣗⣘⣙⣚⣛⣜⣝⣞⣟⣠⣡⣢⣣⣤⣥⣦⣧⣨⣩⣪⣫⣬⣭⣮⣯⣰⣱⣲⣳⣴⣵⣶⣷⣸⣹⣺⣻⣼⣽⣾⣿

  charset to render 2x4 blocks on canvas

- **disp\_graph\_pixel\_random** False

  randomly choose attr from set of pixels instead of most common

- **disp\_zoom\_incr** 2.0

  amount to multiply current zoomlevel when zooming

- **color\_graph\_hidden** 238 blue

  color of legend for hidden attribute

- **color\_graph\_selected** bold

  color of selected graph points

- **color\_graph\_axis** bold

  color for graph axis labels

- **disp\_graph\_tick\_x** ╵

  character for graph x-axis ticks

- **color\_graph\_refline**

  color for graph reference value lines

- **disp\_graph\_reflines\_x\_charset** ▏││▕

  charset to render vertical reference lines on graph

- **disp\_graph\_reflines\_y\_charset** ▔──▁

  charset to render horizontal reference lines on graph

- **disp\_graph\_multiple\_reflines\_char** ▒

  char to render multiple parallel reflines

- **disp\_help\_flags** cmdpalette guides help hints inputfield inputkeys nometacols sidebar

  list of helper features to enable (space-separated):\
       \- "cmdpalette": exec-longname suggestions\
       \- "guides": guides in sidebar\
       \- "help": help sidebar collapsed by default\
       \- "hints": context-sensitive hints on menu line\
       \- "inputfield": context-sensitive help for each input field\
       \- "inputkeys": input quick reference in sidebar\
       \- "nometacols": hide expert columns on metasheets\
       \- "sidebar": context-sensitive sheet help in sidebar\
       \- "all": enable all helper features

- **color\_readonly** on 52

  color for readonly columns

- **color\_add\_pending** green

  color for rows pending add

- **color\_change\_pending** reverse yellow

  color for cells pending modification

- **color\_delete\_pending** red

  color for rows pending delete

- **disp\_sidebar** True

  whether to display sidebar

- **disp\_sidebar\_fmt**

  format string for default sidebar

- **disp\_sidebar\_width** 0

  max width for sidebar

- **disp\_sidebar\_height** 0

  max height for sidebar

- **color\_sidebar** black on 114 blue

  base color of sidebar

- **color\_sidebar\_title** black on yellow

  color of sidebar title

- **disp\_boxchars** ▐▌▄█▗▖▐▌

  box characters (ls rs ts bs tl tr bl br)

- **color\_match** red

  color for matching chars in palette chooser

- **color\_f5log\_mon\_up** green

  color of f5log monitor status up

- **color\_f5log\_mon\_down** red

  color of f5log monitor status down

- **color\_f5log\_mon\_unknown** blue

  color of f5log monitor status unknown

- **color\_f5log\_mon\_checking** magenta

  color of monitor status checking

- **color\_f5log\_mon\_disabled** black

  color of monitor status disabled

- **color\_f5log\_logid\_alarm** red

  color of alarms

- **color\_f5log\_logid\_warn** yellow

  color of warnings

- **color\_f5log\_logid\_notice** cyan

  color of notice

- **color\_f5log\_logid\_info** green

  color of info

- **color\_xlsx\_auto\_dark** 16 black

  color of Automatic xlsx text on light fills

- **color\_xlsx\_auto\_light** 231 white

  color of Automatic xlsx text on dark fills

- **color\_xword\_active** green

  color of active clue

- **disp\_decimal\_fmt** {}

  default fmtstr to format decimal values

- **color\_cmdpalette** black on 72

  base color of command palette

- **disp\_cmdpal\_max** 10

  max number of suggestions for command palette

- **color\_highlight\_search** 21 blue on 15 white

  color to use for highlighting search results

- **disp\_scroll\_context** 0

  minimum number of lines to keep visible above/below cursor when scrolling

- **disp\_sparkline** ▁▂▃▄▅▆▇

  characters to display sparkline

## EXAMPLES

```
vd
```

launch **DirSheet** for current directory

```
vd foo.tsv
```

open the file foo.tsv in the current directory

```
vd -f ddw
```

open blank sheet of type ddw

```
vd new.tsv
```

open new blank tsv sheet named *new*

```
vd -f sqlite bar.db
```

open the file bar.db as a sqlite database

```
vd foo.tsv -n -f sqlite bar.db
```

open foo.tsv as tsv and bar.db as a sqlite database

```
vd -f sqlite foo.tsv bar.db
```

open both foo.tsv and bar.db as a sqlite database

```
vd -b countries.fixed -o countries.tsv
```

convert countries.fixed (in fixed width format) to countries.tsv (in tsv format)

```
vd postgres://username:password@hostname:port/database
```

open a connection to the given postgres database

```
vd --play tests/pivot.vdj --replay-wait 1 --output tests/pivot.tsv
```

replay tests/pivot.vdj, waiting 1 second between commands, and output the final sheet to test/pivot.tsv

```
ls -l | vd -f fixed --skip 1 --header 0
```

parse the output of ls -l into usable data

```
ls | vd | lpr
```

interactively select a list of filenames to send to the printer

```
vd newfile.tsv
```

open a blank sheet named *newfile* if file does not exist

```
vd -P open-plugins
```

preplay longname **open-plugins** before starting the session

```
vd a.xlsx b.tsv c.tsv +0:3:1:2
```

launch with cursor for sheet **0** (a.xlsx) at subsheet **3** in sheet **0**, col **1**, row **2**

```
vd a.xlsx b.tsv c.tsv +0:1:2
```

launch with cursor for sheet **0** (a.xlsx) at col **1**, row **2**

```
vd a.tsv b.tsv c.tsv +1:2
```

launch with cursor for last sheet (c.tsv) at col **1**, row **2**

```
vd a.tsv b.tsv c.tsv +1:
```

launch with cursor for last sheet (c.tsv) at col **1**

```
vd a.tsv b.tsv c.tsv +:2
```

launch with cursor for last sheet (c.tsv) at row **2**

```
vd a.xlsx b.xlsx c.xlsx +0:annual:1:2 +1:sales:monthly:3:4
```

launch with cursor for sheet **0** (a.xlsx) in subsheet **annual** at col **1**, row **2**, and cursor for sheet **1** (b.xlsx), subsheet **sales** in subsheet monthly; col **3**, row **4**

```
vd a.tsv b.tsv c.tsv +1::
```

launch in sheet **1** (b.tsv), with cursor at col 0, row 0

```
vd a.tsv b.tsv c.tsv +-2::
```

launch in **2nd** from last sheet (b.tsv), with cursor at col 0, row 0

```
vd a.tsv b.tsv c.tsv +:1:
```

launch with cursors for all sheets at col **1**

```
vd a.tsv b.tsv c.tsv +::2
```

launch with cursors for all sheets at row **2**

```
vd a.tsv b.tsv c.tsv +:1:2
```

launch with cursors for all sheets at col **1**, row **2**

```
vd a.xlsx b.xslx c.xlsx +:a:1:2
```

launch with cursors for all sheets at subsheet **a**, col **1**, row **2**

## FILES

At the start of every session, **VisiData** looks for *$HOME/.visidatarc*, and calls Python exec() on its contents if it exists. For example:

```
   options.min_memory_mb=100  # stop processing without 100MB free
   bindkey('0', 'go-leftmost')   # alias '0' to go to first column, like vim
   def median(values):
       L = sorted(values)
       return L[len(L)//2]
   vd.aggregator('median', median)
```

Functions defined in .visidatarc are available in python expressions (e.g. in derived columns).

The *VisiData* *directory* holds local plugins (in its *plugins/* subdirectory), saved macros, and other files. It defaults to *~/.config/visidata* on Linux and *~/Library/Preferences/visidata* on macOS, or *$XDG\_CONFIG\_HOME/visidata* when XDG\_CONFIG\_HOME is set. Set VD\_DIR before starting **vd** or use **--visidata-dir**=*directory* to choose another directory. The command-line option takes precedence over VD\_DIR. Input history and the list of saved macros are in the data directory (*~/.local/share/visidata* on Linux), and cached downloads are in the cache directory (*~/.cache/visidata* on Linux); neither moves with the VisiData directory.

## SUPPORTED SOURCES

Core VisiData includes these sources:

- **tsv** (tab-separated value)

  - Plain and simple. **VisiData** writes tsv format by default. See the **--tsv-delimiter** option.

    - **csv** (comma-separated value)

  - .csv files are a scourge upon the earth, and still regrettably common.

    - See the **--csv-dialect**, **--csv-delimiter**, **--csv-quotechar**, and **--csv-skipinitialspace** options.

    - Accepted dialects are **excel-tab**, **unix**, and **excel**.

    - **fixed** (fixed width text)

  - Columns are autodetected from the first 1000 rows (adjustable with **--fixed-rows**).

    - **json** (single object) and **jsonl**/**ndjson**/**ldjson** (one object per line).

  - Cells containing lists (e.g. **\[3\]**) or dicts (**{3}**) can be expanded into new columns with **(** and unexpanded with **)**.

    - **sqlite**

  - May include multiple tables. The initial sheet is the table directory;

    **Enter** loads the entire table into memory. **z^S** saves modifications to source.

URL schemes are also supported:

- **http** (requires **requests**); can be used as transport for with another filetype

  For a list of all remaining formats supported by VisiData, see https://visidata.org/formats.

In addition, **.zip**, **.gz**, **.bz2**, **.xz**, **,zstd**, and **.zst** files are decompressed on the fly.

## AUTHOR

**VisiData** was made bySaul Pwanson ⟨*vd@saul.pw*⟩.
