This file is a merged representation of a subset of the codebase, containing specifically included files, combined into a single document by Repomix. The content has been processed where security check has been disabled.
This file contains a packed representation of the entire repository's contents. It is designed to be easily consumable by AI systems for analysis, code review, or other automated processes.
The content is organized as follows:
- This summary section
- Repository information
- Directory structure
- Repository files (if enabled)
- Multiple file entries, each consisting of: a. A header with the file path (## File: path/to/file) b. The full contents of the file in a code block
- This file should be treated as read-only. Any changes should be made to the original repository files, not this packed version.
- When processing this file, use the file path to distinguish between different files in the repository.
- Be aware that this file may contain sensitive information. Handle it with the same level of security as you would the original repository.
- Some files may have been excluded based on .gitignore rules and Repomix's configuration
- Binary files are not included in this packed representation. Please refer to the Repository Structure section for a complete list of file paths, including binary files
- Only files matching these patterns are included: docs/**/*.md
- Files matching patterns in .gitignore are excluded
- Files matching default ignore patterns are excluded
- Security check has been disabled - content may contain sensitive information
- Files are sorted by Git change count (files with more changes are at the bottom)
docs/
colors.md
columns.md
contributing.md
crud.md
customize.md
edit.md
formats.md
freq.md
gmail.md
graph.md
graphics.md
group.md
index.md
internal_formats.md
join.md
loading.md
macros.md
man.md
menu.md
mouse.md
move.md
navigate.md
pipes.md
plugins.md
rows.md
save-restore.md
shell.md
split.md
test.md
usage.md
viewtsv.md
---
eleventyNavigation:
key: Customizing VisiData - Colors
order: 12
update: 2023-10-12
version: VisiData v3.0
---
## Color Options
Interface elements and colors can be set on the command-line before a session, or in .visidatarc to take effect for every session, or within VisiData on the Options Sheet (`Shift+O`). Color options in particular start with `color_`:
vd --color-selected-row="magenta"
or in .visidatarc:
options.color_selected_row = "magenta"
On the Options Sheet, if you edit a color (or any display element), you will see the changes immediately, both in the options value (which is itself colorized) and also in the interface. `Shift+U` to undo if you don't like it.

## Color Specification
Colors in the terminal have 3 components: *foreground*, *background*, and *attributes*.
In most modern terminals, each of the foreground and background colors can be one of 256 colors in a standard palette.
Several attributes are also available: `bold`, `italic`, `reverse`, and `underline`. (There are other attributes like `dim` and `blink`, but they are not widely supported).
In VisiData, colors are specified with a simple language:
<attribute> <fg-color> on <bg-color>
where `<attribute>` is a plain text name as above, and each `<color>` is a number from 0-255, or a basic color name from the original 8-color palette: `black red green yellow blue magenta cyan white`.
Multiple attributes may be specified.
Most terminals support 256 colors, but because some do not, it's possible to specify a *fallback color*, which is a second color that's used in case the first color isn't available.
For instance, `215 yellow` means to use the color `215` (kind of orange-brown), but if it's not available, use `yellow` instead.
Multiple colors may be applied to a single interface element with different precedence, for instance with [colorizers](docs/api/interface).
The color used will be the highest precedence background and the highest precedence foreground, which may come from separate color strings. All attributes will be applied regardless of precedence--there is no way to specify a negative attribute or "no" attributes.
Any of the color components may be omitted, letting that component be given by a lower-precedence colorizer instead, ultimately falling back to `color_default` (`white on black` in the default theme).
Many color strings only specify a single attribute.
The ordering above--attributes first, then foreground, and finally background--is suggested and preferred.
Attributes may be specified anywhere in the color string; this does not change their effect (e.g. `bold` applies to the font rendered, not to the foreground or background color, even if `bold` text makes the foreground color seem brighter).
The `reverse` attribute flips the foreground and background color. Multiple `reverse` attributes do not undo each other.
## 256 Terminal Colors and the Colors Sheet
To see all the available colors and what they look like in your specific terminal, run the `open-colors` command. (This command is not bound to any keystroke, so must be executed by its longname; press `Space`, then type `open-colors`, then press `Enter`.)

The first several rows on this sheet are the existing color strings that are currently in use.
After these are the numeric colors; note that colors 0-7 correspond to the named colors above, with 0 being black and 7 being standard white. Colors 8-15 are unnamed brighter versions of these colors: 8 is gray ("bright black") and 15 is bright white.
Colors 16-231 form a regular color cube with a wide variety of gradations covering the color space.
Colors 232-255 are gradients of white, with 232 being the darkest possible gray (almost indistinguishable from the black of 0 and 16), and 255 being almost the brightest white (though 15 is brighter).
## [Changing Display Attributes within a string](#attrs) {#attrs}
In many interface elements, it's possible to change the display attributes inline, within a single string.
For example, the menu bar has a message displayed in the upper right (which by default shows "Ctrl+H for help menu"), and is configurable with `options.disp_menu_fmt`.
The base menu color is configurable with `options.color_menu`, which is also applied to this menubar message.
However, this can be changed by specifying a new color within the string itself, using syntax like `[:red]`:
options.disp_menu_fmt = "[:red on black]{vd.motd}"
A color option name can also be used instead of a real color; for example, to use the `color_error` color, use `[:error]`:
options.disp_menu_fmt = "[:error]{vd.motd}"
Attribute changes can happen multiple times in a single string.
Use `[/]` to clear the last inline color change, and `[:]` to clear all inline attributes:
options.disp_menu_fmt = "[:underline]Note:[/] [:error]{vd.motd}"
What follows the `/` is not checked, so these are all valid:
[:underline]underlined text[/underline]
[:underline]also underlined[/]
[:underline]underline ends at end of string
### onclick
In addition to changing the display attributes, an `onclick` attribute can be given with this inline syntax, which specifies either a VisiData command to run, or a url to open (in `$BROWSER`), when the interface element is clicked:
options.disp_menu_fmt = "[:onclick https://jsvine.github.io/intro-to-visidata/]Click here to go to the tutorial[/]"
Or if you want a custom VisiData toolbar some of your favorite actions:
vd --disp_menu_fmt="[:onclick freq-col] freq out [/] | [:onclick quit-sheet] back [/]"
Elements with `onclick` are displayed with `color_clickable`, which is by default `underline`, which is commonly understood as a clickable affordance.
## Setting the Theme
A set of configured display elements and attributes may be packaged into a *theme*, which can be set as an option before VisiData starts (on the CLI or in .visidatarc), and can be changed with the `theme-input` command (in the menu under `View > Set theme`).
By default VisiData uses a dark-mode color scheme and some suggestive Unicode characters.
A few non-default themes are also packaged with VisiData:
- [`light`](https://github.com/saulpw/visidata/blob/develop/visidata/themes/light.py): light-mode color scheme
- [`ascii8`](https://github.com/saulpw/visidata/blob/develop/visidata/themes/ascii8.py): ascii characters and basic 8-colors only
- [`asciimono`](https://github.com/saulpw/visidata/blob/develop/visidata/themes/asciimono.py): ascii characters and default colors only
To use VisiData on a classic [DEC VT102](https://terminals-wiki.org/wiki/index.php/DEC_VT102) terminal:
vd --theme=asciimono
[I would [love to know](https://github.com/saulpw/visidata/discussions/1533) of anyone using VisiData in such a lo-fi situation!]
### Adding a new theme
To add another theme, add it to the `vd.themes` dictionary in .visidatarc.
If more than one person uses it, [submit a PR](https://github.com/saulpw/visidata/pulls) to include it in the [visidata/themes](https://github.com/saulpw/visidata/tree/develop/visidata/themes) directory.
vd.themes['awesome'] = dict(
color_default = 'black on white', # the default fg and bg colors
color_key_col = '20 blue', # color of key columns
color_edit_cell = '234 black', # cell color to use when editing cell
# ... etc
)
## Colorizers
`TableSheet` sheets (which is any sheet with a row/column grid, i.e. most sheets) have *colorizers*, functions that can provide display attributes on individual rows, columns, or cells.
See [docs/api/interface](/docs/api/interface#colors) for how to use colorizers.
---
eleventyNavigation:
key: Columns
order: 5
update: 2021-11-01
version: VisiData 2.6
---
## How to manipulate columns
Commands(s) Operation
------------ -----------
`!` pins the current column on the left as a key column
`H` `L` slides the current column **one position** to the left/right
`gH` `gL` slides the current column **all the way** to the left/right of its section
---
## How to hide (remove) and unhide (return) columns
###### How to hide columns
- Press `-` (hyphen) to hide the current column.
**or**
1. Press `Shift+C` on the source sheet to open its **Columns sheet**.
2. Move the cursor right to the **width** column.
3. Move the cursor down to the row which represents the column you wish to hide.
4. Press `e` followed by `0` to set the width for that column to **0**.
5. Press `q` to return to the source sheet.
###### How to unhide columns
1. Press `gv` to unhide all columns on current sheet.
**or**
1. Press `Shift+C` on the source sheet to open its **Columns sheet**.
2. Move the cursor right to the **width** column.
3. Move the cursor down to the row which represents the column you wish to unhide. Currently, that cell should contain the value **0**.
4. Press `e` followed by a *positive number* to set the width.
5. Press `q` to return to the source sheet.
---
## How to specify column types
Command Type
--------- --------
` ~` string
` #` int
` %` float
` $` currency
` @` date
`z#` vlen
`z~` anytype
Columns usually begin as untyped (`anytype`). Errors when working with numerical or datetime data is often due to values being considered as strings, and the problem is solved by setting the correct type.
The `float` type uses Python's builtin `float()` constructor to parse the string, and it parses by using the decimal separator.
The `currency` type is a bit of a misnomer. It filters out any non-numeric characters, and then parses the remainder of the cell value as a float.
The reasons to prefer using `float` over `currency`, is performance (it is quite a bit slower than native parsing with `float`), or if any non-float characters should get reported as an error.
The `date` type parses dates into ISO8601 format. Those columns can then be used in mathematical calculations, and the calculations are interpreted for dates. E.g. 2020-01-01 + 1, is 2020-01-02.
The `vlen` type formats the cell value to the length of the content. For example, if the cell content is a list of length 3, then when `vlen` typed it will display a value of 3.
There is also the `floatlocale` type, which uses Python's `locale.atof` to parse the Column values. With `floatlocale`, you can set the `LC_NUMERIC` environment variable appropriately (before launching VisiData), such that `atof()` will parse the number based on your locale setting. There is a `type-floatlocale` command, which is unbound by default, because parsing this way is significantly slower than using the builtin float type.
If you need locale-specific float parsing regularly, you may want to [rebind](/docs/customize) `%` or `z%` (or maybe some other keystroke) to `type-floatlocale` instead.
The following example uses the file [sample.tsv](https://raw.githubusercontent.com/saulpw/visidata/stable/sample_data/sample.tsv).
<div class="asciicast">
<asciinema-player id="player-types" poster="npt:0:20" rows=27 src="../casts/types.cast"></asciinema-player>
<script type="text/javascript" src="/asciinema-player.js"></script>
</div>
###### How to batch specify column types for more than one column
1. Press `Shift+C` to open the **Columns sheet**.
2. Press `s` or `t` to select the rows referencing the columns you wish to type.
3. Type `g` followed by the any of the above typing keystrokes to set the type for all selected columns on the source sheet.
---
## How to format columns
**Note**: Un-typed file formats, like tsvs and csvs, will save as they are displayed.
Some types have an option for their default display formatting.
Type Option Default
--------- ---------------- --------
int `disp_int_fmt` `{:.0f}`
float `disp_float_fmt` `{:.02f}`
currency `disp_currency_fmt` `%0.2f`
date `disp_date_fmt` `%Y-%m-%d`
Ways to adjust the display formatting:
* The `fmtstr` column on the **Columns Sheet** allows you to specify the formatting for specific columns within that session, without affecting the default for the others.
* The `disp_TYPE_fmt` option can be changed on the **Options Sheet** to set the formatting for all columns of type `TYPE` in that session.
* The `--disp-TYPE-fmt` argument can be passed through the commandline to set the formatting for all columns of type `TYPE` in that session.
* The `options.disp_TYPE_fmt` can be set in the `~/.visidatarc` to change the default formatting for all columns of type `TYPE` for all sessions.
There are several formatting styles offered:
* Formatting that starts with `'%'` (e.g. `%0.2f`) will use [locale.format_string()](https://docs.python.org/3.6/library/locale.html#locale.format_string).
* Otherwise (e.g. `{:.02f}`), formatting will be passed to Python's [string.format()](https://docs.python.org/3/library/string.html#custom-string-formatting).
* Date fmtstr are passed to [strftime](https://strftime.org/).
The default for currency uses `locale.format_string()`. The default for int/float/date use `string.format()`.
###### How to format a specific numeric columns to contain a thousands separator within a session?
1. Set a column to a numeric type by pressing `#` (int), `%` (float), or `$` (currency).
2. Press `Shift+C` to open the **Columns Sheet**.
3. Move to the row referencing the column whose display you wish to format. Move the cursor to the fmtstr column.
4. Type `e` followed by `{:,.0f}` for an `int` type and `{:,.02f}` for a floating point type.
###### How to quickly adjust the precision of a float or date?
1. Ensure the column is typed as numeric column: float (`%`), floatsi (`z%`), dirty float (`$`), or date (`@`).
2. Press `Alt+Plus` or `Alt+Minus` to adjust the precision in the current column.
3. Or, press `Space` and use the longname `setcol-precision-more` or `setcol-precision-less`.
###### How to automatically set the type of a particular column
When loading sheets repeatedly with the same schema, it can be useful to pre-set the column types (and other metadata) in .visidatarc using the `knownCols` attribute on the Sheet class and its subclasses.
For example, to set the "timestamp" column in every sheet to the `date` type:
`Sheet.knownCols.timestamp.type = date`
Or to hide the `nCols` column on the SheetsSheet by default:
`SheetsSheet.knownCols.nCols.width = 0`
###### How to format all date columns as **month/day/year**.
The above method can be used to explicitly set the default `fmtstr` for specifically-named columns.
However, to use a default fmtstr for all date-typed columns, set the `disp_date_fmt` option. In .visidatarc:
~~~
options.disp_date_fmt = '%m/%d/%Y'
~~~
or pass as a commandline argument:
~~~
vd --disp-date-fmt='%m/%d/%Y'
~~~
or set in the **Options Sheet**.
1. Press `Shift+O` to open the **Options Sheet**.
2. Move the cursor down to the relevant `disp_date_fmt` option.
3. Type `e` followed by `%m/%d/%Y`.
---
###### How to specify a comma decimal separator when typing floating point numbers?
1. Before launching VisiData, set the shell environment variable `LC_NUMERIC` to a locale which interprets commas as decimals. Any European locale should do; an example that works is `en_DK.UTF-8`.
2. Within VisiData, set a column to type `floatlocale` by pressing `Space` followed by `type-floatlocale`.
Note that `type-floatlocale` is significantly slower than `type-float`. However, if you wish to replace the current binding for `type-float` with `type-floatlocale`, add to your `~/.visidatarc`:
~~~
Sheet.unbindkey('%')
Sheet.bindkey('%', 'type-floatlocale')
~~~
or if you never use `type-floatsi`, you can do
~~~
Sheet.unbindkey('z%')
Sheet.bindkey('z%', 'type-floatlocale')
~~~
## How to split a column
Python regular expressions provide more finetuned column splitting. The following example
uses the commands for column splitting and transformation with [xd/puzzles.tsv](http://xd.saul.pw/xd-metadata.zip).
<div class="asciicast">
<asciinema-player id="player-split-regex" poster="npt:0:20" rows=27 src="../casts/split-regex.cast"></asciinema-player>
</div>
###
- `:` adds new columns derived from splitting the current column at positions defined by a *regex pattern*. `options.default_sample_size` (default: 100) rows around the cursor will be used to determine the number of columns that will be created.
- `;` adds new columns derived from pulling the contents of the current column which match the *regex within capture groups*. The new columns are named using the capture group index, or if named capture groups are used, the capture group names. This command uses the `options.default_sample_size` (default:100) rows around the cursor as sample rows.
- `*` followed by *regex* and then `Tab` followed by the *replacement* replaces the text matching the *regex* with the contents of *replacement*. *replacement* may include backreferences to capture groups in the regex (`\1` etc).
## How to substitute text in a column
The `*` command can be used to do content transformations of cells. The `g*` variant transforms in-place, instead of creating a new column.
The following example uses [benchmarks.csv](https://raw.githubusercontent.com/saulpw/visidata/stable/sample_data/benchmarks.csv).
**Question** Transform the **SKU** values of *food* to *nutri*.
1. Move cursor to **SKU** column.
2. Press `gs` to select all rows.
3. Press `g*` to replace text in selected rows in current column.
4. Type `food` in the search field.
5. Press `Tab` to go to the replace field, then type `nutri`.
6. Press `Enter` to replace the text.
- tests/transform-cols.vd
---
## [How to expand columns that contain nested data](#expand) {#expand}
If a column includes container data such as JSON objects or arrays, the `(` family of commands can expand the child values into top-level columns:
Command Operation
--------- --------
` (` expand _current_ column
` g(` expand _all visible_ columns fully
` z(` expand _current_ column to a specific depth (prompt for input)
`gz(` expand _all visible_ columns to a specific depth (prompt for input)
` )` contract (unexpand) the current column
` zM` expand _current_ column row-wise within that column
The following demo shows `(` commands applied to this data:
~~~
[
[ "short", "array" ],
[ "slightly", "longer", "array" ],
{ "nested": "data" },
{ "more": { "deeply": { "nested": "data" } } }
]
~~~
<div class="asciicast">
<asciinema-player id="player-expand-cols" poster="npt:0:20" rows=13 src="../casts/expand-cols.cast"></asciinema-player>
</div>
Note that by default the expansion logic will look for nested columns in **up to** `options.default_sample_size` (Default: 100) **rows surrounding the cursor**. This behavior can be controlled by adjusting `default_sample_size` in the **Options Sheet**, or setting `options.default_sample_size` in the `~/.visidatarc` file.
---
## [How to create derivative columns](#derived) {#derived}
The `=` command takes a Python expression as input and creates a new column, where each cell evaluates the expression in the context of its row.
These variables and functions are available in the scope of an expression:
- **Column names** evaluate to the typed value of the cell in the named column for the same row.
- **`vd`** attributes and methods; use `Ctrl+X vd` to view the vd object, or [see the API]().
- **`Sheet`** attributes and methods; use `g Ctrl+Y` to view the sheet object (or see the API).
- **Global** functions and variables (add your own in your .visidatarc).
- **modules** that have been `import`ed in Python
- if you need a module that hasn't already been imported at runtime, use `g Ctrl+X import <modname>`.
- **`sheet`**: the current sheet (a TableSheet object)
- **`col`**: the current column (as a Column object; use for Column metadata)
- **`row`**: the current row (a Python object of the internal rowtype)
- **`curcol`**: evaluate to the typed value of this row in the column that the cursor was on at the time that the expression column was added.
- **`cursorCol`**: evaluate to the typed value of this row for the column the cursor is on. Changes as the cursor moves for `=`. Uses the column from the time the calculation was made for `g=`, `gz=`, and `z=`.
Additional attributes can be added to sheets and columns.
`col` deliberately returns a Column object, but any other Column object is interpreted as the value within that column for the same row. For example, both `curcol` and `cursorCol` return values, not the object itself.
For example, this customizes addcol-expr to set the `curcol` attribute on the new ExprColumn to a snapshot of the current cursor column (at the time the expression column is added):
```
Sheet.addCommand('=', 'addcol-expr', 'addColumnAtCursor(ExprColumn(inputExpr("new column expr="), curcol=cursorCol))', 'create
new column from Python expression, with column names as variables')
```
Then, an expression can use `curcol` as though it referred to the value in the saved column.
`Tab` autocompletion when inputting an expression will cycle through valid column names only.
The following examples use the file [sample.tsv](https://raw.githubusercontent.com/saulpw/visidata/stable/sample_data/sample.tsv).
**Question** On which days have we sold more than 10 **Item**s?
1. Scroll to the **Units** column. Set the type of the **Units** column by pressing `#` (int).
2. Type `=` followed by `Units > 10`. A new column will be created. The cells in this column will contain the value **True** in rows where the number of **Units** are greater than 10 and **False** otherwise.
3. Move to the new derived column.
4. Type `|` followed by `True` to select all rows where there were more than 10 **Units** sold.
5. Press `"` to open a duplicate sheet with only those selected rows.
**Question** I have a dataset with separate columns for **Year**, **Month** and **Day**. How can I concatenate them into a single date column?
1. Type `=` followed by `Year + '-' + Month + '-' + Day`.
2. Set the type of the new derived column by pressing `@` (date).
3. Type `^` followed by `Date` to rename the column to **Date**.
**Question** I have a dataset with **Date** column that is missing a prefix of '2020-'. How do I add it to the **Date** column?
When using `=`, and wanting to reference the current column, we recommend using `curcol`. When using `g=`, `gz=`, and `z=`, we recommend cursorCol. `=`, unlike the others, is dynamic and changes with adjustment of underlying values, which means it will change along with the movement of the cursor (tracked by `cursorCol`). `curcol` is a special attribute of a new **ExprColumn**, which remembers the cursorCol at the time of creation.
1. Move the cursor to **Date**.
2. Type `g=` followed by *f"2020-{cursorCol}"*.
**Question** I have a dataset with **file names**. How do I create a new column with the **file names** lower cased?
1. Move the cursor to **file names** column.
2. Type `=` followed by `curcol.casefold()`.
3. Move to the newly created column, and rename it with `^`, followed by the desired name.
---
## How to configure multiple columns
Properties of columns on the source sheet can be changed by using [standard editing commands](/man#edit) on its **Columns sheet** (accessed with `Shift+C`). In particular, it facilitates the selection of multiple columns, followed by utilising one of the `g`-prefixed commands to modify all of them.
For a full list of available commands, see the [man page](/man#columns). Some example workflows follow.
The following examples use the file [sample.tsv](https://raw.githubusercontent.com/saulpw/visidata/stable/sample_data/sample.tsv).
###### How to set multiple statistical aggregators
**Question** What is the average daily revenue from sales of each **Item**?
1. Set the type of the **Units** column by pressing `#` (int).
2. Set the type of the **Total** column by pressing `%` (float).
3. Press `Shift+C` to open the **Columns sheet**.
4. Press `s` or `t` on the rows referencing the source sheet **Units** column and the **Total** column to select them.
5. Type `g+` followed by `avg` to add a **avg** statistical aggregator to the selected rows.
6. Press `q` to exit and return to the source sheet.
7. Scroll to the **Item** column. Press `Shift+F` to open the **Frequency table**.
**Question** What are the daily average and sum total number of **Units** sold for each **Item**?
1. Press `Shift+C` to open the **Columns sheet**.
2. Move the cursor to the row referencing the source sheet **Units** column.
a. Press `s` or `t` to select it.
b. Set the type for the source sheet **Units** columns by pressing `g#` (int).
c. Move the cursor to the **aggregators** column.
d. Type `e` to enter edit mode, followed by *sum avg*.
3. Press `q` to exit and return to the source sheet.
4. Move the cursor to the **Item** column. Press `Shift+F` to open the **Frequency table**.
---
---
eleventyNavigation:
key: Checklists for Contributing to VisiData
order: 99
---
## [Submitting a Core Loader](#loader) {#loader}
A deeper explanation of all of these steps can be found [in the loaders api documentation](https://www.visidata.org/docs/api/loaders.html).
- Create an `open_foo` function that returns the new `FooSheet`.
- Set an appropriate `rowtype` string.
- Provide a `# rowdef: ` comment. This describes the structure of a row (e.g. its base class) in a **Sheet**.
- If the loader's dependencies are not part of Python3 stdlib, note the additional dependencies in the `requirements.txt` (include a comment adjacent to the dep with the name of the loader).
- Check in a small sample dataset, in that format, to the `sample_data` folder
- Add a `load-foo.vd` to `tests/`. `load-foo.vd` should simply open the checked-in sample dataset and have a simple interaction if the source includes multiple tables.
- After replaying `vd load-foo.vd`, save the final sheet as `load-foo.tsv`. Save `load-foo.tsv` in `tests/golden/`.
- add a section on the loader to the [formats.jsonl](https://github.com/saulpw/visidata/blob/develop/dev/formats.jsonl).
## [Submitting an External Plugin](#plugins) {#plugins}
A deeper explanation of all of this framework can be found [in the plugins api documentation](https://www.visidata.org/docs/api/plugins.html).
- Host a single Python file containing all of the plugin's code.
- In the https://github.com/visidata/dlc/blob/stable/plugins.jsonl file in the `visidata:dlc` repo, add a row for each plugin with all of the necessary information.
---
eleventyNavigation:
key: Creating sheets, rows and columns
order: 8
Update: 2021-11-18
Version: VisiData 2.7.1
---
## How to set up a sheet for data collection
1. Type `Shift+A` to open a new blank sheet with one column.
2. Press
a. `a` to add one blank row.
**or**
b. `ga` followed by a *number* to add that many blank rows.
---
## How to add a new blank column
1. Press
a. `za` to add one blank column.
**or**
b. `gza` followed by a *number* to add that many blank columns.
2. Press `^` to edit the column name.
---
## How to fill a column with a range of numbers
1. Press `gs` to select all rows (or use other commands to select a subset of rows to fill).
2. Move the cursor to the column to be filled.
3. Press `gi`.
## How to edit a cell
1. Press `e` to edit an individual cell.
2. Type in the new value.
3. Press `Enter` to accept the value.
---
## How to move the cursor to the next cell after a successful edit
1. Press `Shift+Arrow` to accept the current value and move the cursor into edit mode in the next cell.
---
---
eleventyNavigation:
key: Customizing VisiData
order: 12
Updated: 2023-11-18
Version: VisiData v3.0
---
For a primer on configuring VisiData through setting options, see [jsvine's tutorial](https://jsvine.github.io/intro-to-visidata/advanced/configuring-visidata/).
## How to configure commands {#commands}
The **.visidatarc** in the user's home directory is plain Python code, and can contain additional commands or key bindings.
(Alternatively, since v2.9, VisiData has [XDG support](https://github.com/saulpw/visidata/pull/1420). If `$XDG_CONFIG_HOME` is set and the file `"$XDG_CONFIG_HOME"/visidata/config.py` exists, this will be loaded as the user's default configuration file.)
Longnames are names given to executable commands for ease of keystroke remapping. For example, the longname `select-row` is assigned to commands which select the current row in a sheet. On default, this longname is bound to the keystroke `s`.
From within VisiData, type `z Ctrl+H` to open the **Commands Sheet**. This is a reference for all of the commands available on the current sheet. For a deeper exploration of commands, check out [API reference manual](https://www.visidata.org/docs/api/commands.html).
### Setting/changing keybindings for existing commands
1. Learn the longname for a command. Longnames are usually 2-3 words, separated by hyphens. The first word is usually a verb, and the second usually a noun. When a command is executed, its longname appears in the lower right status, next to its keystroke. Alternatively, you can `z Ctrl+H` to open the **Commands Sheet** and discover the longname for the command in question.

2. a) To create a global keybinding, add `bindkey(keystroke, longname)` to your **.visidatarc**.
b) To set the binding for a particular sheet type, add `<Sheet>.bindkey(keystroke, longname)` to your **.visidatarc**, where `<Sheet>` is a **SheetType**.
~~~
Warning: bindings defined in a .visidatarc will overwrite default ones.
~~~
#### Example: Bind `i` to edit-cell globally
In VisiData, pressing `e` enters edit mode for the current cell. Seasoned vim users might prefer to press `i` instead.
1. Open `~/.visidatarc` in an editor.
2. Add the line `TableSheet.bindkey('i', 'edit-cell')` to globally bind the keystroke `i` to the longname `edit-cell`.
3. Launch VisiData, and press `i`.
#### Example: Unbind `i` from addcol-incr globally
If the above instructions are followed, a message will pop up that says "`i` was already bound to `addcol-incr`.
To unbind `i` before binding it:
1. Open `~/.visidatarc` in an editor.
2. Add the line `TableSheet.unbindkey('i')` before any piece of code where it is re-bound.
3. Launch VisiData.
### Creating new commands
At minimum, `<Sheet>.addCommand` requires a longname and execstr.
For example, to define a new command:
~~~
Sheet.addCommand('^D', 'scroll-halfpage-down', 'cursorDown(nScreenRows//2); sheet.topRowIndex += nScreenRows//2')
~~~
Commands and keybindings are set on a particular Sheet Type in the class hierarchy. Use `BaseSheet` for commands which don't need a sheet at all--these will apply to all sheets. Commands and bindings on more specific sheets will override more generic ones. `Sheet` is a generic table, `ColumnsSheet` would be for the columns sheet, `FreqTableSheet` for frequency tables, and so on.
### Adding custom aggregators {#aggregators}
Aggregators allow you to gather the rows within a single column, and interpret them using descriptive statistics. VisiData comes pre-loaded with a default set like mean, stdev, and sum.
To add your own custom aggregator `name`, add the following to your `.visidatarc`.
vd.aggregator('name', func, type=float)
Where `func` is a function of the form:
```
def func(list):
return value
```
The `type` parameter is optional. It allows you to define the default type of the aggregated column.
Here is an example, that adds an aggregator for [numpy's internal rate of return](https://numpy.org/devdocs/reference/generated/numpy.irr.html) module.
```
import numpy as np
vd.aggregator('irr', np.irr, type=float)
```
**Bonus: How to choose which aggregators are columns within the DescribeSheet?**
Any numeric aggregator can be added!
Supply a space-separated list of aggregator names to `options.describe_aggrs` in your .visidatarc.
```
options.describe_aggrs = 'mean stdev irr'
```
### Turning off motd {#motd}
By default, the first time each day that VisiData is used, it downloads a single small file of startup messages.
This network request can be turned off by adding `options.motd_url=''` to your `~/.visidatarc`.
If you do decide to turn it off, we encourage you to [donate](https://www.patreon.com/saulpw/posts) to [support VisiData](https://github.com/sponsors/saulpw).
---
eleventyNavigation:
key: Editing Contents
order: 6
Update: 2018-08-19
Version: VisiData 1.3.1
---
## How to edit cells
For a summary of all editing commands, see the [man page](/man#edit).
Command Operation
-------- ----------
`e` edit contents of **current cell**
`ge` *text* set contents of **current column for selected rows** to *text*
`g*` *regex*/*subst* replace matching *regex* in **current column for selected rows** with *subst*
`g=` *expr* evaluate Python *expr* over each selected row and set **current column** to the result
## note!
Modifications made to rows on derived sheets will be reflected on the source sheets. This includes the Frequency Table: editing the key column there will change all instances on the source sheet, and if that sheet is derived from another source sheet, it will be reflected there, and so on.
This does not apply to adding or deleting rows, only changes to existing rows.
## Commands while editing
While in editing mode, or anytime VisiData expects input (with e.g. `=`, `;`), typical readline commands become available:
Command Operation
-------- ----------
`Enter` accepts input
`Ctrl+C`/`Esc` aborts input
`Ctrl+O` opens external $EDITOR to edit contents
`Ctrl+R` reloads initial value
`Ctrl+A`/`Ctrl+E` moves to beginning/end of line
`Backspace` deletes previous character
`Up`/`Down` sets contents to previous/next in history
`Tab`/`Shift-Tab` autocompletes input (when available)
---
## How to rename columns
Command Operation
-------- ----------
`^` edits name of **current** column
`g^` sets names of **all unnamed visible** columns to contents of **selected** rows (or **current** row)
`z^` sets name of **current** column to contents of **current** cell
`gz^` sets name of **current** column to combined contents of **current** column for **selected** rows
In most cases, `^` is the preferred command. Examples which demo `^` can be seen in [Columns](/docs/columns#derived) and [Group](/docs/group#frequency).
###### How to set the header in an Excel sheet?
For most filetypes (e.g. csv, tsv, xls(x)) the loaders assume that the dataset's first `options.header` rows contain the column names.
If the Excel file has multiple sheets with varying number of header rows:
1. Pass `--header=0` while loading the file.
~~~
vd file.xlsx --header=0
~~~
2. For each sheet, press `s` or `t` to select the rows which represent the header rows.
3. Press `g^` to set the names of the headers to the contents of selected rows.
###### How to rename columns using the Columns sheet
1. Press `Shift+C` to open the **Columns sheet**.
2. Within the **name** column, move the cursor to the row which represents the source sheet.
3. Type `e` and then input *the new column name*. Press `Enter`.
4. Press `q` to return to the source sheet and see the renamed column.
---
---
eleventyNavigation:
key: Supported Formats
order: 99
---
| filetype | format | VisiData_loader | VisiData saver | version_added | created | creator | PyPI dependencies |
| --------------------- | ---------------------------------------------- | --------------- | ---------------------------- | ------------- | ------- | ------------------------------------------------------------- | -------------------- |
| [csv](#csv) | Comma\-Separated Values | 0\.28 | displayed text | 0\.28 | 1972 | | |
| [json](#json) | Javascript Object Notation \(JSON\) | 0\.28 | typed | 0\.28 | 2001 | Douglas Crockford | |
| [tsv](#tsv) | Tab\-Separated Values | 0\.28 | displayed text | 0\.28 | | | |
| xlsx | Excel spreadsheets | 0\.28 | | 0\.28 | 1987 | Microsoft | openpyxl |
| zip | ZIP archive format | 0\.28 | | 0\.28 | 1989 | PKWARE | |
| hdf5 | Hierarchical Data Format | 0\.28 | | 0\.28 | 199x | NCSA | h5py |
| [sqlite](#sqlite) | sqlite | 0\.42 | | 0\.42 | 2000 | D\. Richard Hipp | |
| xls | Excel spreadsheets | 0\.42 | | 0\.42 | 1987 | Microsoft | xlrd |
| [fixed](#fixed) | fixed width text | 0\.97 | | 0\.97 | | | |
| [postgres](#postgres) | PostgreSQL database | 0\.97 | | 0\.97 | 1996 | | |
| [imap](#imap) | Internet Message Access Protocol | 2\.12 | | 2\.12 | 1988 | | |
| [vd](#vd) | VisiData command log (TSV) | 0\.97 | yes | 0\.97 | 2017 | VisiData | |
| [mbtiles](#mbtiles) | MapBox Tileset | 0\.98 | | 0\.98 | 2011 | MapBox | mapbox\-vector\-tile |
| pbf | Protocolbuffer Binary Format | 0\.98 | | 0\.98 | 2011 | OpenStreetMap | |
| [shp](#shp) | Shapefile geographic data | 0\.98 | | 0\.98 | 1993 | ESRI | pyshp |
| [html](#html) | HTML tables | 0\.99 | displayed text | 0\.99 | 1996 | Dave Raggett | lxml |
| md | markdown table | | displayed text | 1\.1 | 2008 | | |
| [png](#png) | Portable Network Graphics \(PNG\) image | 1\.1 | from png | 1\.1 | 1996 | PNG Development Group | pypng |
| [ttf](#ttf) | TrueType Font | 1\.1 | | 1\.1 | 1991 | Apple | fonttools |
| [dot](#pcap) | Graphviz diagram | | from pcap | 1\.2 | 1991 | | |
| dta | Stata | 1\.2 | | 1\.2 | 1985 | StataCorp | pandas |
| [geojson](#shp) | Geographic JSON | 2\.2 | yes \(from shp and geojson\) | | 2008 | http://geojson\.org/ | |
| sas7bdat | Statistical Analysis System \(SAS\) | 1\.2 | | 1\.2 | 1976 | SAS Institute | sas7bdat |
| sav | SPSS statistics | 1\.2 | | 1\.2 | 1968 | SPSS Inc | |
| spss | SPSS statistics | 1\.2 | | 1\.2 | 1968 | SPSS Inc | savReaderWriter |
| xpt | Statistical Analysis System \(SAS\) | 1\.2 | | 1\.2 | 1976 | SAS Institute | xport |
| [jsonl](#json) | JSON Lines | 1\.3 | typed | 1\.3 | 2013 | Ian Ward | |
| [pandas](#pandas) | all formats supported by pandas library | 1\.3 | | 1\.3 | 2008 | Wes McKinney | pandas |
| parquet | Apache Parquet | 1\.3 | yes | 3\.0 | 2013 | Apache Software Foundation | pyarrow or pandas |
| [pcap](#pcap) | network packet capture | 1\.3 | | 1\.3 | 1988 | LBNL | dpkt dnslib |
| pyprof | Python Profile data | 1\.3 | | 1\.3 | | | |
| [xml](#xml) | eXtensible Markup Language \(XML\) | 1\.3 | from xml | 1\.3 | 1998 | W3C | lxml |
| yaml | YAML Ain't Markup Language \(YAML\) | 1\.3 | | 1\.3 | 2001 | Clark Evans | PyYAML |
| frictionless | Frictionless Data | 2\.0 | | 2\.0 | | OpenKnowledge Institute | datapackage |
| jira | JIRA/Confluence table markup | | displayed text | 2\.0 | | Atlassian | |
| npy | NumPy array format | 2\.0 | typed | 2\.0 | | | numpy |
| tar | Unix Tape Archive | 2\.0 | | 2\.0 | | | |
| usv | Unicode\-Separated Value | 2\.0 | displayed text | 2\.0 | 1993 | Unicode | |
| xlsb | Excel binary format | 2\.0 | | 2\.0 | | Microsoft | xlrd |
| [vdj](#vd) | VisiData command log (JSON) | 2\.0 | yes | 2\.0 | 2020 | VisiData | |
| [mysql](#mysql) | MySQL | 2\.0 | | | 1995 | MySQL AB | MySQLdb |
| pdf | Portable Document Format | 2\.0 | | | 1993 | Adobe | pdfminer\.six |
| vcf | Virtual Contact File \(vCard\) | 2\.0 | | | 1995 | Versit Consortium | |
| rec | recutils database file | 2\.0 | displayed text | | 2010 | Jose E\. Marchesi | |
| eml | Multipurpose Internet Mail Extensions \(MIME\) | 2\.0 | | | 1996 | Nathaniel Borenstein and Ned Freed | |
| [vds](#vd) | VisiData Sheet | 2\.2 | yes | 2\.2 | 2021 | VisiData | |
| ods | OpenDocument Spreadsheet | 2\.7 | | | 2006 | [OASIS](<https://en.wikipedia.org/wiki/OASIS_(organization)>) | odfpy |
| lsv | awk-like key-value line-separated values | 2\.7 | | v2\.7 | | | |
| arrow | Arrow IPC file format | 2\.9 | | | 2016 | Apache Software Foundation | pyarrow |
| arrows | Arrow IPC streaming format | 2\.9 | | | 2016 | Apache Software Foundation | pyarrow |
| [vdx](#vd) | VisiData command log (text) | 2\.11 | yes | 2\.11 | 2022 | VisiData | |
| mailbox | All formats supported by mailbox | 3\.0 | | | 1974 | | mailbox |
| jrnl | CLI journal | 3\.0 | yes | 3\.0 | 2012 | Micah Jerome Ellison | |
| [reddit](#api) | Reddit API | 3\.0 | | | 2005 | | praw |
| [matrix](#api) | Matrix API | 3\.0 | | | 2014 | The Matrix.org Foundation | matrix\_client |
| [zulip](#api) | Zulip API | 3\.0 | | | 2012 | Kandra Labs, Inc | zulip |
| [airtable](#api) | Airtable API | 3\.0 | | | 2012 | | pyairtable |
| orgmode | Emacs Orgmode format | 3\.0 | yes | 3\.0 | 2003 | Carsten Dominik | |
| s3 | Amazon S3 paths and objects | 3\.0 | | | 2006 | Amazon | s3fs |
| fec | Federal Election Commission | 3\.0 | | | | Federal Election Commission | fecfile |
| f5log | Parser for f5 logs | 3\.0 | | | | f5 | |
| toml | Tom's Obvious Minimal Language | 3\.0 | | | | Tom Preston-Werner | tomllib |
| conll | CoNLL annotation scheme | 3\.0 | | | | Conference on Natural Language Learning | pyconll |
| [grep](#grep) | grep command-line utility | 3\.1 | | | 1973 | AT&T Bell Laboratories | |
# Extra notes about formats
## tsv (Tab Separated Values), as simple as it gets
- delimiter: field delimiter to use for tsv/usv filetype (default: .)
- row_delimiter: row delimiter to use for tsv/usv filetype (default: \n)
- tsv_safe_newline: replacement for newline character when saving to tsv (default: )
- tsv_safe_tab: replacement for tab character when saving to tsv (default: .)
Use `-f usv` for Unicode separators U+241F and U+241E.
Use `-f tsv` for awk-like records.
Use `--delimiter=` (an empty string) to make '\0' the value separator.
Use `--row-delimiter=` to make '\0' the row separator.
## csv (Comma Separated Values) for maximum compatibility {#csv}
.csv files are a scourge upon the earth, and still regrettably common.
All `csv_*` options are passed unchanged into csv.reader() and csv.writer().
- csv_dialect: dialect passed to csv.reader (default: excel)
- Accepted dialects are `excel-tab`, `unix`, and `excel`.
- csv_delimiter: delimiter passed to csv.reader (default: ,)
- csv_quotechar: quotechar passed to csv.reader (default: ")
- csv_skipinitialspace: skipinitialspace passed to csv.reader (default: True)
- csv_escapechar: escapechar passed to csv.reader (default: None)
- csv_lineterminator: lineterminator passed to csv.writer (default: \n)
## Saving TSV/CSV files
- save_filetype: specify default file type to save as (default: tsv)
- safety_first: sanitize input/output to handle edge cases, with a performance cost (default: False)
## Useful options for text formats in general
- regex_skip: regex of lines to skip in text sources (default: )
- save_encoding: encoding passed to codecs.open when saving a file (default: utf8)
## fixed {#fixed}
- loader-specific options
- `fixed_rows` (default: 1000) number of rows to detect fixed width columns from
- `fixed_maxcols` (default: 0) max number of fixed-width columns to create (0 is no max)
## json {#json}
- loader-specific options
- `json_indent` (default: None) indent to use when saving json
- `json_sort_keys` (default: False) sort object keys when saving to json
- `default_colname` (default: '') column name to use for non-dict rows
- Cells containing lists (e.g. `[3]`) or dicts (e.g. `{3}`) can be expanded into new columns with `(` and unexpanded with `)`.
- All expanded subcolumns must be closed (with `)`) to retain the same structure.
- Support for jsonla was added in 3.0.
## xml {#xml}
- `v` show only columns in current row attributes
- `za` add column for xml attributes
## pcap {#pcap}
- loader-specific options
- `pcap_internet` (default: 'n') (y/s/n) if save_dot includes all internet hosts separately (y), combined (s), or does not include the internet (n)
## postgres {#postgres}
- loader-specific options
- `postgres_schema` (default: 'public') the desired schema for the Postgres database
- `vd postgres://`*username*`:`*password*`@`*hostname*`:`*port*`/`*database* opens a connection to the given postgres database.
## imap {#imap}
- `vd "imap://[email protected]:[email protected]"` opens a connection to the IMAP server
- e.g. `vd "imap://[email protected]:[email protected]:993"`
- e.g. `vd "imap://[email protected]@imap.gmail.com"`
- note that you don't specify a password for gmail here -- instead, you will be prompted to follow some instructions
### using VisiData as a pager within psql
In psql:
~~~
\pset format csv
\pset pager always
\setenv PSQL_PAGER 'vd -f csv'
\pset pager_min_lines
~~~
## sqlite {#sqlite}
- supports saving for CREATE/INSERT (not wholesale updates)
- `z Ctrl+S` to commit any `add-row`/`edit-cell`/`delete-row`
## mysql {#mysql}
- loader-specific requirements
- working mysql / mariadb installation or at least the `libmysqlclient-dev` package (ubuntu; name might be different on other platforms)
- `mysqlclient` python module in path or virtual environment (`pip install mysqlclient`)
- `vd mysql://`*username*`:`*password*`@`*hostname*`:`*port*`/`*database* opens a connection to the given mysql / mariadb database.
## html {#html}
- loader-specific options
- `html_title` (default: `'<h2>{sheet.name}</h2>'`) table header when saving to html
- load all `<table>`s in a web page as VisiData sheets.
## shp {#shp}
- Can be edited in raw data form. Images can be plotted with `.` (dot).
- **.shp** files can be saved as **geoJSON**.
## mbtiles {#mbtiles}
- Can be edited in raw data form. Images can be plotted with `.` (dot).
## png {#png}
- Can be edited in raw data form. Images can be plotted with `.` (dot).
## ttf {#ttf}
- Can be edited in raw data form. Images can be plotted with `.` (dot).
## pandas {#pandas}
VisiData has an adapter for **pandas**. To load a file format which is supported by **pandas**, pass `-f pandas data.foo`. This will call `pandas.read_foo()`.
For example:
~~~
vd -f pandas data.parquet
~~~
loads a parquet file. When using the **pandas** loader, the `.fileformat` file extension is mandatory.
To load a hierarchy of parquet files located in folder `data/`, run
~~~
vd -f parquet data/
~~~
or rename the directory to `data.parquet` and run
~~~
vd data.parquet -f pandas
~~~
This should similarly work for any format that has a `pandas.read_format()` function.
## [VisiData Internal Formats](../internal_formats) (.vd, .vdj, .vdx, .vds) {#vd}
- .vd/vdj/.vdx are command log formats suitable for VisiData scripts and macros
- .vds is a multisheet save format that includes some sheet and column metadata
## API (reddit, matrix, zulip, airtable) {#api}
- loader-specific requirements
- require setting authentication information in `~/.visidatarc` or on the CLI
- launch the loader with `-f loadername` for steps to obtain and configure authentication credentials
## Grep {#grep}
A .grep file is a JSON lines file. It can be in two formats:
1) A simple container with three fields:
file - a string with the path to the file where the match was found (absolute or relative path)
line_no - an integer with the line number in the file where the match was found,
text - a string with the text of the line that matched.
2) ripgrep `grep_printer` format, described here:
https://docs.rs/grep-printer/latest/grep_printer/struct.JSON.html
---
eleventyNavigation:
key: Frequency Table Reference
order: 99
---
the below also applies to the [PivotSheet]
## binning
### discrete binning
-
### numeric binning
- separate error/null bins
### bin display
### number of bins
### errors
## commands tables
- inline commands.tsv entries
- global: zF gF F
- FreqTable
- ENTER/gENTER
- selection propagation
- freeze-sheet with g' to get an plain data sheet with the same data
## options table
- `disp_histogram`
- `disp_histlen`
- `histogram_bins`
## aggregators
# Internals
- source is the source sheet
- rowdef: FreqRow(pivot)
- .pivotrows = { aggvalue: list(values) }
- numeric bin keys
- nonKeyVisibleCols
- [PivotTable] Column.aggvalue
- addAggregateCols
- groupRows
# Using Gmail with OAuth 2.0
## Why
As of May 30 2022, Google [doesn't allow](https://support.google.com/accounts/answer/6010255?hl=en) you to log into your IMAP gmail account using only a username/password combination.
So to open your Gmail in Visidata you need to create a Google API App, attach some scopes to it, generate a client ID and secret, then let Visidata use that client ID and secret (in a json file).
## How
First, go to the [Google Console](https://console.cloud.google.com/apis/dashboard)
<br/>

<br/>
And click `CREATE PROJECT`
---

Give the project a name then click `CREATE`
---
Open a new tab and go to the [API Library](https://console.cloud.google.com/apis/library)
<br/>

Search for `gmail`
---

Click the search result `Gmail API`
---

Click `ENABLE`
---
Go back to your first tab
On the left, select `OAuth consent screen`

Then select `External` and click `CREATE` to create an App
---

Give the App a name and input your gmail address.
---

Click `ADD OR REMOVE SCOPES`
---

Search for `gmail`
---

Click the checkbox by the row with the scope value `https://mail.google.com/`
Then scroll to the bottom
---

And click `UPDATE`
---

You should see your selected scopes.
Click `SAVE AND CONTINUE`
---

Click `ADD USERS`
---

Type in your gmail email address then click `ADD`
---

On the left, click `Credentials`
---

Near the top click `CREATE CREDENTIALS`
Then click `OAuth client ID`
---

Select the application type `Desktop App` and give your OAuth 2.0 client a name then click `CREATE`
---

Click `DOWNLOAD JSON` and move the downloaded file into the visidata project directory at the path `vdplus/api/google/` and call the file `google-creds.json`
---
Now, on the command line run the equivalent for you:
`vd "imap://[email protected]@imap.gmail.com"`
Then you should get a web browser popup:

Select the account whose email address you have been using in these instructions.
---

Click `Select all`
---

See your gmail in Visidata.
<Chef's Kiss>
---
---
eleventyNavigation:
key: Drawing graphs
order: 10
Update: 2018-03-17
Version: VisiData 1.1
---
Graphs in VisiData can be used to visualise the relationship between numeric dependent variables vs a numeric independent variable. Optionally, a second independent variable, which is categorical, adds an additional colored scatter plot for each category.
This example uses the file [StatusPR.csv](https://raw.githubusercontent.com/saulpw/visidata/stable/sample_data/StatusPR.csv).
<section id="hero">
<asciinema-player id="player" poster="npt:0:30" rows=27 src="../casts/pivot-graphs.cast"></asciinema-player>
<script type="text/javascript" src="/asciinema-player.js"></script>
</section>
---
## How to graph a single column
1. Press `!` to set a column as the x-axis. This column must be numeric.
2. Set that column to a numeric type by pressing `#` (int), `%` (float), `$` (currency), or `@` (date).
3. Optional: Press `!` on a categorical key column to add it as an additional independent variable.
4. Set the type of the column you wish to set as the dependent variable with a numeric type.
5. Press `.` (dot=plot) on that column.
---
## How to graph multiple columns
1. Press `!` to set a column as the x-axis. This column must be numeric.
2. Set that column to a numeric type.
3. Optional: Press `!` on a categorical key column to add it as an additional independent variable.
4. Type all of the columns you wish to set as the dependent variables with a numeric type.
5. Press `-` (dash) to hide any numeric columns you don't wish graphed.
6. Press `g.`.
---
##How to interact with graphs
###### With the keyboard
Command(s) Operation
---------- ----------
`1`-`9` toggles display of each scatterplot layer
`h` `j` `k` `l` moves the cursor
`H` `J` `K` `L` expands and shrinks the cursor
`+` `-` increases/decreases the zoomlevel, centered on the cursor
`zz` zooms into the cursor
`_` (underscore) zooms to fit the full extent
`s` `t` `u` selects/toggles/unselects rows on the source sheet contained within the cursor
`gs` `gt` `gu` selects/toggles/unselects rows visible as points on the screen
` d` deletes rows on the source sheet contained within the cursor
`gd` deletes all rows visible as points on the screen
`Enter` opens sheet of source rows contained within the cursor
`gEnter` opens sheet of source rows which are visible on screen
`v` toggles the visibility of graph labels
###### With the mouse
Command Operation
------- -----------
Left-click and drag sets the cursor
Right-click and drag scrolls
Scroll-wheel zooms in/out
---
---
eleventyNavigation:
key: Terminal Graphics in VisiData
order: 99
Updated: 2017-12-06
Version: VisiData 1.0
---
VisiData can display low-resolution terminal graphics with a reasonable amount of user interactivity.
The current implementation uses braille Unicode characters (inspired by [asciimoo/drawille](https://github.com/asciimoo/drawille)). [Unicode blocks](https://en.wikipedia.org/wiki/Block_Elements) or the [sixel protocol](https://en.wikipedia.org/wiki/Sixel) may be supported in the future.
## Class hierarchy
- `Sheet`: the drawable context base class (part of core vdtui.py)
- `Plotter`: pixel-addressable display of entire terminal with (x,y) integer pixel coordinates
- `Canvas`: zoomable/scrollable virtual canvas with (x,y) coordinates in arbitrary units
- `InvertedCanvas`: a Canvas with inverted y-axis
- `Graph`: an InvertedCanvas with axis labels, a legend, and gridlines
### Summary
- The async `Graph.reload()` iterates over the given `sourceRows` (from its `source` Sheet) and calls `Canvas.polyline()` to indicate what to render.
- `Canvas.refresh()` triggers an async `Canvas.render()`, which iterates over the polylines and labels and calls the `Plotter.plot*` methods.
- The `VisiData.run()` loop calls `Plotter.draw()`, which determines the characters and colors to represent the pixels.
### class `Plotter`
A `Plotter` is a [`Sheet`](/design/sheet) with a pixel-addressable drawing surface that covers the entire terminal (minus the status line). Pixels and labels are plotted at exact locations in the terminal window, and must be recalculated after any zoomlevel change or terminal resizing.
`Plotter.draw(scr)` is called multiple times per second to update the screen, and chooses a curses attribute for each pixel.
By default, the most common attr is chosen for each pixel, but if `options.disp_graph_pixel_random` is set, an attr will be randomly chosen from the naturally weighted set of attrs (this may cause blocks of pixels to flicker between their possible attrs).
If an attr is in the `Canvas.hiddenAttrs` set, then it is not considered for display at all (and its rows will be ignored during selection).
All Plotter coordinates must be integer numbers of pixels.
[For performance reasons, they are presumed to already be integers, to save unnecessary calls to `round()`.]
Methods which plot multiple pixels on the canvas should be careful to gauge the display correctly; simply calling `round()` on each calculated float coordinate will work but can cause display artifacts.
#### `Plotter` methods
For Plotter methods, `x` and `y` must be integers, where `0 <= x < plotwidth`, and `0 <= y < plotheight`. `(0,0)` is in the upper-left corner of the terminal window.
Pixels can be plotted directly onto a Plotter with these methods:
- `Plotter.plotpixel(x, y, attr, row=None)`
- `Plotter.plotline(x1, y1, x2, y2, attr, row=None)`
- `Plotter.plotlabel(x, y, text, attr)`
`attr` is a [curses attribute](/design/color), and `row` is the object associated with the pixel.
The above `plot*` methods append the `row` to `Plotter.pixels[y][x][attr]`.
These properties and methods are also available:
- `Plotter.plotwidth` is the width of the terminal, in pixels.
- `Plotter.plotheight` is the height of the terminal, in pixels.
- `Plotter.rowsWithin(bbox)` generates the rows plotted within the given region.
- `Plotter.hideAttr(attr, hide=True)` adds attr to `hiddenAttrs` if `hide`, and removes it otherwise.
- `Plotter.refresh()` is called whenever the screen size changes, and should also be invoked whenever new content is added.
`rowsWithin` takes a `Box` object (described below). The `Box` class is otherwise unused by the Plotter.
### class `Canvas`
A **`Canvas`** is a `Plotter` with a virtual surface on which lines and labels can be rendered in arbitrary units.
The onscreen portion (the area within the visible bounds) is scaled and rendered onto the `Plotter`, with the minimum coordinates in the upper-left [same orientation as `Plotter`].
The [`Canvas` user interface](/docs/graph#commands) supports zoom, scroll, cursor definition, and selection of the underlying rows. The `source` attribute should be the Sheet which owns the plotted `row` objects.
A call to `Canvas.refresh()` will trigger `Canvas.render()`, which is decorated with `@asyncthread` as it may take a perceptible amount of time for larger datasets. Any active `render` threads are cancelled first.
#### `Box` and `Point` helper classes
While the Plotter API requires literal integer values for `x`/`y` and `width`/`height` parameters, `Canvas` methods generally take float values contained in either `Box` or `Point` classes.
##### `Point`
`Point` is simply a container for an `(x,y)` coordinate (passed to the constructor). The individual components are stored as `.x` and `.y`, and the computed `.xy` property will return `(x,y)` as a simple tuple. `Point` can also stringify itself reasonably.
##### `Box`
`Box` is effectively a rectangle stretching over some area of the canvas. The constructor takes `(x,y,w,h)`, but a `Box` can also be constructed using the `BoundingBox(x1,y1,x2,y2)` helper. [Note that in the BoundingBox case, the order of the individual points is not guaranteed; the individual coordinates may be swapped for convenience.]
`Box` has these members and properties:
- `xmin` and `ymin`: the minimum coordinates of the area.
- `xmax` and `ymax`: the maximum coordinates of the area.
- `xcenter` and `ycenter`: the central coordinates of the area.
- `w` and `h`: the width and height of the area.
- `xymin`: returns `Point(xmin,ymin)`.
- `center`: returns `Point(xcenter,ycenter)`.
- `contains(x, y)`: returns True if `(x,y)` is inside the bounding box.
#### `Canvas` methods
- `Canvas.polyline(vertices, attr, row=None)` adds a multi-segment line from the list of (x,y) `vertices`. One vertex draws a point; two vertices draws a single line. Note that the vertices are *not* Point objects (unlike parameters for other methods).
- `Canvas.label(xy, text, attr, row=None)` adds `text` at `xy` (Point in canvas units).
- `Canvas.fixPoint(xyplotter, xycanvas)` sets the position of the `visibleBox` so that `xycanvas` (Point in Canvas units) is plotted at `xyplotter` (Point in Plotter units).
- `Canvas.zoomTo(bbox)` sets the visible bounds so the given canvas coordinates will fill the entire Plotter area. `aspectRatio` will still be obeyed.
- `Canvas.keyattr(key)` returns the `attr` for the given `key`, assigning a new color from `options.plot_colors` if `key` has not been seen before. These keys are plotted as legends on the upper right corner of the canvas. The last color is given out for all remaining keys and is labeled "other".
- `Canvas.resetBounds()` needs to be called after some or all points have been rendered, but before anything can be plotted. It initializes the width and height of the canvas, visible area, and/or cursor.
- `Canvas.reset()` clears the canvas in preparation for `reload()`.
#### `Canvas` properties
- `Canvas.canvasBox` reflects the bounds of the entire canvas.
- `Canvas.visibleBox` defines the onscreen canvas area.
- `Canvas.cursorBox` defines the cursor region in canvas coordinates.
- `Canvas.zoomlevel` is a settable property, which sets the `visibleBox` size accordingly. `zoomlevel` of 1.0 makes the entire canvas visible. Does not change the position of the `visibleBox` (see `Canvas.fixPoint`).
- `Canvas.aspectRatio`, if set, maintains a proportional width and height of the `visibleBox` (considering also `plotwidth`/`plotheight`). `aspectRatio` of 1.0 should be square.
- `Canvas.canvasCharWidth` and `Canvas.canvasCharHeight` is the width and height of one terminal character, in canvas units.
These properties reserve an area of the Plotter that is outside the visibleBox:
- `Canvas.leftMarginPixels`
- `Canvas.rightMarginPixels`
- `Canvas.topMarginPixels`
- `Canvas.bottomMarginPixels`
During a [mouse event](/design/commands#mouse), these properties indicate the mouse position for the current mouse event:
- `Canvas.canvasMouse`: a Point in canvas coordinates
- `Plotter.plotterMouse`: a Point in plotter (pixel) coordinates
- `Sheet.mouseX` and `Sheet.mouseY`: individual values in curses (character) coordinates
### class `InvertedCanvas`
An `InvertedCanvas` is a `Canvas` with a few internal methods overridden, such that the Y axis is inverted. For an `InvertedCanvas`, the minimum coordinates are in the lower-left.
`InvertedCanvas` has not much else of interest. It should be completely interchangeable with `Canvas`.
### class `Graph`
A `Graph` is an `InvertedCanvas` with axis labels and/or gridlines.
- `Graph.__init__(name, sheet, rows, xcols, ycols)` constructor
- `sheet` is the `source` Sheet.
- `rows` is a list of the rows to iterate over (from the given `source`).
- `xcols` is a list of key columns forming the x-axis and color keys.
- `ycols` is a list of numeric columns to be plotted on the y-axs.
---
---
eleventyNavigation:
key: Grouping data and descriptive statistics
order: 7
Update: 2018-08-19
Version: VisiData 1.3.1
---
## How to set statistical aggregators for a single column
Aggregators provide summary statistics for grouped rows.
Command Operation
-------- ----------
`+` *aggregator* adds *aggregator* to current column
`z+` *aggregator* displays result of *aggregator* over values in selected rows for current column
The following statistical aggregators are available:
Aggregator Description
----------- ------------
`min` smallest value in the group
`max` largest value in the group
`avg`/`mean` average value of the group
`mode` most frequently appearing value in group
`median` median value in the group
`q3/q4/q5/q10` add quantile aggregators to group (e.g. q4 adds p25, p50, p75)
`sum` total summation of all numbers in the group
`distinct` number of distinct values in the group
`count` number of values in the group
`keymax` key of the row with the largest value in the group
`list` gathers values in column into a list
`stdev` standard deviation of values
The follow howtos will have examples of workflows involving grouping of data and statistical aggregation.
---
The following examples use the file [sample.tsv](https://raw.githubusercontent.com/saulpw/visidata/stable/sample_data/sample.tsv).
## How to group data (frequency table, pivot table, describe table,)
## How to make a pivot table frequency table, pivot table, describe table,)
<div class="asciicast">
<asciinema-player id="player" poster="npt:0:10" rows=27 src="../casts/pivot.cast"></asciinema-player>
<script type="text/javascript" src="/asciinema-player.js"></script>
</div>
1. Move to the column A with the independent variable, and press `!` to mark it as a key column to group by.
2. Move to a numeric column B, and press `+` to add an *aggregator* to that column, so that the aggregator will be applied to each group of values.
3. Make sure column B has a numeric type: int (`#`), float (`%`), currency (`$`), or date (`@`).
4. Move to the column C with the dependent categorical variable to be pivoted, and press `Shift+W` (`pivot`) to pivot on that column. The pivoted sheet then will have a column for each distinct value in the source column.
---
## [How to create a frequency chart](#frequency) {#frequency}
### How to make a histogram
**Question** How many of each **Item** were sold?
1. Move the cursor to the **Item** column.
2. Press `Shift+F` to open the **Frequency table**.
### How to use the Frequency table to view the results of statistical aggregation
**Question** What was the monthly revenue?
1. On the **OrderDate** column, type `;` followed by `(\d+-\d+)` to create a column with only the year and the month using regex capture groups.
2. Press `-` to hide the **OrderDate** column.
3. On the **OrderDate_re0** column, type `^` followed by `OrderDate` to rename it.
4. On the **Total** column, press `$` to set its type to currency.
5. Type `+` followed by `sum` to add a statistical aggregator to **Total**.
6. On the **OrderDate** column type `Shift+F` to open the **Frequency table**.
7. On the **OrderDate** column, press `[` to sort the table in chrononological order.
8. On the **sum_Total** column, type `^` followed by `Revenue` to rename the column.
---
### How to calculate some descriptive statistics
1. Press `Shift+I` to open the **Describe sheet**.
---
### How to filter for grouped rows
1. Press `Shift+F` to open the **Frequency table**.
2. Press `s` or `t` on the groups you are interested in to select those entries in the source sheet.
3. Press `q` or `Ctrl+^` to return to the source sheet.
4. Press `"` to open a duplicate sheet with selected rows.
**or**
1. Press `Shift+F` to open the **Frequency table**.
2. Press `Enter` on the grouping you are interested in to open a sheet of the source rows that are part of that group.
### How to filter for described rows
1. Press `Shift+I` to open the **Describe sheet**.
2. Use `zs` to select rows on source sheet which are being described in the cells of interest.
3. Press `q` or `Ctrl+^` to return to the source sheet.
4. Press `"` to open a duplicate sheet with selected rows.
**or**
1. Press `Shift+I` to open the **Describe sheet**.
2. Press `zEnter` open copy of source sheet with rows being described in the current cell of interest.
### How to filter for the rows aggregated in a pivot table
`Enter`/`zEnter` can both be used in the **Pivot table** to open a sheet of the source rows which are aggregated in the current pivot row/cell.
---
### How to combine cells in one for column for matching rows in another
This tutorial shows you how to go from this dataset:
field value
------ -----
A 1
A 2
B 3
C 4
C 5
to
field value
------ -----
A 1;2
B 3
C 4;5
in VisiData.
1. On the **value** column, type `+` followed by `list` to add to it a list aggregator.
2. Press `Shift+F` on the **field** column to open the **Frequency table**.
3. Type `=` followed by `';'.join(value_list)` to add an expression column with the joined values.
---
eleventyNavigation:
key: Getting Started
order: 1
---
## Getting started
* [VisiData video demo](https://youtu.be/N1CBDTgGtOU)
* [Installation](/install)
## Tutorials
* Beginner: [An Introduction to VisiData](https://jsvine.github.io/intro-to-visidata/) by [Jeremy Singer-Vine](https://www.jsvine.com/)
* Beginner: [Guida VisiData](https://ondata.github.io/guidaVisiData/) by [Andrea Borruso](https://twitter.com/@aborruso) ([onData association](https://twitter.com/ondatait))
* Intermediate/Advanced (English): [VisiData case study videos](https://www.youtube.com/watch?v=yhunJc8Nu4g&list=PLxu7QdBkC7drrAGfYzatPGVHIpv4Et46W&index=4) by creator [Saul Pwanson](http://saul.pw)
## References
* [quick reference guide](/man)
* all available commands and options
* also available as a manpage via `man vd` and from inside VisiData with `Ctrl+H`
* [VisiData Cheat Sheet](https://jsvine.github.io/visidata-cheat-sheet/en/)
## 'How to' recipes
* [Loading Data](/docs/loading)
* [Specifying a source file](/docs/loading#specifying-a-source-file)
* [Loading sources supported by pandas](/docs/loading#loading-sources-supported-by-pandas)
* [Opening an R data frame with VisiData](/docs/loading#opening-an-r-data-frame-with-visidata)
* [Loading multiple datasets simultaneously](/docs/loading#loading-multiple-datasets-simultaneously)
* [Accessing other loaded or derived sheets](/docs/loading#accessing-other-loaded-or-derived-sheets)
* [Converting a dataset from one supported filetype into another](/docs/loading#convert)
* [Navigation](/docs/navigate)
* rapidly scroll through a sheet
* search within a sheet
* move between sheets
* [Rows](/docs/rows)
* perform operations on a subset of rows
* filter rows
* filter a random subset of rows
* select rows where the current column is not null
* select rows where the current column is null
* move, copy and remove rows
* sort rows
* [Columns](/docs/columns)
* manipulate columns
* hide (remove) and unhide columns
* specify column types
* split a column
* expand columns that contain nested data
* create derivative columns
* configure multiple columns
* [Editing contents](/docs/edit)
* edit cells
* rename columns
* [Grouping data and descriptive statistics](/docs/group)
* set statistical aggregators
* create a pivot table
* create a frequency chart
* calculate descriptive statistics
* filter for grouped or described rows
* [Creating sheets, rows and columns](/docs/crud)
* configure the cursor to move right after a successful edit
* set up a sheet for data collection
* add a new blank column
* fill a column with a range of numbers
* [Combining datasets](/docs/join)
* perform a join
* append two datasets
* [Drawing graphs](/docs/graph)
* graph a single column
* graph multiple columns
* interact with graphs
* [How to save and replay a VisiData session](/docs/save-restore)
* [Customizing VisiData](/docs/customize)
* configure VisiData (user)
* configure VisiData (dev)
* have configurations persist
* configure commands
* [Plugins - extending VisiData functionality](/docs/api/plugins)
* [STDOUT pipe/redirect](/docs/pipes)
---
eleventyNavigation:
key: VisiData Internal Formats
order: 99
---
VisiData created these formats that it uses:
- .vd, .vdj, and .vdx to save a Command Log (for macros and replays);
- .vds to save/restore the current set of data sheets and columns.
All internal formats have comments being lines starting with `#`, so they can all be scripts on unix if they are executable and the first line starts with hash-bang (`#!`).
## .vd
.vd is the original replay format: a TSV save of the Command Log (`g Shift+D`). Deprecated in favor of .vdj.
## .vdj
.vdj is the next generation format, a JSONL of the Command Log.
This enables support for multi-input commands (where input is a dictionary) among other things.
Macros are stored in .vdj format (since 3.0). Macros from previous versions in .vd format are still accepted.
## .vdx
.vdx is an experimental format for the Command Log which does not require a data editor to create.
Since much of the time the sheet/col/row cursor position columns are blank, only the command longname and input are necessary to execute a command.
So the .vdx format is lines of commands with the command longnamefirst, and then a space and input (if used). Comments start with `#`.
The cursor can be moved specifically with the `col` and `row` commands.
This format is interesting for some use cases but not compelling enough to replace .vdj.
There is no current intent to replace the .vdj format with .vdx.
## .vds
.vds is a new, simple, multisheet format based on JSONL that includes some sheet metadata (mostly column definitions).
If you care only about the data and columns on the sheets, and not any provenance or exactitude or any of that stuff you get from going directly to the source, then you can save to .vds.
It should load generally to an index of the sheets, with each retaining the data and layout it was saved with, but without any history.
---
eleventyNavigation:
key: Combining datasets
order: 9
Update: 2020-10-27
Version: VisiData 2.0.1
---
## How to join two datasets
1. Open the datasets in VisiData.
a. `vd d1.tsv d2.tsv`
**or**
b. Press `o` and enter a filepath for each file.
2. Press `S` to open up the **Sheets Sheet**. Through here, you can navigate to every sheet by pressing `Enter` on the row it is referenced in.
3. Navigate to the sheets you want the join, and set their shared columns as key columns with `!`.
4. Press `S` to return to the **Sheets sheet**. Select the sheets you want to merge with `s`.
5. Optional: If performing a left outer join, use `Shift+J` or `Shift+K` to reorder the sheets. The first sheet will be the one for whom all rows will be retained.
6. Type `&` to open the join-chooser, and select your desired jointype with `Enter`.
jointype description
--------- -------------
`inner` keeps only rows which match keys on all sheets
`outer` keeps all rows from first selected sheet
`full` keeps all rows from all sheets (union)
`diff` keeps only rows NOT in all sheets
`extend` keeps all rows and retain **SheetType** from first selected sheet
`merge` Merges differences from other sheets into first sheet
## How to append two datasets
1. Open the datasets with VisiData.
2. Press `Shift+S` to open the **Sheets sheet**.
3. Use `s` or `t` to select the sheets to merge.
4. Type `&` and press `Enter` on `append` to concatenate the selected datasets.
---
eleventyNavigation:
key: Loading data
order: 2
parent: Getting Started
update: 2018-12-18
version: VisiData 1.5.1
---
## Specifying a source file
The first way to open a dataset in VisiData, specify it directly after invoking `vd`.
~~~
vd filename.ext
~~~
Alternatively, you can pipe or redirect data in through stdin.
~~~
ps aux | vd
vd - < sample.tsv
~~~
Finally, you can launch the [DirSheet](), navigate to the file you wish to load, and press `Enter`.
~~~
vd .
~~~
In VisiData, a [loader](/docs/api/loaders) is a module which directs how VisiData structures and engages with a particular data source. [These sources](/formats) are currently supported.
On default, the file extension determines which loader is used. Unknown filetypes are loaded as **Text sheets**. To force a particular loader, pass `-f` with the filetype or format name.
~~~
vd -f sqlite bar.db
ls -l | vd -f fixed
~~~
---
## Loading sources supported by pandas
VisiData has an adapter for pandas. To load a file format which is supported by pandas, execute `vd -f pandas data.foo`. This will call `pandas.read_foo()`.
For example:
~~~
vd -f pandas data.parquet
~~~
loads a parquet file. When using the pandas loader, the `.fileformat` file extension is mandatory.
Note that if you are using Python v3.7, then you will need to manually install pandas >=0.23.2 (our requirements.txt file installs v0.19.2 as the last version compatible with 3.4).
---
## Opening an R data frame with VisiData
[@paulklemm](https://github.com/paulklemm) has wonderfully developed a small `R` package which bridges the gap between `R` and VisiData.
To install `rvisidata` using [devtools](https://cran.r-project.org/web/packages/devtools/index.html) run:
~~~
devtools::install_github('paulklemm/rvisidata')
~~~
from within the `R` interpreter.
Any data frame can then be opened by VisiData:
~~~
vd(iris)
~~~
Please note, that this tool opens the data frame in readonly mode. Any changes made will be discarded.
For more more details, questions, and feedback, check out the [rvisidata repository](https://github.com/paulklemm/rvisidata).
---
## Loading multiple datasets simultaneously
Multiple files can be passed as inputs through the commandline.
~~~
vd birdsdiet.tsv surveys.csv sunshinelist.html
~~~
Upon launching, the final dataset to load (in this case, sunshinelist.html) will be displayed on top.
To load files from within a VisiData session, press `o` and enter a filepath.
---
## Accessing other loaded or derived sheets
1. Press `Shift+S` to open the **Sheets sheet**.
2. Move the cursor to the row containing the desired sheet.
3. Press `Enter` to jump to the sheet referenced in that current cursor row.
---
## [How to convert a dataset from one supported filetype into another](#convert) {#convert}
~~~
vd -b countries.fixed -o countries.tsv
~~~
**Note**: Not all filetypes which are supported as loaders are also supported as savers. See the [formats page](/formats#output) for the supported output formats.
---
---
eleventyNavigation:
key: Macros
order: 5
update: 2023-11-18
version: VisiData 3.0
---
# Macros
Macros allow you to bind a series of commands to a key and then replay those commands within a session by using that keystroke.
The basic usage is:
1. Press `m` (macro-record) to begin recording the macro.
2. Go through the commands you wish to record.
3. Then type `m` again to complete the recording, and prompt for the keystroke or longname to bind it to.
The macro will then be executed every time the provided keystroke is used. Note: the Alt+keys and the function keys are left unbound; overriding other keys may conflict with existing bindings, now or in the future.
Executing a macro will the series of commands starting on the current row and column on the current sheet.
# The Macros Sheet
Use `gm` (`open-macros-or-whatever`) to open an index existing macros.
Macros can be marked for deletion (with `d`). Changes can then be committed with `z Ctrl+S`.
`Enter` will open the macro in the current row, and you can view the series of commands composing it.
---
eleventyNavigation:
key: Quick Reference Guide
order: 2
permalink: /man/
---
<section><pre id="manpage" class="whitespace-pre-wrap text-xs">
vd(1) Quick Reference Guide vd(1)
<span style="font-weight:bold;">NAME</span>
<span style="font-weight:bold;">VisiData</span> — a terminal utility for exploring and arranging tabular data
<span style="font-weight:bold;">SYNOPSIS</span>
<span style="font-weight:bold;">vd</span> [<span style="text-decoration:underline;">options</span>] [<span style="text-decoration:underline;">input</span> ...]
<span style="font-weight:bold;">visidata</span> [<span style="text-decoration:underline;">options</span>] [<span style="text-decoration:underline;">input</span> ...]
<span style="font-weight:bold;">vd</span> [<span style="text-decoration:underline;">options</span>] <span style="font-weight:bold;">--play</span> <span style="text-decoration:underline;">cmdlog</span> [<span style="font-weight:bold;">-w</span> <span style="text-decoration:underline;">waitsecs</span>] [<span style="font-weight:bold;">--batch</span>] [<span style="font-weight:bold;">-i</span>] [<span style="font-weight:bold;">-o</span> <span style="text-decoration:underline;">output</span>] [<span style="text-decoration:underline;">field</span><span style="font-weight:bold;">=</span><span style="text-decoration:underline;">value</span>]
<span style="font-weight:bold;">vd</span> [<span style="text-decoration:underline;">options</span>] [<span style="text-decoration:underline;">input</span> ...] <span style="font-weight:bold;">+</span><span style="text-decoration:underline;">toplevel</span>:<span style="text-decoration:underline;">subsheet</span>:<span style="text-decoration:underline;">row</span>:<span style="text-decoration:underline;">col</span>
<span style="font-weight:bold;">DESCRIPTION</span>
<span style="font-weight:bold;">VisiData</span> 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.
<span style="font-weight:bold;">REPLAY</span> <span style="font-weight:bold;">MODE</span>
<span style="font-weight:bold;">-p</span>, <span style="font-weight:bold;">--play</span>=<span style="text-decoration:underline;">cmdlog</span> replay a saved <span style="text-decoration:underline;">cmdlog</span> within the interface
<span style="font-weight:bold;">-w</span>, <span style="font-weight:bold;">--replay-wait</span>=<span style="text-decoration:underline;">seconds</span>
wait <span style="text-decoration:underline;">seconds</span> between commands
<span style="font-weight:bold;">-b</span>, <span style="font-weight:bold;">--batch</span> replay in batch mode (with no interface)
<span style="font-weight:bold;">-i</span>, <span style="font-weight:bold;">--interactive</span> launch VisiData in interactive mode after batch
<span style="font-weight:bold;">-o</span>, <span style="font-weight:bold;">--output</span>=<span style="text-decoration:underline;">file</span> save final visible sheet to <span style="text-decoration:underline;">file</span> as .tsv
<span style="text-decoration:underline;">field</span><span style="font-weight:bold;">=</span><span style="text-decoration:underline;">value</span> replace "{<span style="text-decoration:underline;">field</span>}" in <span style="text-decoration:underline;">cmdlog</span> contents with <span style="text-decoration:underline;">value</span>
<span style="font-weight:bold;">Commands</span> <span style="font-weight:bold;">During</span> <span style="font-weight:bold;">Replay</span>
<span style="font-weight:bold;">^K</span> cancel current replay
<span style="font-weight:bold;">GLOBAL</span> <span style="font-weight:bold;">COMMANDS</span>
All keystrokes are case sensitive. The <span style="font-weight:bold;">^</span> prefix is shorthand for <span style="font-weight:bold;">Ctrl</span>.
<span style="font-weight:bold;">Keystrokes</span> <span style="font-weight:bold;">to</span> <span style="font-weight:bold;">start</span> <span style="font-weight:bold;">off</span> <span style="font-weight:bold;">with</span>
<span style="font-weight:bold;">^Q</span> abort program immediately
<span style="font-weight:bold;">^C</span> cancel user input or abort all async threads on current sheet
<span style="font-weight:bold;">g^C</span> abort all secondary threads
<span style="font-weight:bold;">q</span> quit current sheet or menu
<span style="font-weight:bold;">Q</span> quit current sheet and free associated memory
<span style="font-weight:bold;">gq</span> quit all sheets (clean exit)
<span style="font-weight:bold;">Alt+H</span> activate help menu (<span style="font-weight:bold;">Enter</span>/<span style="font-weight:bold;">left-mouse</span> to expand submenu or execute command)
<span style="font-weight:bold;">g^H</span> view this man page
<span style="font-weight:bold;">z^H</span> view sheet of command longnames and keybindings for current sheet
<span style="font-weight:bold;">gb</span> open sidebar in a new sheet
<span style="font-weight:bold;">b</span> toggle sidebar
<span style="font-weight:bold;">U</span> undo the most recent modification (requires enabled <span style="font-weight:bold;">options.undo</span>)
<span style="font-weight:bold;">R</span> redo the most recent undo (requires enabled <span style="font-weight:bold;">options.undo</span>)
<span style="font-weight:bold;">Space</span> <span style="text-decoration:underline;">longname</span> open command palette; execute top command by its <span style="text-decoration:underline;">longname</span>
<span style="font-weight:bold;">Command</span> <span style="font-weight:bold;">Palette</span>
<span style="font-weight:bold;">Tab</span> Move to command palette, and cycle through commands
<span style="font-weight:bold;">0-9</span> Execute numbered command
<span style="font-weight:bold;">Enter</span> Execute highlighted command
<span style="font-weight:bold;">Cursor</span> <span style="font-weight:bold;">Movement</span>
<span style="font-weight:bold;">Arrow</span> <span style="font-weight:bold;">PgUp</span> go as expected
<span style="font-weight:bold;">h</span> <span style="font-weight:bold;">j</span> <span style="font-weight:bold;">k</span> <span style="font-weight:bold;">l</span> go left/down/up/right
<span style="font-weight:bold;">gh</span> <span style="font-weight:bold;">gj</span> <span style="font-weight:bold;">gk</span> <span style="font-weight:bold;">gl</span> go all the way to the left/bottom/top/right of sheet
<span style="font-weight:bold;">G</span> <span style="font-weight:bold;">gg</span> go all the way to the bottom/top of sheet
Ic. End Home go all the way to the bottom/top of sheet
<span style="font-weight:bold;">^B</span> <span style="font-weight:bold;">^F</span> scroll one page back/forward
<span style="font-weight:bold;">^Left</span> <span style="font-weight:bold;">^Right</span> scroll one page left/right
<span style="font-weight:bold;">zz</span> scroll current row to center of screen
<span style="font-weight:bold;">^^</span> (Ctrl+^) jump to previous sheet (swaps with current sheet)
<span style="font-weight:bold;">/</span> <span style="font-weight:bold;">?</span> <span style="text-decoration:underline;">regex</span> search for <span style="text-decoration:underline;">regex</span> forward/backward in current column's displayed values
<span style="font-weight:bold;">g/</span> <span style="font-weight:bold;">g?</span> <span style="text-decoration:underline;">regex</span> search for <span style="text-decoration:underline;">regex</span> forward/backward over all visible columns' displayed values
<span style="font-weight:bold;">z/</span> <span style="font-weight:bold;">z?</span> <span style="text-decoration:underline;">expr</span> search by Python <span style="text-decoration:underline;">expr</span> forward/backward in current column (with column names as variables)
<span style="font-weight:bold;">n</span> <span style="font-weight:bold;">N</span> go to next/previous match from last regex search
<span style="font-weight:bold;"><</span> <span style="font-weight:bold;">></span> go up/down current column to next value
<span style="font-weight:bold;">z<</span> <span style="font-weight:bold;">z></span> go up/down current column to next null value
<span style="font-weight:bold;">{</span> <span style="font-weight:bold;">}</span> go up/down current column to next selected row
<span style="font-weight:bold;">c</span> <span style="text-decoration:underline;">regex</span> go to next column with name matching <span style="text-decoration:underline;">regex</span>
<span style="font-weight:bold;">r</span> <span style="text-decoration:underline;">regex</span> go to next row with key matching <span style="text-decoration:underline;">regex</span>
<span style="font-weight:bold;">zc</span> <span style="font-weight:bold;">zr</span> <span style="text-decoration:underline;">number</span> go to column/row <span style="text-decoration:underline;">number</span> (0-based)
<span style="font-weight:bold;">H</span> <span style="font-weight:bold;">J</span> <span style="font-weight:bold;">K</span> <span style="font-weight:bold;">L</span> slide current row/column left/down/up/right
<span style="font-weight:bold;">gH</span> <span style="font-weight:bold;">gJ</span> <span style="font-weight:bold;">gK</span> <span style="font-weight:bold;">gL</span> slide current row/column all the way to the left/bottom/top/right of sheet
<span style="font-weight:bold;">zH</span> <span style="font-weight:bold;">zJ</span> <span style="font-weight:bold;">zK</span> <span style="font-weight:bold;">zK</span> <span style="text-decoration:underline;">number</span>
slide current row/column <span style="text-decoration:underline;">number</span> positions to the left/down/up/right
<span style="font-weight:bold;">zh</span> <span style="font-weight:bold;">zj</span> <span style="font-weight:bold;">zk</span> <span style="font-weight:bold;">zl</span> scroll one left/down/up/right
<span style="font-weight:bold;">Column</span> <span style="font-weight:bold;">Manipulation</span>
<span style="text-decoration:underline;">_</span> (underbar) toggle width of current column between full and default width
<span style="font-weight:bold;">g</span><span style="text-decoration:underline;">_</span> toggle widths of all visible columns between full and default width
<span style="font-weight:bold;">z</span><span style="text-decoration:underline;">_</span> <span style="text-decoration:underline;">number</span> adjust width of current column to <span style="text-decoration:underline;">number</span>
<span style="font-weight:bold;">gz</span><span style="text-decoration:underline;">_</span> <span style="text-decoration:underline;">number</span> adjust widths of all visible columns to Ar number
<span style="font-weight:bold;">-</span> (hyphen) hide current column
<span style="font-weight:bold;">g-</span> (hyphen) hide any column that has multiple rows but only one distinct value
<span style="font-weight:bold;">z-</span> reduce width of current column by half
<span style="font-weight:bold;">gv</span> unhide all columns
<span style="font-weight:bold;">!</span> <span style="font-weight:bold;">z!</span> toggle/unset current column as a key column
<span style="font-weight:bold;">~</span> <span style="font-weight:bold;">#</span> <span style="font-weight:bold;">%</span> <span style="font-weight:bold;">$</span> <span style="font-weight:bold;">@</span> <span style="font-weight:bold;">z#</span>
set type of current column to str/int/float/currency/date/len
<span style="font-weight:bold;">Alt++</span> <span style="font-weight:bold;">Alt+-</span> show more/less precision in current numerical column
<span style="font-weight:bold;">^</span> rename current column
<span style="font-weight:bold;">g^</span> rename all unnamed visible columns to contents of selected rows (or current row)
<span style="font-weight:bold;">z^</span> rename current column to combined contents of current cell in selected rows (or current row)
<span style="font-weight:bold;">gz^</span> rename all visible columns to combined contents of current column for selected rows (or current row)
<span style="font-weight:bold;">=</span> <span style="text-decoration:underline;">expr</span> create new column from Python <span style="text-decoration:underline;">expr</span>, with column names, and attributes, as variables
<span style="font-weight:bold;">g=</span> <span style="text-decoration:underline;">expr</span> set current column for selected rows to result of Python <span style="text-decoration:underline;">expr</span>
<span style="font-weight:bold;">gz=</span> <span style="text-decoration:underline;">expr</span> set current column for selected rows to the items in result of Python sequence <span style="text-decoration:underline;">expr</span>
<span style="font-weight:bold;">z=</span> <span style="text-decoration:underline;">expr</span> evaluate Python expression on current row and set current cell with result of Python <span style="text-decoration:underline;">expr</span>
i add column with incremental values
gi set current column for selected rows to incremental values
zi <span style="text-decoration:underline;">step</span> add column with values at increment <span style="text-decoration:underline;">step</span>
gzi <span style="text-decoration:underline;">step</span> set current column for selected rows at increment <span style="text-decoration:underline;">step</span>
<span style="font-weight:bold;">'</span> (tick) add a frozen copy of current column with all cells evaluated
<span style="font-weight:bold;">g'</span> open a frozen copy of current sheet with all visible columns evaluated
<span style="font-weight:bold;">z'</span> <span style="font-weight:bold;">gz'</span> add/reset cache for current/all visible column(s)
Note that regex operations apply to the displayed value in a cell.
<span style="font-weight:bold;">:</span> <span style="text-decoration:underline;">regex</span> add new columns from <span style="text-decoration:underline;">regex</span> split; number of columns determined by example row at cursor
<span style="font-weight:bold;">;</span> <span style="text-decoration:underline;">regex</span> add new columns from capture groups of <span style="text-decoration:underline;">regex</span> (also requires example row)
<span style="font-weight:bold;">z;</span> <span style="text-decoration:underline;">expr</span> create new column from bash <span style="text-decoration:underline;">expr</span>, with <span style="font-weight:bold;">$</span>columnNames as variables
<span style="font-weight:bold;">*</span> <span style="text-decoration:underline;">search</span> <span style="font-weight:bold;">Tab</span> <span style="text-decoration:underline;">replace</span>
add column derived from current column, replacing <span style="text-decoration:underline;">search</span> regex with <span style="text-decoration:underline;">replace</span> (may include <span style="font-weight:bold;">\1</span> backrefs)
<span style="font-weight:bold;">g*</span> <span style="font-weight:bold;">gz*</span> <span style="text-decoration:underline;">search</span> <span style="font-weight:bold;">Tab</span> <span style="text-decoration:underline;">replace</span>
modify selected rows in current/all visible column(s), replacing <span style="text-decoration:underline;">search</span> with <span style="text-decoration:underline;">replace</span> (may include <span style="font-weight:bold;">\1</span> backrefs)
<span style="font-weight:bold;">(</span> <span style="font-weight:bold;">g(</span> expand current/all visible column(s) of lists (e.g. <span style="font-weight:bold;">[3]</span>) or dicts (e.g. <span style="font-weight:bold;">{3}</span>) one level
<span style="font-weight:bold;">z(</span> <span style="font-weight:bold;">gz(</span> <span style="text-decoration:underline;">depth</span> expand current/all visible column(s) of lists (e.g. <span style="font-weight:bold;">[3]</span>) or dicts (e.g. <span style="font-weight:bold;">{3}</span>) to given <span style="text-decoration:underline;">depth</span> (<span style="text-decoration:underline;">0</span>= fully)
<span style="font-weight:bold;">)</span> <span style="font-weight:bold;">g(</span> unexpand current/all visible column(s); restore original column and remove other columns at this level
<span style="font-weight:bold;">z)</span> <span style="font-weight:bold;">gz)</span> <span style="text-decoration:underline;">depth</span> contract current/all visible column(s) of former lists (e.g. <span style="font-weight:bold;">[3]</span>) or dicts (e.g. <span style="font-weight:bold;">{3}</span>) to given <span style="text-decoration:underline;">depth</span> (<span style="text-decoration:underline;">0</span>= fully)
<span style="font-weight:bold;">zM</span> row-wise expand current column of lists (e.g. <span style="font-weight:bold;">[3]</span>) or dicts (e.g. <span style="font-weight:bold;">{3}</span>) within that column
<span style="font-weight:bold;">Row</span> <span style="font-weight:bold;">Selection</span>
<span style="font-weight:bold;">s</span> <span style="font-weight:bold;">t</span> <span style="font-weight:bold;">u</span> select/toggle/unselect current row
<span style="font-weight:bold;">gs</span> <span style="font-weight:bold;">gt</span> <span style="font-weight:bold;">gu</span> select/toggle/unselect all rows
<span style="font-weight:bold;">zs</span> <span style="font-weight:bold;">zt</span> <span style="font-weight:bold;">zu</span> select/toggle/unselect all rows from top to cursor
<span style="font-weight:bold;">gzs</span> <span style="font-weight:bold;">gzt</span> <span style="font-weight:bold;">gzu</span> select/toggle/unselect all rows from cursor to bottom
<span style="font-weight:bold;">|</span> <span style="font-weight:bold;">\</span> <span style="text-decoration:underline;">regex</span> select/unselect rows matching <span style="text-decoration:underline;">regex</span> in current column
<span style="font-weight:bold;">g|</span> <span style="font-weight:bold;">g\</span> <span style="text-decoration:underline;">regex</span> select/unselect rows matching <span style="text-decoration:underline;">regex</span> in any visible column
<span style="font-weight:bold;">z|</span> <span style="font-weight:bold;">z\</span> <span style="text-decoration:underline;">expr</span> select/unselect rows matching Python <span style="text-decoration:underline;">expr</span> in any visible column
<span style="font-weight:bold;">,</span> (comma) select rows matching display value of current cell in current column
<span style="font-weight:bold;">g,</span> select rows matching display value of current row in all visible columns
<span style="font-weight:bold;">z,</span> <span style="font-weight:bold;">gz,</span> select rows matching typed value of current cell/row in current column/all visible columns
<span style="font-weight:bold;">Row</span> <span style="font-weight:bold;">Sorting/Filtering</span>
<span style="font-weight:bold;">[</span> <span style="font-weight:bold;">]</span> sort ascending/descending by current column; replace any existing sort criteria
<span style="font-weight:bold;">g[</span> <span style="font-weight:bold;">g]</span> sort ascending/descending by all key columns; replace any existing sort criteria
<span style="font-weight:bold;">z[</span> <span style="font-weight:bold;">z]</span> sort ascending/descending by current column; keep higher priority sort criteria
<span style="font-weight:bold;">gz[</span> <span style="font-weight:bold;">gz]</span> sort ascending/descending by all key columns; add to existing sort criteria
<span style="font-weight:bold;">"</span> open duplicate sheet with only selected rows
<span style="font-weight:bold;">g"</span> open duplicate sheet with all rows
<span style="font-weight:bold;">gz"</span> 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 <span style="font-weight:bold;">g'</span> to freeze sheet contents in a deliberate copy. <span style="font-weight:bold;">z'</span> replace current column with a frozen copy, with all cells evaluated
<span style="font-weight:bold;">Editing</span> <span style="font-weight:bold;">Rows</span> <span style="font-weight:bold;">and</span> <span style="font-weight:bold;">Cells</span>
<span style="font-weight:bold;">a</span> <span style="font-weight:bold;">za</span> append blank row/column; appended columns cannot be copied to clipboard
<span style="font-weight:bold;">ga</span> <span style="font-weight:bold;">gza</span> <span style="text-decoration:underline;">number</span> append <span style="text-decoration:underline;">number</span> blank rows/columns
<span style="font-weight:bold;">d</span> <span style="font-weight:bold;">gd</span> delete current/selected row(s)
<span style="font-weight:bold;">y</span> <span style="font-weight:bold;">gy</span> yank (copy) current/all selected row(s) to clipboard in <span style="font-weight:bold;">Memory</span> <span style="font-weight:bold;">Sheet</span>
<span style="font-weight:bold;">x</span> <span style="font-weight:bold;">gx</span> cut (copy and delete) current/all selected row(s) to clipboard in <span style="font-weight:bold;">Memory</span> <span style="font-weight:bold;">Sheet</span>
<span style="font-weight:bold;">zy</span> <span style="font-weight:bold;">gzy</span> yank (copy) contents of current column for current/selected row(s) to clipboard in <span style="font-weight:bold;">Memory</span> <span style="font-weight:bold;">Sheet</span>
<span style="font-weight:bold;">zd</span> <span style="font-weight:bold;">gzd</span> set contents of current column for current/selected row(s) to <span style="font-weight:bold;">options.null</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">value</span>
<span style="font-weight:bold;">zx</span> <span style="font-weight:bold;">gzx</span> cut (copy and delete) contents of current column for current/selected row(s) to clipboard in <span style="font-weight:bold;">Memory</span> <span style="font-weight:bold;">Sheet</span>
<span style="font-weight:bold;">p</span> <span style="font-weight:bold;">P</span> paste clipboard rows after/before current row
<span style="font-weight:bold;">zp</span> <span style="font-weight:bold;">gzp</span> set cells of current column for current/selected row(s) to last clipboard value
<span style="font-weight:bold;">zP</span> <span style="font-weight:bold;">gzP</span> paste to cells of current column for current/selected row(s) using the system clipboard
<span style="font-weight:bold;">Y</span> <span style="font-weight:bold;">gY</span> yank (copy) current/all selected row(s) to system clipboard (using <span style="font-weight:bold;">options.clipboard</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">copy</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">cmd</span>)
<span style="font-weight:bold;">zY</span> <span style="font-weight:bold;">gzY</span> yank (copy) contents of current column for current/selected row(s) to system clipboard (using <span style="font-weight:bold;">options.clipboard</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">copy</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">cmd</span>)
<span style="font-weight:bold;">f</span> fill null cells in current column with contents of non-null cells up the current column
<span style="font-weight:bold;">e</span> <span style="text-decoration:underline;">text</span> edit contents of current cell
<span style="font-weight:bold;">^O</span> edit contents of current cell in external <span style="font-weight:bold;">EDITOR</span>
<span style="font-weight:bold;">ge</span> <span style="text-decoration:underline;">text</span> set contents of current column for selected rows to <span style="text-decoration:underline;">text</span>
<span style="font-weight:bold;">Commands</span> <span style="font-weight:bold;">While</span> <span style="font-weight:bold;">Editing</span> <span style="font-weight:bold;">Input</span>
<span style="font-weight:bold;">Enter</span> <span style="font-weight:bold;">^C</span> accept/abort input
<span style="font-weight:bold;">^O</span> <span style="font-weight:bold;">g^O</span> open external $EDITOR to edit contents of current/selected rows in current column
<span style="font-weight:bold;">^R</span> reload initial value
<span style="font-weight:bold;">^A</span> <span style="font-weight:bold;">^E</span> go to beginning/end of line
<span style="font-weight:bold;">^B</span> <span style="font-weight:bold;">^F</span> go back/forward one character
<span style="font-weight:bold;">^←</span> <span style="font-weight:bold;">^→</span> (arrow) go back/forward one word
<span style="font-weight:bold;">^H</span> <span style="font-weight:bold;">^D</span> delete previous/current character
<span style="font-weight:bold;">^T</span> transpose previous and current characters
<span style="font-weight:bold;">^U</span> <span style="font-weight:bold;">^K</span> clear from cursor to beginning/end of line
<span style="font-weight:bold;">^Y</span> paste from cell clipboard
<span style="font-weight:bold;">Backspace</span> <span style="font-weight:bold;">Del</span> delete previous/current character
<span style="font-weight:bold;">Insert</span> toggle insert mode
<span style="font-weight:bold;">Up</span> <span style="font-weight:bold;">Down</span> set contents to previous/next in history
<span style="font-weight:bold;">Tab</span> <span style="font-weight:bold;">Shift+Tab</span> move cursor left/right and re-enter edit mode
<span style="font-weight:bold;">Shift+Arrow</span> move cursor in direction of <span style="font-weight:bold;">Arrow</span> and re-enter edit mode
<span style="font-weight:bold;">Data</span> <span style="font-weight:bold;">Toolkit</span>
<span style="font-weight:bold;">o</span> <span style="text-decoration:underline;">input</span> open <span style="text-decoration:underline;">input</span> in <span style="font-weight:bold;">VisiData</span>
<span style="font-weight:bold;">zo</span> open file or url from path in current cell
<span style="font-weight:bold;">^S</span> <span style="font-weight:bold;">g^S</span> <span style="text-decoration:underline;">filename</span> save current/all sheet(s) to <span style="text-decoration:underline;">filename</span> in format determined by extension (default .tsv)
Note: if the format does not support multisave, or the <span style="text-decoration:underline;">filename</span> ends in a <span style="font-weight:bold;">/</span>, a directory will be created.
<span style="font-weight:bold;">z^S</span> <span style="text-decoration:underline;">filename</span> save current column only to <span style="text-decoration:underline;">filename</span> in format determined by extension (default .tsv)
<span style="font-weight:bold;">^D</span> <span style="text-decoration:underline;">filename.vdj</span> save <span style="font-weight:bold;">CommandLog</span> to <span style="text-decoration:underline;">filename.vdj</span> file
<span style="font-weight:bold;">A</span> open new blank sheet with one column
<span style="font-weight:bold;">T</span> open new sheet that has rows and columns of current sheet transposed
<span style="font-weight:bold;">+</span> <span style="text-decoration:underline;">aggregator</span> add <span style="text-decoration:underline;">aggregator</span> to current column (see <span style="font-weight:bold;">Frequency</span> <span style="font-weight:bold;">Table</span>)
<span style="font-weight:bold;">z+</span> <span style="text-decoration:underline;">aggregator</span> display result of <span style="text-decoration:underline;">aggregator</span> over values in selected rows for current column; store result in <span style="font-weight:bold;">Memory</span> <span style="font-weight:bold;">Sheet</span>
<span style="font-weight:bold;">&</span> append top two sheets in <span style="font-weight:bold;">Sheets</span> <span style="font-weight:bold;">Stack</span>
<span style="font-weight:bold;">g&</span> append all sheets in <span style="font-weight:bold;">Sheets</span> <span style="font-weight:bold;">Stack</span>
<span style="font-weight:bold;">w</span> <span style="text-decoration:underline;">nBefore</span> <span style="text-decoration:underline;">nAfter</span>
add column where each row contains a list of that row, <span style="text-decoration:underline;">nBefore</span> rows, and <span style="text-decoration:underline;">nAfter</span> rows
<span style="font-weight:bold;">Data</span> <span style="font-weight:bold;">Visualization</span>
<span style="font-weight:bold;">.</span> (dot) plot current numeric column vs key columns. The numeric key column is used for the x-axis; categorical key column values determine color.
<span style="font-weight:bold;">g.</span> 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), <span style="font-weight:bold;">.</span> plots the current row, and <span style="font-weight:bold;">g.</span> plots all selected rows (or all rows if none selected).
<span style="font-weight:bold;">Canvas-specific</span> <span style="font-weight:bold;">Commands</span>
<span style="font-weight:bold;">+</span> <span style="font-weight:bold;">-</span> increase/decrease zoom level, centered on cursor
<span style="text-decoration:underline;">_</span> (underbar) zoom to fit full extent
<span style="font-weight:bold;">z</span><span style="text-decoration:underline;">_</span> (underbar) set aspect ratio
<span style="font-weight:bold;">g</span><span style="text-decoration:underline;">_</span> (underbar) Zoom y-axis to fit all visible data points
<span style="font-weight:bold;">x</span> <span style="text-decoration:underline;">xmin</span> <span style="text-decoration:underline;">xmax</span> set <span style="text-decoration:underline;">xmin</span>/<span style="text-decoration:underline;">xmax</span> on graph
<span style="font-weight:bold;">y</span> <span style="text-decoration:underline;">ymin</span> <span style="text-decoration:underline;">ymax</span> set <span style="text-decoration:underline;">ymin</span>/<span style="text-decoration:underline;">ymax</span> on graph
<span style="font-weight:bold;">s</span> <span style="font-weight:bold;">t</span> <span style="font-weight:bold;">u</span> select/toggle/unselect rows on source sheet contained within canvas cursor
<span style="font-weight:bold;">gs</span> <span style="font-weight:bold;">gt</span> <span style="font-weight:bold;">gu</span> select/toggle/unselect rows on source sheet visible on screen
<span style="font-weight:bold;">d</span> delete rows on source sheet contained within canvas cursor
<span style="font-weight:bold;">gd</span> delete rows on source sheet visible on screen
<span style="font-weight:bold;">Enter</span> open sheet of source rows contained within canvas cursor
<span style="font-weight:bold;">gEnter</span> open sheet of source rows visible on screen
<span style="font-weight:bold;">1</span> - <span style="font-weight:bold;">9</span> toggle display of layers
<span style="font-weight:bold;">^L</span> redraw all pixels on canvas
<span style="font-weight:bold;">v</span> toggle <span style="font-weight:bold;">show</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">graph</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">labels</span> option
<span style="font-weight:bold;">mouse</span> <span style="font-weight:bold;">scrollwheel</span> zoom in/out of canvas
<span style="font-weight:bold;">left</span> <span style="font-weight:bold;">click-drag</span> set canvas cursor
<span style="font-weight:bold;">right</span> <span style="font-weight:bold;">click-drag</span> scroll canvas
<span style="font-weight:bold;">Split</span> <span style="font-weight:bold;">Screen</span>
<span style="font-weight:bold;">Z</span> split screen in half, so that second sheet on the stack is visible in a second pane
<span style="font-weight:bold;">zZ</span> split screen, and queries for height of second pane
<span style="font-weight:bold;">Split</span> <span style="font-weight:bold;">Window</span> <span style="font-weight:bold;">specific</span> <span style="font-weight:bold;">Commands</span>
<span style="font-weight:bold;">gZ</span> close an already split screen, current pane full screens
<span style="font-weight:bold;">Z</span> push second sheet on current pane's stack to the top of the other pane's stack
<span style="font-weight:bold;">Tab</span> jump to other pane
<span style="font-weight:bold;">gTab</span> swap panes
<span style="font-weight:bold;">g</span> <span style="font-weight:bold;">Ctrl+^</span> cycle through sheets
<span style="font-weight:bold;">Other</span> <span style="font-weight:bold;">Commands</span>
<span style="font-weight:bold;">Q</span> quit current sheet and remove it from the <span style="font-weight:bold;">CommandLog</span>
<span style="font-weight:bold;">v</span> toggle sheet-specific visibility (multi-line rows on Sheet, legends/axes on Graph)
<span style="font-weight:bold;">^E</span> <span style="font-weight:bold;">g^E</span> view traceback for most recent error(s)
<span style="font-weight:bold;">z^E</span> view traceback for error in current cell
<span style="font-weight:bold;">^L</span> refresh screen
<span style="font-weight:bold;">^R</span> reload current sheet
<span style="font-weight:bold;">^Z</span> suspend VisiData process
<span style="font-weight:bold;">^G</span> show cursor position and bounds of current sheet on status line
<span style="font-weight:bold;">^V</span> show version and copyright information on status line
<span style="font-weight:bold;">^P</span> open <span style="font-weight:bold;">Status</span> <span style="font-weight:bold;">History</span>
m <span style="text-decoration:underline;">keystroke</span> first, begin recording macro; second, prompt for <span style="text-decoration:underline;">keystroke</span> , 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 <span style="font-weight:bold;">Enter</span>, and then modified with <span style="font-weight:bold;">^S</span>.
<span style="font-weight:bold;">^Y</span> <span style="font-weight:bold;">z^Y</span> <span style="font-weight:bold;">g^Y</span> open current row/cell/sheet as Python object
<span style="font-weight:bold;">^X</span> <span style="text-decoration:underline;">expr</span> evaluate Python <span style="text-decoration:underline;">expr</span> and opens result as Python object
<span style="font-weight:bold;">z^X</span> <span style="text-decoration:underline;">expr</span> evaluate Python <span style="text-decoration:underline;">expr</span>, in context of current row, and open result as Python object
<span style="font-weight:bold;">g^X</span> <span style="text-decoration:underline;">module</span> import Python <span style="text-decoration:underline;">module</span> in the global scope
<span style="font-weight:bold;">Internal</span> <span style="font-weight:bold;">Sheets</span> <span style="font-weight:bold;">List</span>
<span style="font-weight:bold;">.</span> <span style="font-weight:bold;">Directory</span> <span style="font-weight:bold;">Sheet</span> browse properties of files in a directory
<span style="font-weight:bold;">.</span> <span style="font-weight:bold;">Guide</span> <span style="font-weight:bold;">Index</span> read documentation from within VisiData
<span style="font-weight:bold;">.</span> <span style="font-weight:bold;">Memory</span> <span style="font-weight:bold;">Sheet</span> (Alt+Shift+M) browse saved values, including clipboard
<span style="font-weight:bold;">Metasheets</span>
<span style="font-weight:bold;">.</span> <span style="font-weight:bold;">Columns</span> <span style="font-weight:bold;">Sheet</span> (Shift+C) edit column properties
<span style="font-weight:bold;">.</span> <span style="font-weight:bold;">Sheets</span> <span style="font-weight:bold;">Sheet</span> (Shift+S) jump between sheets or join them together
<span style="font-weight:bold;">.</span> <span style="font-weight:bold;">Options</span> <span style="font-weight:bold;">Sheet</span> (Shift+O) edit configuration options
<span style="font-weight:bold;">.</span> <span style="font-weight:bold;">Commandlog</span> (Shift+D) modify and save commands for replay
<span style="font-weight:bold;">.</span> <span style="font-weight:bold;">Error</span> <span style="font-weight:bold;">Sheet</span> (Ctrl+E) view last error
<span style="font-weight:bold;">.</span> <span style="font-weight:bold;">Status</span> <span style="font-weight:bold;">History</span> (Ctrl+P) view history of status messages
<span style="font-weight:bold;">.</span> <span style="font-weight:bold;">Threads</span> <span style="font-weight:bold;">Sheet</span> (Ctrl+T) view, cancel, and profile asynchronous threads
<span style="font-weight:bold;">Derived</span> <span style="font-weight:bold;">Sheets</span>
<span style="font-weight:bold;">.</span> <span style="font-weight:bold;">Frequency</span> <span style="font-weight:bold;">Table</span> (Shift+F) group rows by column value, with aggregations of other columns
<span style="font-weight:bold;">.</span> <span style="font-weight:bold;">Describe</span> <span style="font-weight:bold;">Sheet</span> (Shift+I) view summary statistics for each column
<span style="font-weight:bold;">.</span> <span style="font-weight:bold;">Pivot</span> <span style="font-weight:bold;">Table</span> (Shift+W) group rows by key and summarize current column
<span style="font-weight:bold;">.</span> <span style="font-weight:bold;">Melted</span> <span style="font-weight:bold;">Sheet</span> (Shift+M) unpivot non-key columns into variable/value columns
<span style="font-weight:bold;">.</span> <span style="font-weight:bold;">Transposed</span> <span style="font-weight:bold;">Sheet</span> (Shift+T) open new sheet with rows and columns transposed
<span style="font-weight:bold;">INTERNAL</span> <span style="font-weight:bold;">SHEETS</span>
<span style="font-weight:bold;">Directory</span> <span style="font-weight:bold;">Sheet</span>
(global commands)
<span style="font-weight:bold;">Space</span> <span style="text-decoration:underline;">open-dir-current</span>
open the <span style="font-weight:bold;">Directory</span> <span style="font-weight:bold;">Sheet</span> for the current directory
(sheet-specific commands)
<span style="font-weight:bold;">Enter</span> <span style="font-weight:bold;">gEnter</span> open current/selected file(s) as new sheet(s)
<span style="font-weight:bold;">^O</span> <span style="font-weight:bold;">g^O</span> open current/selected file(s) in external $EDITOR
<span style="font-weight:bold;">^R</span> <span style="font-weight:bold;">z^R</span> <span style="font-weight:bold;">gz^R</span> reload information for all/current/selected file(s)
<span style="font-weight:bold;">d</span> <span style="font-weight:bold;">gd</span> delete current/selected file(s) from filesystem, upon commit
<span style="font-weight:bold;">y</span> <span style="font-weight:bold;">gy</span> <span style="text-decoration:underline;">directory</span>
copy current/selected file(s) to given <span style="text-decoration:underline;">directory</span>, upon commit
<span style="font-weight:bold;">e</span> <span style="font-weight:bold;">ge</span> <span style="text-decoration:underline;">name</span> rename current/selected file(s) to <span style="text-decoration:underline;">name</span>
<span style="font-weight:bold;">`</span> <span style="font-weight:bold;">(backtick)</span> open parent directory
<span style="font-weight:bold;">z^S</span> commit changes to file system
<span style="font-weight:bold;">Guide</span> <span style="font-weight:bold;">Index</span>
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)
<span style="font-weight:bold;">Space</span> <span style="text-decoration:underline;">open-guide-index</span>
open the <span style="font-weight:bold;">Guide</span> <span style="font-weight:bold;">Index</span>
(sheet-specific commands)
<span style="font-weight:bold;">Enter</span> open a guide
<span style="font-weight:bold;">Memory</span> <span style="font-weight:bold;">Sheet</span>
Browse through a list of stored values, referanceable in expressions through their <span style="font-weight:bold;">name</span>.
(global commands)
<span style="font-weight:bold;">Alt+Shift+M</span> open the <span style="font-weight:bold;">Memory</span> <span style="font-weight:bold;">Sheet</span>
<span style="font-weight:bold;">Alt+M</span> <span style="text-decoration:underline;">name</span> store value in current cell in <span style="font-weight:bold;">Memory</span> <span style="font-weight:bold;">Sheet</span> under <span style="text-decoration:underline;">name</span>
(sheet-specific commands)
<span style="font-weight:bold;">e</span> edit either value or name, to edit reference
<span style="font-weight:bold;">METASHEETS</span>
<span style="font-weight:bold;">Columns</span> <span style="font-weight:bold;">Sheet</span> <span style="font-weight:bold;">(Shift+C)</span>
Properties of columns on the source sheet can be changed with standard editing commands (<span style="font-weight:bold;">e</span> <span style="font-weight:bold;">ge</span> <span style="font-weight:bold;">g=</span> <span style="font-weight:bold;">Del</span>) on the <span style="font-weight:bold;">Columns</span> <span style="font-weight:bold;">Sheet</span>. 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)
<span style="font-weight:bold;">gC</span> open <span style="font-weight:bold;">Columns</span> <span style="font-weight:bold;">Sheet</span> with all visible columns from all sheets
(sheet-specific commands)
<span style="font-weight:bold;">&</span> add column from appending selected source columns
<span style="font-weight:bold;">g!</span> <span style="font-weight:bold;">gz!</span> toggle/unset selected columns as key columns on source sheet
<span style="font-weight:bold;">g+</span> <span style="text-decoration:underline;">aggregator</span> add Ar aggregator No to selected source columns
<span style="font-weight:bold;">g-</span> (hyphen) hide selected columns on source sheet
<span style="font-weight:bold;">g~</span> <span style="font-weight:bold;">g#</span> <span style="font-weight:bold;">g%</span> <span style="font-weight:bold;">g$</span> <span style="font-weight:bold;">g@</span> <span style="font-weight:bold;">gz#</span> <span style="font-weight:bold;">z%</span>
set type of selected columns on source sheet to str/int/float/currency/date/len/floatsi
<span style="font-weight:bold;">Enter</span> open a <span style="font-weight:bold;">Frequency</span> <span style="font-weight:bold;">Table</span> sheet grouped by column referenced in current row
<span style="font-weight:bold;">Sheets</span> <span style="font-weight:bold;">Sheet</span> <span style="font-weight:bold;">(Shift+S)</span>
open <span style="font-weight:bold;">Sheets</span> <span style="font-weight:bold;">Stack</span>, which contains only the active sheets on the current stack
(global commands)
<span style="font-weight:bold;">gS</span> open <span style="font-weight:bold;">Sheets</span> <span style="font-weight:bold;">Sheet</span>, which contains all sheets from current session, active and inactive
<span style="font-weight:bold;">Alt</span> <span style="text-decoration:underline;">number</span> jump to sheet <span style="text-decoration:underline;">number</span>
(sheet-specific commands)
<span style="font-weight:bold;">Enter</span> jump to sheet referenced in current row
<span style="font-weight:bold;">gEnter</span> push selected sheets to top of sheet stack
<span style="font-weight:bold;">a</span> add row to reference a new blank sheet
<span style="font-weight:bold;">gC</span> <span style="font-weight:bold;">gI</span> open <span style="font-weight:bold;">Columns</span> <span style="font-weight:bold;">Sheet</span>/<span style="font-weight:bold;">Describe</span> <span style="font-weight:bold;">Sheet</span> with all visible columns from selected sheets
<span style="font-weight:bold;">g^R</span> reload all selected sheets
<span style="font-weight:bold;">z^C</span> <span style="font-weight:bold;">gz^C</span> abort async threads for current/selected sheets(s)
<span style="font-weight:bold;">g^S</span> save selected or all sheets
<span style="font-weight:bold;">&</span> <span style="text-decoration:underline;">jointype</span> merge selected sheets with visible columns from all, keeping rows according to <span style="text-decoration:underline;">jointype</span>:
<span style="font-weight:bold;">.</span> <span style="font-weight:bold;">inner</span> keep only rows which match keys on all sheets
<span style="font-weight:bold;">.</span> <span style="font-weight:bold;">outer</span> keep all rows from first selected sheet
<span style="font-weight:bold;">.</span> <span style="font-weight:bold;">full</span> keep all rows from all sheets (union)
<span style="font-weight:bold;">.</span> <span style="font-weight:bold;">diff</span> keep only rows NOT in all sheets
<span style="font-weight:bold;">.</span> <span style="font-weight:bold;">append</span> combine all rows from all sheets
<span style="font-weight:bold;">.</span> <span style="font-weight:bold;">concat</span> similar to 'append' but keep first sheet type and columns
<span style="font-weight:bold;">.</span> <span style="font-weight:bold;">extend</span> copy first selected sheet, keeping all rows and sheet type, and extend with columns from other sheets
<span style="font-weight:bold;">.</span> <span style="font-weight:bold;">merge</span> 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
<span style="font-weight:bold;">Options</span> <span style="font-weight:bold;">Sheet</span> <span style="font-weight:bold;">(Shift+O)</span>
(global commands)
<span style="font-weight:bold;">Shift+O</span> edit global options (apply to <span style="font-weight:bold;">all</span> <span style="font-weight:bold;">sheets</span>)
<span style="font-weight:bold;">zO</span> edit sheet options (apply to <span style="font-weight:bold;">current</span> <span style="font-weight:bold;">sheet</span> only)
<span style="font-weight:bold;">gO</span> open <span style="font-weight:bold;">options.config</span> as <span style="font-weight:bold;">TextSheet</span>
(sheet-specific commands)
<span style="font-weight:bold;">Enter</span> <span style="font-weight:bold;">e</span> edit option at current row
<span style="font-weight:bold;">d</span> remove option override for this context
<span style="font-weight:bold;">^S</span> save option configuration to <span style="font-weight:bold;">foo.visidatarc</span>
<span style="font-weight:bold;">CommandLog</span> <span style="font-weight:bold;">(Shift+D)</span>
(global commands)
<span style="font-weight:bold;">D</span> open current sheet's <span style="font-weight:bold;">CommandLog</span> with all other loose ends removed; includes commands from parent sheets
<span style="font-weight:bold;">gD</span> open global <span style="font-weight:bold;">CommandLog</span> for all commands executed in the current session
<span style="font-weight:bold;">zD</span> open current sheet's <span style="font-weight:bold;">CommandLog</span> with the parent sheets commands' removed
(sheet-specific commands)
<span style="font-weight:bold;">x</span> replay command in current row
<span style="font-weight:bold;">gx</span> replay contents of entire CommandLog
<span style="font-weight:bold;">^C</span> abort replay
<span style="font-weight:bold;">Threads</span> <span style="font-weight:bold;">Sheet</span> <span style="font-weight:bold;">(Ctrl+T)</span>
(global commands)
<span style="font-weight:bold;">^T</span> open global <span style="font-weight:bold;">Threads</span> <span style="font-weight:bold;">Sheet</span> for all asynchronous threads running
<span style="font-weight:bold;">z^T</span> open current sheet's <span style="font-weight:bold;">Threads</span> <span style="font-weight:bold;">Sheet</span>
(sheet-specific commands)
<span style="font-weight:bold;">^C</span> abort thread at current row
<span style="font-weight:bold;">g^C</span> abort all threads on current <span style="font-weight:bold;">Threads</span> <span style="font-weight:bold;">Sheet</span>
<span style="font-weight:bold;">DERIVED</span> <span style="font-weight:bold;">SHEETS</span>
<span style="font-weight:bold;">Frequency</span> <span style="font-weight:bold;">Table</span> <span style="font-weight:bold;">(Shift+F)</span>
A <span style="font-weight:bold;">Frequency</span> <span style="font-weight:bold;">Table</span> groups rows by one or more columns, and includes summary columns for those with aggregators.
(global commands)
<span style="font-weight:bold;">gF</span> open Frequency Table, grouped by all key columns on source sheet
<span style="font-weight:bold;">zF</span> open one-line summary for all rows and selected rows
(sheet-specific commands)
<span style="font-weight:bold;">s</span> <span style="font-weight:bold;">t</span> <span style="font-weight:bold;">u</span> select/toggle/unselect these entries in source sheet
<span style="font-weight:bold;">Enter</span> <span style="font-weight:bold;">gEnter</span> open copy of source sheet with rows that are grouped in current cell / selected rows
<span style="font-weight:bold;">Describe</span> <span style="font-weight:bold;">Sheet</span> <span style="font-weight:bold;">(Shift+I)</span>
A <span style="font-weight:bold;">Describe</span> <span style="font-weight:bold;">Sheet</span> contains descriptive statistics for all visible columns.
(global commands)
<span style="font-weight:bold;">gI</span> open <span style="font-weight:bold;">Describe</span> <span style="font-weight:bold;">Sheet</span> for all visible columns on all sheets
(sheet-specific commands)
<span style="font-weight:bold;">zs</span> <span style="font-weight:bold;">zu</span> select/unselect rows on source sheet that are being described in current cell
<span style="font-weight:bold;">!</span> toggle/unset current column as a key column on source sheet
<span style="font-weight:bold;">Enter</span> open a <span style="font-weight:bold;">Frequency</span> <span style="font-weight:bold;">Table</span> sheet grouped on column referenced in current row
<span style="font-weight:bold;">zEnter</span> open copy of source sheet with rows described in current cell
<span style="font-weight:bold;">Pivot</span> <span style="font-weight:bold;">Table</span> <span style="font-weight:bold;">(Shift+W)</span>
Set key column(s) and aggregators on column(s) before pressing <span style="font-weight:bold;">Shift+W</span> on the column to pivot.
(sheet-specific commands)
<span style="font-weight:bold;">Enter</span> open sheet of source rows aggregated in current pivot row
<span style="font-weight:bold;">zEnter</span> open sheet of source rows aggregated in current pivot cell
<span style="font-weight:bold;">Melted</span> <span style="font-weight:bold;">Sheet</span> <span style="font-weight:bold;">(Shift+M)</span>
Open Melted Sheet (unpivot), with key columns retained and all non-key columns reduced to Variable-Value rows.
(global commands)
<span style="font-weight:bold;">gM</span> <span style="text-decoration:underline;">regex</span> open Melted Sheet (unpivot), with key columns retained and <span style="text-decoration:underline;">regex</span> capture groups determining how the non-key columns will be reduced to Variable-Value rows.
<span style="font-weight:bold;">Python</span> <span style="font-weight:bold;">Object</span> <span style="font-weight:bold;">Sheet</span> <span style="font-weight:bold;">(^X</span> <span style="font-weight:bold;">^Y</span> <span style="font-weight:bold;">g^Y</span> <span style="font-weight:bold;">z^Y)</span>
(sheet-specific commands)
<span style="font-weight:bold;">Enter</span> dive further into Python object
<span style="font-weight:bold;">v</span> toggle show/hide for methods and hidden properties
<span style="font-weight:bold;">gv</span> <span style="font-weight:bold;">zv</span> show/hide methods and hidden properties
<span style="font-weight:bold;">COMMANDLINE</span> <span style="font-weight:bold;">OPTIONS</span>
Add <span style="font-weight:bold;">-n</span>/<span style="font-weight:bold;">--nonglobal</span> 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 <span style="text-decoration:underline;">Options</span> <span style="text-decoration:underline;">Sheet</span> or a <span style="text-decoration:underline;">.visidatarc</span> (see <span style="text-decoration:underline;">FILES</span>).
<span style="font-weight:bold;">-P</span>=<span style="text-decoration:underline;">longname</span> preplay <span style="text-decoration:underline;">longname</span> before replay or regular launch; limited to <span style="font-weight:bold;">Base</span> <span style="font-weight:bold;">Sheet</span> bound commands
<span style="font-weight:bold;">+</span><span style="text-decoration:underline;">toplevel</span>:<span style="text-decoration:underline;">subsheet</span>:<span style="text-decoration:underline;">row</span>:<span style="text-decoration:underline;">col</span> launch vd with <span style="text-decoration:underline;">subsheet</span> of <span style="text-decoration:underline;">toplevel</span> at top-of-stack, and cursor at <span style="text-decoration:underline;">row</span> and <span style="text-decoration:underline;">col</span>; all arguments are optional
<span style="font-weight:bold;">--overwrite</span>=<span style="text-decoration:underline;">c</span> Overwrite with confirmation
<span style="font-weight:bold;">--guides</span> open Guide Index
<span style="font-weight:bold;">-f</span>, <span style="font-weight:bold;">--filetype</span>=<span style="text-decoration:underline;">filetype</span> tsv set loader to use for <span style="text-decoration:underline;">filetype</span> instead of file extension
<span style="font-weight:bold;">-d</span>, <span style="font-weight:bold;">--delimiter</span>=<span style="text-decoration:underline;">delimiter</span> \t field delimiter to use for tsv/usv filetype
<span style="font-weight:bold;">-y</span>, <span style="font-weight:bold;">--overwrite</span>=<span style="text-decoration:underline;">y</span> y overwrite existing files without confirmation
<span style="font-weight:bold;">-ro</span>, <span style="font-weight:bold;">--overwrite</span>=<span style="text-decoration:underline;">n</span> n do not overwrite existing files
<span style="font-weight:bold;">-N</span>, <span style="font-weight:bold;">--nothing</span>=<span style="text-decoration:underline;">T</span> False disable loading .visidatarc and plugin addons
<span style="font-weight:bold;">--visidata-dir</span>=<span style="text-decoration:underline;">str</span> /home/anja/.config/visidata
directory to load and store additional files
<span style="font-weight:bold;">--debug</span> False exit on error and display stacktrace
<span style="font-weight:bold;">--undo</span>=<span style="text-decoration:underline;">bool</span> True enable undo/redo
<span style="font-weight:bold;">--col-cache-size</span>=<span style="text-decoration:underline;">int</span> 0 max number of cache entries in each cached column
<span style="font-weight:bold;">--scroll-incr</span>=<span style="text-decoration:underline;">int</span> -3 amount to scroll with scrollwheel
<span style="font-weight:bold;">--force-256-colors</span> False use 256 colors even if curses reports fewer
<span style="font-weight:bold;">--quitguard</span> False confirm before quitting modified sheet
<span style="font-weight:bold;">--default-width</span>=<span style="text-decoration:underline;">int</span> 20 default column width
<span style="font-weight:bold;">--default-height</span>=<span style="text-decoration:underline;">int</span> 4 default column height
<span style="font-weight:bold;">--name-joiner</span>=<span style="text-decoration:underline;">str</span> _ string to join sheet or column names
<span style="font-weight:bold;">--value-joiner</span>=<span style="text-decoration:underline;">str</span> string to join display values
<span style="font-weight:bold;">--max-rows</span>=<span style="text-decoration:underline;">int</span> 1000000000 number of rows to load from source
<span style="font-weight:bold;">--wrap</span> False wrap text to fit window width on TextSheet
<span style="font-weight:bold;">--save-filetype</span>=<span style="text-decoration:underline;">str</span> tsv specify default file type to save as
<span style="font-weight:bold;">--profile</span> False enable profiling on threads
<span style="font-weight:bold;">--min-memory-mb</span>=<span style="text-decoration:underline;">int</span> 0 minimum memory to continue loading and async processing
<span style="font-weight:bold;">--encoding</span>=<span style="text-decoration:underline;">str</span> utf-8-sig encoding passed to codecs.open when reading a file
<span style="font-weight:bold;">--encoding-errors</span>=<span style="text-decoration:underline;">str</span> surrogateescape encoding_errors passed to codecs.open
<span style="font-weight:bold;">--mouse-interval</span>=<span style="text-decoration:underline;">int</span> 1 max time between press/release for click (ms)
<span style="font-weight:bold;">--bulk-select-clear</span> False clear selected rows before new bulk selections
<span style="font-weight:bold;">--some-selected-rows</span> False if no rows selected, if True, someSelectedRows returns all rows; if False, fails
<span style="font-weight:bold;">--regex-skip</span>=<span style="text-decoration:underline;">str</span> regex of lines to skip in text sources
<span style="font-weight:bold;">--regex-flags</span>=<span style="text-decoration:underline;">str</span> I flags to pass to re.compile() [AILMSUX]
<span style="font-weight:bold;">--load-lazy</span> False load subsheets always (False) or lazily (True)
<span style="font-weight:bold;">--skip</span>=<span style="text-decoration:underline;">int</span> 0 skip N rows before header
<span style="font-weight:bold;">--header</span>=<span style="text-decoration:underline;">int</span> 1 parse first N rows as column names
<span style="font-weight:bold;">--delimiter</span>=<span style="text-decoration:underline;">str</span> field delimiter to use for tsv/usv filetype
<span style="font-weight:bold;">--row-delimiter</span>=<span style="text-decoration:underline;">str</span> " row delimiter to use for tsv/usv filetype
<span style="font-weight:bold;">--tsv-safe-newline</span>=<span style="text-decoration:underline;">str</span> replacement for newline character when saving to tsv
<span style="font-weight:bold;">--tsv-safe-tab</span>=<span style="text-decoration:underline;">str</span> replacement for tab character when saving to tsv
<span style="font-weight:bold;">--visibility</span>=<span style="text-decoration:underline;">int</span> 0 visibility level
<span style="font-weight:bold;">--default-sample-size</span>=<span style="text-decoration:underline;">int</span> 100 number of rows to sample for regex.split (0=all)
<span style="font-weight:bold;">--fmt-expand-dict</span>=<span style="text-decoration:underline;">str</span> %s.%s format str to use for names of columns expanded from dict (colname, key)
<span style="font-weight:bold;">--fmt-expand-list</span>=<span style="text-decoration:underline;">str</span> %s[%s] format str to use for names of columns expanded from list (colname, index)
<span style="font-weight:bold;">--json-indent</span>=<span style="text-decoration:underline;">NoneType</span> None indent to use when saving json
<span style="font-weight:bold;">--json-sort-keys</span> False sort object keys when saving to json
<span style="font-weight:bold;">--json-ensure-ascii</span>=<span style="text-decoration:underline;">bool</span> True ensure ascii encode when saving json
<span style="font-weight:bold;">--default-colname</span>=<span style="text-decoration:underline;">str</span> column name to use for non-dict rows
<span style="font-weight:bold;">--filetype</span>=<span style="text-decoration:underline;">str</span> specify file type
<span style="font-weight:bold;">--safe-error</span>=<span style="text-decoration:underline;">str</span> #ERR error string to use while saving
<span style="font-weight:bold;">--save-encoding</span>=<span style="text-decoration:underline;">str</span> utf-8 encoding passed to codecs.open when saving a file
<span style="font-weight:bold;">--clean-names</span> False clean column/sheet names to be valid Python identifiers
<span style="font-weight:bold;">--replay-wait</span>=<span style="text-decoration:underline;">float</span> 0.0 time to wait between replayed commands, in seconds
<span style="font-weight:bold;">--rowkey-prefix</span>=<span style="text-decoration:underline;">str</span> キ string prefix for rowkey in the cmdlog
<span style="font-weight:bold;">--clipboard-copy-cmd</span>=<span style="text-decoration:underline;">str</span> xclip -selection clipboard -filter
command to copy stdin to system clipboard
<span style="font-weight:bold;">--clipboard-paste-cmd</span>=<span style="text-decoration:underline;">str</span> xclip -selection clipboard -o
command to send contents of system clipboard to stdout
<span style="font-weight:bold;">--fancy-chooser</span> False a nicer selection interface for aggregators and jointype
<span style="font-weight:bold;">--null-value</span>=<span style="text-decoration:underline;">NoneType</span> None a value to be counted as null
<span style="font-weight:bold;">--histogram-bins</span>=<span style="text-decoration:underline;">int</span> 0 number of bins for histogram of numeric columns
<span style="font-weight:bold;">--numeric-binning</span> False bin numeric columns into ranges
<span style="font-weight:bold;">--plot-colors</span>=<span style="text-decoration:underline;">str</span> list of distinct colors to use for plotting distinct objects
<span style="font-weight:bold;">--motd-url</span>=<span style="text-decoration:underline;">str</span> source of randomized startup messages
<span style="font-weight:bold;">--dir-depth</span>=<span style="text-decoration:underline;">int</span> 0 folder recursion depth on DirSheet
<span style="font-weight:bold;">--dir-hidden</span> False load hidden files on DirSheet
<span style="font-weight:bold;">--config</span>=<span style="text-decoration:underline;">Path</span> /home/saul/.visidatarc
config file to exec in Python
<span style="font-weight:bold;">--play</span>=<span style="text-decoration:underline;">str</span> file.vdj to replay
<span style="font-weight:bold;">--batch</span> False replay in batch mode (with no interface and all status sent to stdout)
<span style="font-weight:bold;">--output</span>=<span style="text-decoration:underline;">NoneType</span> None save the final visible sheet to output at the end of replay
<span style="font-weight:bold;">--preplay</span>=<span style="text-decoration:underline;">str</span> longnames to preplay before replay
<span style="font-weight:bold;">--imports</span>=<span style="text-decoration:underline;">str</span> plugins imports to preload before .visidatarc (command-line only)
<span style="font-weight:bold;">--nothing</span> False no config, no plugins, nothing extra
<span style="font-weight:bold;">--interactive</span> False run interactive mode after batch replay
<span style="font-weight:bold;">--overwrite</span>=<span style="text-decoration:underline;">str</span> c overwrite existing files {y=yes|c=confirm|n=no}
<span style="font-weight:bold;">--plugins-autoload</span>=<span style="text-decoration:underline;">bool</span> True do not autoload plugins if False
<span style="font-weight:bold;">--theme</span>=<span style="text-decoration:underline;">str</span> display/color theme to use
<span style="font-weight:bold;">--airtable-auth-token</span>=<span style="text-decoration:underline;">str</span> Airtable API key from https://airtable.com/account
<span style="font-weight:bold;">--matrix-token</span>=<span style="text-decoration:underline;">str</span> matrix API token
<span style="font-weight:bold;">--matrix-user-id</span>=<span style="text-decoration:underline;">str</span> matrix user ID associated with token
<span style="font-weight:bold;">--matrix-device-id</span>=<span style="text-decoration:underline;">str</span> VisiData device ID associated with matrix login
<span style="font-weight:bold;">--reddit-client-id</span>=<span style="text-decoration:underline;">str</span> client_id for reddit api
<span style="font-weight:bold;">--reddit-client-secret</span>=<span style="text-decoration:underline;">str</span> client_secret for reddit api
<span style="font-weight:bold;">--reddit-user-agent</span>=<span style="text-decoration:underline;">str</span> 3.2 user_agent for reddit api
<span style="font-weight:bold;">--zulip-batch-size</span>=<span style="text-decoration:underline;">int</span> -100 number of messages to fetch per call (<0 to fetch before anchor)
<span style="font-weight:bold;">--zulip-anchor</span>=<span style="text-decoration:underline;">int</span> 1000000000 message id to start fetching from
<span style="font-weight:bold;">--zulip-delay-s</span>=<span style="text-decoration:underline;">float</span> 1e-05 seconds to wait between calls (0 to stop after first)
<span style="font-weight:bold;">--zulip-api-key</span>=<span style="text-decoration:underline;">str</span> Zulip API key
<span style="font-weight:bold;">--zulip-email</span>=<span style="text-decoration:underline;">str</span> Email for use with Zulip API key
<span style="font-weight:bold;">--csv-dialect</span>=<span style="text-decoration:underline;">str</span> excel dialect passed to csv.reader
<span style="font-weight:bold;">--csv-delimiter</span>=<span style="text-decoration:underline;">str</span> , delimiter passed to csv.reader
<span style="font-weight:bold;">--csv-doublequote</span>=<span style="text-decoration:underline;">bool</span> True quote-doubling setting passed to csv.reader
<span style="font-weight:bold;">--csv-quotechar</span>=<span style="text-decoration:underline;">str</span> " quotechar passed to csv.reader
<span style="font-weight:bold;">--csv-quoting</span>=<span style="text-decoration:underline;">int</span> 0 quoting style passed to csv.reader and csv.writer
<span style="font-weight:bold;">--csv-skipinitialspace</span>=<span style="text-decoration:underline;">bool</span> True skipinitialspace passed to csv.reader
<span style="font-weight:bold;">--csv-escapechar</span>=<span style="text-decoration:underline;">NoneType</span> None escapechar passed to csv.reader
<span style="font-weight:bold;">--csv-lineterminator</span>=<span style="text-decoration:underline;">str</span> " lineterminator passed to csv.writer
<span style="font-weight:bold;">--safety-first</span> False sanitize input/output to handle edge cases, with a performance cost
<span style="font-weight:bold;">--f5log-object-regex</span>=<span style="text-decoration:underline;">NoneType</span> None A regex to perform on the object name, useful where object names have a structure to extract. Use the (?P<foo>...) named groups form to get column names.
<span style="font-weight:bold;">--f5log-log-year</span>=<span style="text-decoration:underline;">NoneType</span> 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.
<span style="font-weight:bold;">--f5log-log-timezone</span>=<span style="text-decoration:underline;">str</span> UTC The timezone the source file is in, by default UTC.
<span style="font-weight:bold;">--fixed-rows</span>=<span style="text-decoration:underline;">int</span> 1000 number of rows to check for fixed width columns
<span style="font-weight:bold;">--fixed-maxcols</span>=<span style="text-decoration:underline;">int</span> 0 max number of fixed-width columns to create (0 is no max)
<span style="font-weight:bold;">--graphviz-edge-labels</span>=<span style="text-decoration:underline;">bool</span> True whether to include edge labels on graphviz diagrams
<span style="font-weight:bold;">--grep-base-dir</span>=<span style="text-decoration:underline;">NoneType</span> None base directory for relative paths opened with sysopen-row
<span style="font-weight:bold;">--hdf5-matrix-enumerate</span> False enumerate matrix rows and columns
<span style="font-weight:bold;">--html-title</span>=<span style="text-decoration:underline;">str</span> <h2>{sheet.name}</h2>
table header when saving to html
<span style="font-weight:bold;">--http-max-next</span>=<span style="text-decoration:underline;">int</span> 0 max next.url pages to follow in http response
<span style="font-weight:bold;">--http-req-headers</span>=<span style="text-decoration:underline;">dict</span> {} http headers to send to requests
<span style="font-weight:bold;">--http-ssl-verify</span>=<span style="text-decoration:underline;">bool</span> True verify host and certificates for https
<span style="font-weight:bold;">--npy-allow-pickle</span> False numpy allow unpickling objects (unsafe)
<span style="font-weight:bold;">--npy-matrix-enumerate</span> False enumerate matrix rows and columns
<span style="font-weight:bold;">--pcap-internet</span>=<span style="text-decoration:underline;">str</span> n (y/s/n) if save_dot includes all internet hosts separately (y), combined (s), or does not include the internet (n)
<span style="font-weight:bold;">--pdf-tables</span> False parse PDF for tables instead of pages of text
<span style="font-weight:bold;">--postgres-schema</span>=<span style="text-decoration:underline;">str</span> public The desired schema for the Postgres database
<span style="font-weight:bold;">--s3-endpoint</span>=<span style="text-decoration:underline;">str</span> alternate S3 endpoint, used for local testing or alternative S3-compatible services
<span style="font-weight:bold;">--s3-glob</span>=<span style="text-decoration:underline;">bool</span> True enable glob-matching for S3 paths
<span style="font-weight:bold;">--s3-version-aware</span> False show all object versions in a versioned bucket
<span style="font-weight:bold;">--sqlite-onconnect</span>=<span style="text-decoration:underline;">str</span> sqlite statement to execute after opening a connection
<span style="font-weight:bold;">--xlsx-meta-columns</span> False include columns for cell objects, font colors, and fill colors
<span style="font-weight:bold;">--xlsx-color-cells</span>=<span style="text-decoration:underline;">bool</span> True color cells based on xlsx source
<span style="font-weight:bold;">--xml-parser-huge-tree</span>=<span style="text-decoration:underline;">bool</span> True allow very deep trees and very long text content
<span style="font-weight:bold;">--plt-marker</span>=<span style="text-decoration:underline;">str</span> . matplotlib.markers
<span style="font-weight:bold;">--plot-palette</span>=<span style="text-decoration:underline;">str</span> Set3 colorbrewer palette to use
<span style="font-weight:bold;">--server-addr</span>=<span style="text-decoration:underline;">str</span> 127.0.0.1 IP address to listen for commands
<span style="font-weight:bold;">--server-port</span>=<span style="text-decoration:underline;">int</span> 0 port to listen for commands
<span style="font-weight:bold;">--fixer-api-key</span>=<span style="text-decoration:underline;">str</span> API Key for api.apilayer.com/fixer
<span style="font-weight:bold;">--fixer-cache-days</span>=<span style="text-decoration:underline;">int</span> 1 Cache days for currency conversions
<span style="font-weight:bold;">--describe-aggrs</span>=<span style="text-decoration:underline;">str</span> mean stdev numeric aggregators to calculate on Describe sheet
<span style="font-weight:bold;">--incr-base</span>=<span style="text-decoration:underline;">float</span> 1.0 start value for column increments
<span style="font-weight:bold;">--ping-count</span>=<span style="text-decoration:underline;">int</span> 3 send this many pings to each host
<span style="font-weight:bold;">--ping-interval</span>=<span style="text-decoration:underline;">float</span> 0.1 wait between ping rounds, in seconds
<span style="font-weight:bold;">--regex-maxsplit</span>=<span style="text-decoration:underline;">int</span> 0 maxsplit to pass to regex.split
<span style="font-weight:bold;">--rename-cascade</span> False cascade column renames into expressions
<span style="font-weight:bold;">--faker-locale</span>=<span style="text-decoration:underline;">str</span> en_US default locale to use for Faker
<span style="font-weight:bold;">--faker-extra-providers</span>=<span style="text-decoration:underline;">NoneType</span> None list of additional Provider classes to load via add_provider()
<span style="font-weight:bold;">--faker-salt</span>=<span style="text-decoration:underline;">str</span> Use a non-empty string to enable deterministic fakes
<span style="font-weight:bold;">--mailcap-mimetype</span>=<span style="text-decoration:underline;">str</span> force mimetype for sysopen-mailcap
<span style="font-weight:bold;">--unfurl-empty</span> False if unfurl includes rows for empty containers
<span style="font-weight:bold;">DISPLAY</span> <span style="font-weight:bold;">OPTIONS</span>
Display options can only be set via the <span style="text-decoration:underline;">Options</span> <span style="text-decoration:underline;">Sheet</span> or a <span style="text-decoration:underline;">.visidatarc</span> (see <span style="text-decoration:underline;">FILES</span>).
<span style="font-weight:bold;">disp</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">menu</span> True show menu on top line when not active
<span style="font-weight:bold;">disp</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">menu</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">keys</span> True show keystrokes inline in submenus
<span style="font-weight:bold;">color</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">menu</span> black on 68 blue color of menu items in general
<span style="font-weight:bold;">color</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">menu</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">active</span> 223 yellow on black
color of active menu items
<span style="font-weight:bold;">color</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">menu</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">spec</span> black on 34 green color of sheet-specific menu items
<span style="font-weight:bold;">color</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">menu</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">help</span> black italic on 68 blue
color of helpbox
<span style="font-weight:bold;">disp</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">menu</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">boxchars</span> ││──┌┐└┘├┤ box characters to use for menus
<span style="font-weight:bold;">disp</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">menu</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">more</span> » command submenu indicator
<span style="font-weight:bold;">disp</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">menu</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">push</span> ⎘ indicator if command pushes sheet onto sheet stack
<span style="font-weight:bold;">disp</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">menu</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">input</span> … indicator if input required for command
<span style="font-weight:bold;">disp</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">menu</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">fmt</span> | VisiData {vd.version} | {vd.motd}
right-side menu format string
<span style="font-weight:bold;">disp</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">float</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">fmt</span> {:.02f} default fmtstr to format float values
<span style="font-weight:bold;">disp</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">int</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">fmt</span> {:d} default fmtstr to format int values
<span style="font-weight:bold;">disp</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">formatter</span> generic formatter to create the text in each cell (also used by text savers)
<span style="font-weight:bold;">disp</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">displayer</span> generic displayer to render the text in each cell
<span style="font-weight:bold;">disp</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">splitwin</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">pct</span> 0 height of second sheet on screen
<span style="font-weight:bold;">disp</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">note</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">none</span> ⌀ visible contents of a cell whose value is None
<span style="font-weight:bold;">disp</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">truncator</span> … indicator that the contents are only partially visible
<span style="font-weight:bold;">disp</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">oddspace</span> · displayable character for odd whitespace
<span style="font-weight:bold;">disp</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">more</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">left</span> < header note indicating more columns to the left
<span style="font-weight:bold;">disp</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">more</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">right</span> > header note indicating more columns to the right
<span style="font-weight:bold;">disp</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">error</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">val</span> displayed contents for computation exception
<span style="font-weight:bold;">disp</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">ambig</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">width</span> 1 width to use for unicode chars marked ambiguous
<span style="font-weight:bold;">disp</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">pending</span> string to display in pending cells
<span style="font-weight:bold;">disp</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">note</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">pending</span> : note to display for pending cells
<span style="font-weight:bold;">disp</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">note</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">fmtexc</span> ? cell note for an exception during formatting
<span style="font-weight:bold;">disp</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">note</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">getexc</span> ! cell note for an exception during computation
<span style="font-weight:bold;">disp</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">note</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">typeexc</span> ! cell note for an exception during type conversion
<span style="font-weight:bold;">color</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">note</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">pending</span> bold green color of note in pending cells
<span style="font-weight:bold;">color</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">note</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">type</span> 226 yellow color of cell note for non-str types in anytype columns
<span style="font-weight:bold;">color</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">note</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">row</span> 220 yellow color of row note on left edge
<span style="font-weight:bold;">disp</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">column</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">sep</span> │ separator between columns
<span style="font-weight:bold;">disp</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">keycol</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">sep</span> ║ separator between key columns and rest of columns
<span style="font-weight:bold;">disp</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">rowtop</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">sep</span> │
<span style="font-weight:bold;">disp</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">rowmid</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">sep</span> ⁝
<span style="font-weight:bold;">disp</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">rowbot</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">sep</span> ⁝
<span style="font-weight:bold;">disp</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">rowend</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">sep</span> ║
<span style="font-weight:bold;">disp</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">keytop</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">sep</span> ║
<span style="font-weight:bold;">disp</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">keymid</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">sep</span> ║
<span style="font-weight:bold;">disp</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">keybot</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">sep</span> ║
<span style="font-weight:bold;">disp</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">endtop</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">sep</span> ║
<span style="font-weight:bold;">disp</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">endmid</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">sep</span> ║
<span style="font-weight:bold;">disp</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">endbot</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">sep</span> ║
<span style="font-weight:bold;">disp</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">selected</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">note</span> •
<span style="font-weight:bold;">disp</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">sort</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">asc</span> ↑↟⇞⇡⇧⇑ characters for ascending sort
<span style="font-weight:bold;">disp</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">sort</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">desc</span> ↓↡⇟⇣⇩⇓ characters for descending sort
<span style="font-weight:bold;">color</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">default</span> white on black the default fg and bg colors
<span style="font-weight:bold;">color</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">default</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">hdr</span> bold white on black
color of the column headers
<span style="font-weight:bold;">color</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">bottom</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">hdr</span> underline white on black
color of the bottom header row
<span style="font-weight:bold;">color</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">current</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">row</span> reverse color of the cursor row
<span style="font-weight:bold;">color</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">current</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">col</span> bold on 232 color of the cursor column
<span style="font-weight:bold;">color</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">current</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">cell</span> color of current cell, if different from color_current_row+color_current_col
<span style="font-weight:bold;">color</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">current</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">hdr</span> bold reverse color of the header for the cursor column
<span style="font-weight:bold;">color</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">column</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">sep</span> white on black color of column separators
<span style="font-weight:bold;">color</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">key</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">col</span> 81 cyan color of key columns
<span style="font-weight:bold;">color</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">hidden</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">col</span> 8 color of hidden columns on metasheets
<span style="font-weight:bold;">color</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">selected</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">row</span> 215 yellow color of selected rows
<span style="font-weight:bold;">color</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">clickable</span> bold color of internally clickable item
<span style="font-weight:bold;">color</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">code</span> bold white on 237 color of code sample
<span style="font-weight:bold;">color</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">heading</span> bold black on yellow
color of header
<span style="font-weight:bold;">color</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">guide</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">unwritten</span> 243 on black color of unwritten guides in GuideGuide
<span style="font-weight:bold;">disp</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">wrap</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">max</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">lines</span> 3 max lines for multiline view
<span style="font-weight:bold;">disp</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">wrap</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">break</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">long</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">words</span> False break words longer than column width in multiline
<span style="font-weight:bold;">disp</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">wrap</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">replace</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">whitespace</span> False replace whitespace with spaces in multiline
<span style="font-weight:bold;">disp</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">wrap</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">placeholder</span> … multiline string to indicate truncation
<span style="font-weight:bold;">disp</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">multiline</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">focus</span> True only multiline cursor row
<span style="font-weight:bold;">color</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">multiline</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">bottom</span> color of bottom line of multiline rows
<span style="font-weight:bold;">color</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">aggregator</span> bold 255 white on 234 black
color of aggregator summary on bottom row
<span style="font-weight:bold;">disp</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">rstatus</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">fmt</span> {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
<span style="font-weight:bold;">disp</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">status</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">fmt</span> {sheet.sheetlist}|
left-side status format string
<span style="font-weight:bold;">disp</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">lstatus</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">max</span> 0 maximum length of left status line
<span style="font-weight:bold;">disp</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">status</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">sep</span> │ separator between statuses
<span style="font-weight:bold;">color</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">keystrokes</span> bold white on 237 color of input keystrokes
<span style="font-weight:bold;">color</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">longname</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">guide</span> 237 color of command longnames
<span style="font-weight:bold;">color</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">longname</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">status</span> white color of command longnames
<span style="font-weight:bold;">color</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">keys</span> bold reverse color of keystrokes in help
<span style="font-weight:bold;">color</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">status</span> bold on 238 status line color
<span style="font-weight:bold;">color</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">error</span> 202 1 error message color
<span style="font-weight:bold;">color</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">warning</span> 166 15 warning message color
<span style="font-weight:bold;">color</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">top</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">status</span> underline top window status bar color
<span style="font-weight:bold;">color</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">active</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">status</span> black on 68 blue active window status bar color
<span style="font-weight:bold;">color</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">inactive</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">status</span> 8 on black inactive window status bar color
<span style="font-weight:bold;">color</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">highlight</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">status</span> black on green color of highlighted elements in statusbar
<span style="font-weight:bold;">color</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">working</span> 118 5 color of system running smoothly
<span style="font-weight:bold;">color</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">edit</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">unfocused</span> 238 on 110 display color for unfocused input in form
<span style="font-weight:bold;">color</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">edit</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">cell</span> 233 on 110 cell color to use when editing cell
<span style="font-weight:bold;">disp</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">edit</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">fill</span> _ edit field fill character
<span style="font-weight:bold;">disp</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">unprintable</span> · substitute character for unprintables
<span style="font-weight:bold;">disp</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">date</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">fmt</span> %Y-%m-%d default fmtstr passed to strftime for date values
<span style="font-weight:bold;">disp</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">currency</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">fmt</span> %.02f default fmtstr to format for currency values
<span style="font-weight:bold;">color</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">currency</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">neg</span> red color for negative values in currency displayer
<span style="font-weight:bold;">disp</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">replay</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">play</span> ▶ status indicator for active replay
<span style="font-weight:bold;">disp</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">replay</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">record</span> ⏺ status indicator for macro record
<span style="font-weight:bold;">color</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">status</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">replay</span> green color of replay status indicator
<span style="font-weight:bold;">disp</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">histogram</span> ■ histogram element character
<span style="font-weight:bold;">disp</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">graph</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">labels</span> True show axes and legend on graph
<span style="font-weight:bold;">disp</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">canvas</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">charset</span> ⠀⠁⠂⠃⠄⠅⠆⠇⠈⠉⠊⠋⠌⠍⠎⠏⠐⠑⠒⠓⠔⠕⠖⠗⠘⠙⠚⠛⠜⠝⠞⠟⠠⠡⠢⠣⠤⠥⠦⠧⠨⠩⠪⠫⠬⠭⠮⠯⠰⠱⠲⠳⠴⠵⠶⠷⠸⠹⠺⠻⠼⠽⠾⠿⡀⡁⡂⡃⡄⡅⡆⡇⡈⡉⡊⡋⡌⡍⡎⡏⡐⡑⡒⡓⡔⡕⡖⡗⡘⡙⡚⡛⡜⡝⡞⡟⡠⡡⡢⡣⡤⡥⡦⡧⡨⡩⡪⡫⡬⡭⡮⡯⡰⡱⡲⡳⡴⡵⡶⡷⡸⡹⡺⡻⡼⡽⡾⡿⢀⢁⢂⢃⢄⢅⢆⢇⢈⢉⢊⢋⢌⢍⢎⢏⢐⢑⢒⢓⢔⢕⢖⢗⢘⢙⢚⢛⢜⢝⢞⢟⢠⢡⢢⢣⢤⢥⢦⢧⢨⢩⢪⢫⢬⢭⢮⢯⢰⢱⢲⢳⢴⢵⢶⢷⢸⢹⢺⢻⢼⢽⢾⢿⣀⣁⣂⣃⣄⣅⣆⣇⣈⣉⣊⣋⣌⣍⣎⣏⣐⣑⣒⣓⣔⣕⣖⣗⣘⣙⣚⣛⣜⣝⣞⣟⣠⣡⣢⣣⣤⣥⣦⣧⣨⣩⣪⣫⣬⣭⣮⣯⣰⣱⣲⣳⣴⣵⣶⣷⣸⣹⣺⣻⣼⣽⣾⣿
charset to render 2x4 blocks on canvas
<span style="font-weight:bold;">disp</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">graph</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">pixel</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">random</span> False randomly choose attr from set of pixels instead of most common
<span style="font-weight:bold;">disp</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">zoom</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">incr</span> 2.0 amount to multiply current zoomlevel when zooming
<span style="font-weight:bold;">color</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">graph</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">hidden</span> 238 blue color of legend for hidden attribute
<span style="font-weight:bold;">color</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">graph</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">selected</span> bold color of selected graph points
<span style="font-weight:bold;">color</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">graph</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">axis</span> bold color for graph axis labels
<span style="font-weight:bold;">disp</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">graph</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">tick</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">x</span> ╵ character for graph x-axis ticks
<span style="font-weight:bold;">color</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">graph</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">refline</span> color for graph reference value lines
<span style="font-weight:bold;">disp</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">graph</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">reflines</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">x</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">charset</span> ▏││▕ charset to render vertical reference lines on graph
<span style="font-weight:bold;">disp</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">graph</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">reflines</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">y</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">charset</span> ▔──▁ charset to render horizontal reference lines on graph
<span style="font-weight:bold;">disp</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">graph</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">multiple</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">reflines</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">char</span> ▒ char to render multiple parallel reflines
<span style="font-weight:bold;">disp</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">expert</span> 0 max level of options and columns to include
<span style="font-weight:bold;">color</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">add</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">pending</span> green color for rows pending add
<span style="font-weight:bold;">color</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">change</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">pending</span> reverse yellow color for cells pending modification
<span style="font-weight:bold;">color</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">delete</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">pending</span> red color for rows pending delete
<span style="font-weight:bold;">disp</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">sidebar</span> True whether to display sidebar
<span style="font-weight:bold;">disp</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">sidebar</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">fmt</span> format string for default sidebar
<span style="font-weight:bold;">disp</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">sidebar</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">width</span> 0 max width for sidebar
<span style="font-weight:bold;">disp</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">sidebar</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">height</span> 0 max height for sidebar
<span style="font-weight:bold;">color</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">sidebar</span> black on 114 blue base color of sidebar
<span style="font-weight:bold;">color</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">sidebar</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">title</span> black on yellow color of sidebar title
<span style="font-weight:bold;">color</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">match</span> red color for matching chars in palette chooser
<span style="font-weight:bold;">color</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">f5log</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">mon</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">up</span> green color of f5log monitor status up
<span style="font-weight:bold;">color</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">f5log</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">mon</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">down</span> red color of f5log monitor status down
<span style="font-weight:bold;">color</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">f5log</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">mon</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">unknown</span> blue color of f5log monitor status unknown
<span style="font-weight:bold;">color</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">f5log</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">mon</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">checking</span> magenta color of monitor status checking
<span style="font-weight:bold;">color</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">f5log</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">mon</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">disabled</span> black color of monitor status disabled
<span style="font-weight:bold;">color</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">f5log</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">logid</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">alarm</span> red color of alarms
<span style="font-weight:bold;">color</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">f5log</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">logid</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">warn</span> yellow color of warnings
<span style="font-weight:bold;">color</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">f5log</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">logid</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">notice</span> cyan color of notice
<span style="font-weight:bold;">color</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">f5log</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">logid</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">info</span> green color of info
<span style="font-weight:bold;">color</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">xword</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">active</span> green color of active clue
<span style="font-weight:bold;">color</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">cmdpalette</span> black on 72 base color of command palette
<span style="font-weight:bold;">disp</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">cmdpal</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">max</span> 10 max number of suggestions for command palette
<span style="font-weight:bold;">disp</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">scroll</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">context</span> 0 minimum number of lines to keep visible above/below cursor when scrolling
<span style="font-weight:bold;">disp</span><span style="text-decoration:underline;">_</span><span style="font-weight:bold;">sparkline</span> ▁▂▃▄▅▆▇ characters to display sparkline
<span style="font-weight:bold;">EXAMPLES</span>
<span style="font-weight:bold;">vd</span>
launch <span style="font-weight:bold;">DirSheet</span> for current directory
<span style="font-weight:bold;">vd</span> <span style="font-weight:bold;">foo.tsv</span>
open the file foo.tsv in the current directory
<span style="font-weight:bold;">vd</span> <span style="font-weight:bold;">-f</span> <span style="font-weight:bold;">ddw</span>
open blank sheet of type ddw
<span style="font-weight:bold;">vd</span> <span style="font-weight:bold;">new.tsv</span>
open new blank tsv sheet named <span style="text-decoration:underline;">new</span>
<span style="font-weight:bold;">vd</span> <span style="font-weight:bold;">-f</span> <span style="font-weight:bold;">sqlite</span> <span style="font-weight:bold;">bar.db</span>
open the file bar.db as a sqlite database
<span style="font-weight:bold;">vd</span> <span style="font-weight:bold;">foo.tsv</span> <span style="font-weight:bold;">-n</span> <span style="font-weight:bold;">-f</span> <span style="font-weight:bold;">sqlite</span> <span style="font-weight:bold;">bar.db</span>
open foo.tsv as tsv and bar.db as a sqlite database
<span style="font-weight:bold;">vd</span> <span style="font-weight:bold;">-f</span> <span style="font-weight:bold;">sqlite</span> <span style="font-weight:bold;">foo.tsv</span> <span style="font-weight:bold;">bar.db</span>
open both foo.tsv and bar.db as a sqlite database
<span style="font-weight:bold;">vd</span> <span style="font-weight:bold;">-b</span> <span style="font-weight:bold;">countries.fixed</span> <span style="font-weight:bold;">-o</span> <span style="font-weight:bold;">countries.tsv</span>
convert countries.fixed (in fixed width format) to countries.tsv (in tsv format)
<span style="font-weight:bold;">vd</span> <span style="font-weight:bold;">postgres://</span><span style="text-decoration:underline;">username</span><span style="font-weight:bold;">:</span><span style="text-decoration:underline;">password</span><span style="font-weight:bold;">@</span><span style="text-decoration:underline;">hostname</span><span style="font-weight:bold;">:</span><span style="text-decoration:underline;">port</span><span style="font-weight:bold;">/</span><span style="text-decoration:underline;">database</span>
open a connection to the given postgres database
<span style="font-weight:bold;">vd</span> <span style="font-weight:bold;">--play</span> <span style="font-weight:bold;">tests/pivot.vdj</span> <span style="font-weight:bold;">--replay-wait</span> <span style="font-weight:bold;">1</span> <span style="font-weight:bold;">--output</span> <span style="font-weight:bold;">tests/pivot.tsv</span>
replay tests/pivot.vdj, waiting 1 second between commands, and output the final sheet to test/pivot.tsv
<span style="font-weight:bold;">ls</span> <span style="font-weight:bold;">-l</span> | <span style="font-weight:bold;">vd</span> <span style="font-weight:bold;">-f</span> <span style="font-weight:bold;">fixed</span> <span style="font-weight:bold;">--skip</span> <span style="font-weight:bold;">1</span> <span style="font-weight:bold;">--header</span> <span style="font-weight:bold;">0</span>
parse the output of ls -l into usable data
<span style="font-weight:bold;">ls</span> | <span style="font-weight:bold;">vd</span> | <span style="font-weight:bold;">lpr</span>
interactively select a list of filenames to send to the printer
<span style="font-weight:bold;">vd</span> <span style="font-weight:bold;">newfile.tsv</span>
open a blank sheet named <span style="text-decoration:underline;">newfile</span> if file does not exist
<span style="font-weight:bold;">vd</span> <span style="font-weight:bold;">sample.xlsx</span> <span style="font-weight:bold;">+:sheet1:2:3</span>
launch with <span style="font-weight:bold;">sheet1</span> at top-of-stack, and cursor at column <span style="font-weight:bold;">2</span> and row <span style="font-weight:bold;">3</span>
<span style="font-weight:bold;">vd</span> <span style="font-weight:bold;">-P</span> <span style="font-weight:bold;">open-plugins</span>
preplay longname <span style="font-weight:bold;">open-plugins</span> before starting the session
<span style="font-weight:bold;">FILES</span>
At the start of every session, <span style="font-weight:bold;">VisiData</span> looks for <span style="text-decoration:underline;">$HOME/.visidatarc</span>, 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).
<span style="font-weight:bold;">SUPPORTED</span> <span style="font-weight:bold;">SOURCES</span>
Core VisiData includes these sources:
<span style="font-weight:bold;">tsv</span> (tab-separated value)
Plain and simple. <span style="font-weight:bold;">VisiData</span> writes tsv format by default. See the <span style="font-weight:bold;">--tsv-delimiter</span> option.
<span style="font-weight:bold;">csv</span> (comma-separated value)
.csv files are a scourge upon the earth, and still regrettably common.
See the <span style="font-weight:bold;">--csv-dialect</span>, <span style="font-weight:bold;">--csv-delimiter</span>, <span style="font-weight:bold;">--csv-quotechar</span>, and <span style="font-weight:bold;">--csv-skipinitialspace</span> options.
Accepted dialects are <span style="font-weight:bold;">excel-tab</span>, <span style="font-weight:bold;">unix</span>, and <span style="font-weight:bold;">excel</span>.
<span style="font-weight:bold;">fixed</span> (fixed width text)
Columns are autodetected from the first 1000 rows (adjustable with <span style="font-weight:bold;">--fixed-rows</span>).
<span style="font-weight:bold;">json</span> (single object) and <span style="font-weight:bold;">jsonl</span>/<span style="font-weight:bold;">ndjson</span>/<span style="font-weight:bold;">ldjson</span> (one object per line).
Cells containing lists (e.g. <span style="font-weight:bold;">[3]</span>) or dicts (<span style="font-weight:bold;">{3}</span>) can be expanded into new columns with <span style="font-weight:bold;">(</span> and unexpanded with <span style="font-weight:bold;">)</span>.
<span style="font-weight:bold;">sqlite</span>
May include multiple tables. The initial sheet is the table directory; <span style="font-weight:bold;">Enter</span> loads the entire table into memory. <span style="font-weight:bold;">z^S</span> saves modifications to source.
URL schemes are also supported:
<span style="font-weight:bold;">http</span> (requires <span style="font-weight:bold;">requests</span>); 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, <span style="font-weight:bold;">.zip</span>, <span style="font-weight:bold;">.gz</span>, <span style="font-weight:bold;">.bz2</span>, <span style="font-weight:bold;">.xz</span>, <span style="font-weight:bold;">,zstd</span>, and <span style="font-weight:bold;">.zst</span> files are decompressed on the fly.
<span style="font-weight:bold;">AUTHOR</span>
<span style="font-weight:bold;">VisiData</span> was made by Saul Pwanson <<span style="text-decoration:underline;">[email protected]</span>>.
Linux/MacOS June 13, 2025 Linux/MacOS
</pre></section>
---
eleventyNavigation:
key: Command Menus
order: 12
Updated: 2021-09-02
Version: VisiData v2.6
---
At the top of the screen, there's a typical application toplevel menubar:
Sheet Edit View Column ...
You can press `Ctrl+H` to activate the Help menu (shown in the upper right).
Then you can use the arrow keys (or `hjkl` of course) to navigate the various commands and submenus.
`Enter` or `Space` will execute the command or dive into the submenu.
`q` or `Esc` or `Ctrl+Q` will leave the menu without taking an action.
## Other ways of opening the menu
`Alt+S` or `Alt+E` etc will open that specific submenu (see the underlined letter).
On Macos, `Option+S` etc should work the same (with the exception of `Option+E`, which needs to be `Option+E+Space`).
You can also click on the menu with the mouse to open it, as well as clicking on the various menu items to navigate to them.
Click on the already active menu item will execute the command or navigate into the submenu.
Click off the menu to deactivate it.
## Menu annotations
The `…` annotation, like in traditional GUI menus, indicates that the command requires further input.
The `⎘` annotation on a command is specific to VisiData, and means that the command will push a sheet onto the sheet stack, so your data context will change. You can always return to the previous sheet with `q` (or if you like taking the long way around, the "Sheet»Quit»Top sheet" command in the menu).
## Configuration Options
To make the top menu line disappear (as it looked pre-2.6)
options.disp_menu = False
The menu can still be activated with `Ctrl+H` or the Alt+ keys as above. The menu system cannot be entirely disabled.
### Theme options
As with most VisiData display elements, the menu can be altered to taste. These options are available to change the colors and displayed chars:
- `color_menu`
- `color_menu_active`
- `color_menu_spec`
- `color_menu_help`
- `disp_menu_boxchars`
- `disp_menu_more`
- `disp_menu_input`
- `disp_menu_push`
## Plugin API for adding new menu items
The menu can be extended with additional commands. See the [plugin API](/docs/api/interface).
---
eleventyNavigation:
key: Mouse
order: 15
Update: 2022-06-19
Version: VisiData v2.8
---
## How to disable the mouse in VisiData?
To disable for all sessions, add to your `~/.visidatarc`:
options.mouse_interval = 0 # disables the mouse-click
options.scroll_incr = 0 # disables the scroll wheel
To disable in the current session, press `SPACE`, and type the longname *mouse-disable*.
---
eleventyNavigation:
key: How can I move around and search?
order: 99
---
- basic movement just like vim
- 'G' 'gg' '^G' work as in vim, as do some of the 'z' scroll commands
- 'g' prefix goes all the way
. 'gh' (or g Left) already goes to the first column, but maybe '0' should also.
- (call out no number prefix?)
- '/' and '?' search for regex, 'n' and 'N' continue. These should work just like in vim but only within a single column.
- 'g' searches across all columns
- 'zr'/'zc' go to a specific row or column by number
- 'r' and 'c' go by row key or column name
i
- 'g' and 'z' are also command prefixes in vd, but in vd they generally means something like 'g'lobal/embi'g'gen and 'z'croll/'z'mallify.
---
eleventyNavigation:
key: Navigation
order: 3
updated: 2020-07-18
version: VisiData 2.0
---
## How to rapidly scroll through a sheet
Command(s) Operation
-------------- ---------------
` ← ↑ → ↓ PgUp PgDn Home End` move as expected
` h` ` j` ` k` ` l` move cursor **one cell** left/down/up/right (like in vim)
`gh` `gj` `gk` `gl` move **all the way** to the left/bottom/top/right of sheet
` <` ` >` move up/down the current column to the next **value which differs from current cell**
` {` ` }` move up/down the current column to the next **[selected](/docs/rows#subset) row**
---
## How to search within a sheet
Command(s) Operation
-------------- ---------------
` /` ` ?` *regex* search for *regex* matches up/down the **current** column
`g/` `g?` *regex* search for *regex* matches up/down over **all visible** columns
` n` `Shift+N` move to next/previous *regex* match from last search
`z/` `z?` *expr* search by Python *expr* up/down (with column names as variables)
The following example uses [sample.tsv](https://raw.githubusercontent.com/saulpw/visidata/stable/sample_data/sample.tsv).
**Question** Has there been a day where we sold more than 95 **Item**s?
1. Set the type of the **Units** column to integer by moving to the **Units** column and pressing `#`.
2. Type `z/` followed by `Units > 95`.
**Question** What is the **longname** for `gk`?
1. Press `z Ctrl+H` to open the **Commands sheet**.
2. Move to the `keystrokes` column and press `/`, followed by `gk`.
3. Press `c` followed by `longname` to move the cursor to the **longname** column.
---
## How to move between sheets
The Sheets Sheet is a list of all sheets that have ever been opened (in order of opening).
The Sheets Stack (`z Shift+S`is the list of active sheets (most recently used at top).
###### Jumping to sheets
1. Press `Shift+S` to open the **Sheets sheet**.
2. Move the cursor to the row containing the desired sheet.
3. Press `Enter` to jump to the sheet referenced in that current cursor row.
###### Jumping away from sheets
Command(s) Operation
-------------- ---------------
`Ctrl+^` jump to the previous sheet, without closing the current one
`q` quit the current sheet (closes it)
**Note**: A quit/closed sheet is grayed out on the Sheets Sheet.
Closed sheets are removed from the active sheets stack, and the next sheet is then shown. When the active sheets stack is empty, VisiData exits.
---
---
eleventyNavigation:
key: Pipes
order: 14
Update: 2019-09-11
Version: VisiData 2.0
---
## stdin/stdout pipe/redirect
VisiData works with other tools in a pipeline. VisiData will read any piped input from stdin as a sheet, and save the
results of any remaining sheets to stdout Visdata allows interactive edits in the middle of a pipeline.
- Use it to manually update (sort, filter, edit) tabular data in a pipeline `mysql < query.sql | vd | awk 'awkity {awk}'
- Use it to interactively pick processes to kill `ps -ef | vd | tail -n +2 | xargs --no-run-if-empty kill`
When redirecting VisiData output:
- `Ctrl+Q` will output current sheet (as it quits with the top sheet still on the stack)
- `q` (or `gq`) will output nothing (as it quits by dropping all sheets from the stack)
Use `vd -o-` to send directly to the terminal when not redirecting stdout (it's not necessary if already redirected).
To output a single column without the column header, make sure only that column is visible and save as .txt. For example, `vd . --save-filetype txt | lpr`.
---
eleventyNavigation:
key: Plugins
order: 13
Updated: 2023-11-22
Version: VisiData 3.0
---
A *plugin* is an optional Python module to modify or extend VisiData functionality. Once installed, all plugins are automatically imported when `vd` is started.
# How to install a plugin
Plugins can be installed in 3 places:
1. They can come packaged with the VisiData install.
2. They can be installed via pip.
3. They can be copied into the `.visidata/plugins/` directory.
## builtin plugins
The VisiData release includes additional functionality that isn't enabled by default, but which can be made available by importing the module.
For example, there are some features available in `visidata.experimental`, like `digit_autoedit`, which starts editing the current cell when a numeric digit is pressed (like Excel).
VisiData intentionally does not work this way, but people who prefer their terminal applications to act more like Excel can add this to their .visidatarc:
import visidata.experimental.digit_autoedit
## via pip
Any package with a `visidata.plugins` entry point will be loaded automatically by default.
These plugins must be managed via pip (to upgrade or remove).
Plugins can be published to PyPI or downloaded as wheels or installed directly from source.
For example, `DarkDraw` is a VisiData plugin that allows drawing text-art.
Once the Python module is installed, you can use `vd` to open and save a `.ddw` file, which is a text image or animation specified in JSON format.
It also adds other commands and options.
## copied manually into local plugins directory
Finally, `.visidatarc` can import any Python code.
Since any Python modules in the `options.visidata_dir` directory (default `~/.visidata/`) are available for import,
you can copy a plugin into a module in that directory and import it that way.
To install a plugin manually:
1. Make a `plugins` directory: `mkdir -p ~/.visidata/plugins`
2. Copy the plugin Python file there: `cp myplugin.py ~/.visidata/plugins`
3. Add a line to your ~/.visidatarc to import the plugin: `import plugins.myplugin`
4. Install the dependencies for the plugin (if any).
# How to Disable Plugins
The nuclear option is `--nothing` or `-N` flag, which forces the base configuration, not loading any .visidatarc or plugins.
This is especially useful for debugging; when filing an issue, please make sure the bug reproduces with `-N` (if not, it is likely something in your .visidatarc)
To load `.visidatarc` but not autoload plugins installed with pip, set `options.plugins_autoload` on the command-line:
`vd --plugins-autoload=False`
Plugins explicitly imported in .visidatarc will still be installed.
# VisiData API reference
For help making plugins, see the [VisiData API reference](https://visidata.org/docs/api).
---
eleventyNavigation:
key: Rows
order: 4
Update: 2023-10-12
Version: VisiData 3.0
---
## [How to perform operations on a subset of rows](#subset) {#subset}
Many commands can be finetuned to operate on rows which are 'selected'.
###### How to specify the subset of rows which are selected
Command(s) Operation
----------------- -------------
`s` `t` `u` select/toggle/unselect **current** row
`gs` `gt` `gu` select/toggle/unselect **all** rows
`|` `\` *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
`,` select rows matching current cell in **current** column
`g,` select rows matching **entire current** row in **all visible** columns
An example usage follows.
---
## How to filter rows
1. Press `s` or `t` on the rows to be filtered.
2. Press
a. `gd` to delete the selected rows.
**or**
b. `"` to open a duplicate sheet which has references to the selected rows. Edits performed within the duplicate sheet will also propagate to the source sheet.
**or**
c. `g"` to open a duplicate sheet which has references to all rows, and keeping the selected rows selected. The selection can be modified on the parent sheet and the new sheet independently, but any changes will not be reflected on both sheets.
**or**
d. `z"` to open a copy of the sheet which has copies of the selected rows. Any changes will not affect the source sheet.
**or**
d. `gz"` to open a copy of the sheet which has copies of all rows. Any changes will be reflected on the source sheet
The following example uses the file [sample.tsv](https://raw.githubusercontent.com/saulpw/visidata/stable/sample_data/sample.tsv).
**Question** On which days have we sold less than 10 Binders?
1. Scroll to the `Units` column. Set the type of the `Units` column by pressing `#` (int).
2. Type `z|` followed by `Item == 'Binder' and Units < 10` to select all of the rows where the `Item` is Binder and the number of `Units` is less than 10.
3. Press `"` to open a duplicate sheet with only those selected rows.
---
## How to filter a random subset of rows
1. Type `Space` `random-rows` followed by the *number* of rows you wish included in your random population sample.
---
## How to select rows where the current column is not null or empty?
'Null' cells, by default, are cells which contain `None`. This can be changed with `options.null_value`. Null cells can be set with `zd` (set current cell to `None`) or `gzd` (set selected rows in current column to `None`). Null cells are distinguished with a yellow ∅' symbol on the right hand corner. They are distinct from empty cells (which are `''` in columns of string type.)
1. Type `|` followed by *.* to select all rows without empty or null cells in the current column.
---
## How to select rows where the current column is null?
There are several different options:
- `z,` matches by **typed value** while `,` matches by **display value**. Move to an empty or `None` cell in the column of interest and press `,` to select all empty and `None` cells in that column. Type `z,` on a `None` cell to select all rows that contain `None` in that column. Type `z.` on an empty cell to select all rows that have an empty cell in that column.
- Open a **DescribeSheet** for the current sheet with `Shift+I`. Move to the **nulls** column, and then move to the row which references the source column of interest. Type `zs` to select all null rows for that column.
- `z|` is a command which allows selection by provided Python expression criteria (using column names as variables). For non-numerical columns `z|` followed by **not ColumnName**, will select all empty cells and `None` cells for that column. For numerical columns it will also select cells with `0`.
- [A typed value of Python None is always a `TypedWrapper`](https://www.visidata.org/docs/api/columns.html#user-defined-types), which allows sorting, etc., on columns with None values. For this reason `z|` *ColumnName is None* will not work, thought `z|` *ColumnName.val is None* will work. This is not a recommended approach, though at the moment, it is available.
---
## How to move, copy and remove rows
Command(s) Operation
----------------- -------------
`J` `K` move cursor row down/up
`gJ` `gK` move cursor row all the way to the bottom/top of sheet
###### How to copy and paste a single row
1. Press `y` to copy the row to the clipboard.
2. Move the cursor to the desired location.
3. Press `p`/`Shift+P` to paste the row after/before current row.
###### How to copy and paste multiple rows
1. Press `s`/`t` on those rows to select them.
2. Press `gy` to copy all selected rows to the clipboard.
3. Move the cursor to the desired location.
3. Press `p`/`Shift+P` to paste those rows after/before current row.
###### Note
VisiData has a universal paste mechanism: it creates new rows on the target sheet and then fills them with values from the copied rows from the previous sheet.
This value-filling happens positionally, so if columns are missing or in a different order, the values will be in different columns,
---
## How to sort rows
Command(s) Operation
----------------- -------------
`[` `]` sorts ascending/descending by **current** column; replace any existing sort criteria
`g[` `g]` sorts ascending/descending by **all key** columns; replace any existing sort criteria
`z[` `z]` sorts ascending/descending by **current** column; add to existing sort criteria
`gz[` `gz]` sorts ascending/descending by **all key** column; add to existing sort criteria
###### How to sort a numerical column from highest number to lowest:
1. Set the type of the column being sorted by pressing `#` (int) or `%` (float).
2. Press `[` to sort the column from highest to lowest.
###### How to sort a date column in chronological order:
1. Set the type of the column being sorted by pressing `@` (date).
2. Press `]` to sort the column chronologically.
###### How to sort based on multiple columns
1. Press `!` on those columns to designate them as key columns.
2. Press `g[` or `g]` to sort.
**or**
1. Sort the first column with `[` or `]`.
2. Sort the next column with `z[` or `z]` to add sorting to the existing criteria.
###### How to increase row height
Press `v` on any **TableSheet** to toggle multi-line rows. This dynamically lengthens rows so that the full content of the column is visible.
Multi-line rows have some limitations; they can't be paged, for instance. The full contents of a cell can be viewed or edited in an external program like `emacs` or `less`:
* Press `e` on a cell to enter Editing mode. Then scroll left and right to explore its contents.
* Press `Ctrl+O` while in editing mode, to open the contents of the current cell in an external *$EDITOR*.
**TextSheet-specific options**
**TextSheet**s are used for loading `.txt` files in VisiData. They are also the default loaders used for un-identified sources. They are notable for having a single column which has the name "text".
**TextSheet**s have a bonus option `wrap` which will wrap the text into multiple rows, so that it fits the window width.
* On **TextSheet**, press `Shift+O` to open its **OptionsSheet**. Press `Enter` on the `wrap` option, to set it to *True*. Press `q` to return to your **TextSheet**. Reload it with `Ctrl+R`. Note that **reload** undoes an previous modifications you may have made to the **TextSheet**.
* On the commandline, the option `--wrap` will set the `wrap` option to *True* for all **TextSheet**s in that session.
* In your `~.visidatarc`, `options.wrap = True` will set the `wrap` option to *True* for all **TextSheet**s in every session.
---
---
eleventyNavigation:
key: Save and Restore
order: 11
Updated: 2018-01-17
Version: VisiData 0.99
---
## How to save and replay a VisiData session
This example creates and then uses the file [pivot.vdj](https://raw.githubusercontent.com/saulpw/visidata/stable/tests/pivot.vdj).
<section id="hero">
<asciinema-player id="player" poster="npt:0:41" rows=27 src="../casts/save-restore.cast"></asciinema-player>
<script type="text/javascript" src="/asciinema-player.js"></script>
</section>
To save and restore a session in VisiData:
1. Save the cmdlog using *one* of the following options:
a. Press `Ctrl+D` to save the cmdlog to a `fn.vdj` file.
*or*
b. Press `Shift+D` to view the `CommandLog Sheet`, then press `Ctrl+S` and save it with a `.vdj` suffix.
2. Press `gq` to quit VisiData.
3. Replay the cmdlog, on the commandline: `vd -p fn.vdj`.
---
---
eleventyNavigation:
key: Shell
order: 10
update: 2022-08-16
version: VisiData v2.9
---
## How to add ZSH Completion
1. Clone the VisiData repo: `git clone https://github.com/saulpw/visidata`
2. `cd visidata`
3. Run the script that will create the list of autocompletes for visidata
~~~
dev/zsh_completion.py
~~~
4. `echo $fpath | grep site-functions` to learn where your zsh site-functions folder is located. (Possible locations `/usr/share/zsh/site-functions`, `/usr/local/share/zsh/site-functions`)
5. Move the visidata compdefs to where zsh can find them: `sudo mv _visidata /path/to/site-functions`
6. `compinit`
7. Check that the autocompletes are configured with `grep -n visidata ~/.zcompdump`
---
eleventyNavigation:
key: Split view
order: 99
---
# Viewing two sheets simultaneously
VisiData supports the viewing of two sheets simultaneously with a feature called split screen.
## Entering split screen mode
Keystroke(s) Action
------------ ------
`Shift+Z` split screen in half, placing second sheet on stack visibly in the second pane
`z Shift+Z` *n* split screen, setting the height of the second screen to *n*
When there is a single pane, all currently-open sheets are situated within the same sheets stack. The more recent that sheet was viewed, the higher it is in the [stack](https://jsvine.github.io/intro-to-visidata/basics/understanding-sheets/#how-to-use-the-sheets-sheet).
Split-pane opens a second window, and creates a second stack for it. This keeps the sheet stably within a specific window.
For instance, pressing `Shift+C` on the [sample.tsv]() will give us a stack with two columns, the sample **Sheet** and its **Columns Sheet**.
![]
Pressing `Shift+Z` will now give us a view of them both, with the sample **Sheet** moved to the second window.
![]
## Split screen mode specific commands
While in split screen mode, you can move between windows, adjust the sheets that appear in the current window, and full-screen the current pane.
Keystroke(s) Action
------------ ------
`z Shift+Z` *n* adjust the height of the second window to *n*
`g Shift+Z` full screen the current window
`Tab` make the other window the active window
`Ctrl+^` swap top two sheets in stack in current window, second sheet in stack is now visible
`g Ctrl+^` cycle through sheets in stack in current window
For instance, we can use `Tab` to make the sample **Sheet** the active window.
![]
Moving around it, we can see the **Columns Sheet** in the top window continuing to be updated.
We can press `Shift+F` on the **Item** column to view its [Frequency Table]().
Now, the visible sheet of the second window has changed, while the visible sheet on the top window has stayed the same.
![]
We can use `^^`, so that sample **Sheet** is once again visible, and full-screen it with `g Shift+Z`, effectively leaving split screen mode.
![]
---
eleventyNavigation:
key: Contributing Tests
order: 99
Update: 2024-01-10
Version: VisiData 3.0
---
The `tests` folder contains functional tests in the form of `.vd` scripts, each of which records a session of VisiData commands. These ensure that data processing works consistently and reliably.
`dev/test.sh` (run from the git root) will execute all tests. The final sheet of each test is saved as .tsv and compared to the respective expected output checked into the `tests/golden` directory.
As of January 2024, to pass all the tests, you will need to install the `test` extras:
```
git clone https://github.com/saulpw/visidata.git
cd visidata
pip3 install ".[test]"
```
To show each step of a test with a delay of 1 second between commands:
$ bin/vd -p tests/foo.vd -w 1
To build a `.vd` file:
1. Go through all of the steps of the workflow, ending on the sheet with the final result.
2. Press `Shift+D` to view the `CommandLog Sheet`.
3. Edit the commandlog to minimize the number of commands. Cells may be parameterized like `{foo}`, to be specified on the commandline:
$ vd cmdlog.vd --foo=value
4. Save the cmdlog:
Press `Shift+D` to open the `commanDlog Sheet`, and press `Ctrl+S` to save it with a `.vd` suffix.
There are also unit tests in visidata/tests. To run the unit tests:
```
pytest -sv visidata/tests
```
---
---
eleventyNavigation:
key: Usage
order: 99
---
# How can I load files and exit the program?
If you use the command line, 'vd' should pretty much work as you expect:
$ vd foo.csv
You can pipe in tabular data:
$ find | vd
If the file is not plain ASCII .txt or [tsv](/tsv), you will have to specify the filetype with -f and/or other options:
$ ls -al | vd -f fixed --skip 1 --headers 0
Many [data formats](/formats) are supported, with more being added every day.
# How do I quit?
You can just bang on 'q' until all the sheets are gone (there are usually only one or two anyway).
Note: If a prompt or editbox is waiting for input, you may have to press '^C' first.
It requires a bit more dexterity, but Control-Q (aka '^Q') will abort the program quite rudely.[1]
If you wish to be a bit gentler, 'gq' will quit all sheets ('global quit').
[1] Control-Q is the only builtin command (necessary sometimes during development). All other [commands can be overridden](/howto/commands).
---
eleventyNavigation:
key: viewtsv Annotated
order: 99
Date: 2017-12-27
Version: 1.0
---
# viewtsv
[viewtsv.py](https://github.com/saulpw/visidata/blob/stable/bin/viewtsv.py)
is a great example of a minimal VisiData application. This is an extremely functional utility in 25 lines of code, leveraging the essence of the VisiData architecture. Here it is in its entirety, with line by line annotations:
#!/usr/bin/env python3
VisiData 2.x requires Python 3.6+.
import sys
from visidata import Sheet, ColumnItem, options, asyncthread, run
Import the relevant components used below.
class TsvSheet(Sheet):
rowtype = 'rows' # rowdef: tuple of values
All tabular data sheets inherit from `Sheet`. The rowtype is displayed on the right status bar. The `rowdef` comment declares the structure of every row object, and should be present for every Sheet.
columns = [ColumnItem('tsv', 0)]
An initial column. Generally the class-level `columns` is set to the actual columns of the sheet, but in this case, the columns aren't known until the source is loaded.
(See the `reload()` function below where they are set from the contents of the first row.) This line is not strictly necessary but makes loading feel a bit more responsive.
@asyncthread
@[asyncthread](/docs/async) marks the function to spawn a new thread whenever it is called.
def reload(self):
The [`reload()`](/docs/loaders) function collects data from the source and puts it into `rows`. It's called once automatically when first pushed, and manually with `^R`.
self.rows = []
`rows` is a list of Python objects. The row definition ('rowdef') for the TsvSheet is a tuple of values, with each position corresponding to one column.
with open(self.source, encoding=options.encoding) as fp:
`source` is the filename, which has been passed to the constructor (see the last line with `run()`).
for line in fp:
line = line[:-1]
if line:
self.addRow(line.split('\t'))
For each line, strip the included newline character, and filter out any blank lines. Add each split tuple to `rows`.
for i, colname in enumerate(self.rows[0]):
self.addColumn(ColumnItem(colname, i))
The actual columns are set from the first (header) row.
`ColumnItem` is a builtin, which creates a column to use getitem/setitem with the given key/index.
self.rows = self.rows[1:]
The header row is removed from the list of rows. (Column names are displayed on the first row anyway).
run(*(TsvSheet(fn, source=fn) for fn in sys.argv[1:]))
`run(*sheets)` is the toplevel entry point for a VisiData application.
---