v3.0.0
Release Notes — v3.0.0
Version 3 introduces a leader-key system based on the g and z prefixes. This enables most keyboard shortcuts to be remapped for broad compatibility with VisiData while remaining fully customizable through the Commands tab. User-defined bindings can be saved to a JSON config file and loaded on startup.Please review the updated key bindings and the many new features described in the README.
✨ New Features
Sheets Overview (S)
- Press
Sto open a SheetScreen modal listing all open tabs with tab name, loaded rows, total rows, column count, and source filename. - Press
Enterto jump to a tab,eto rename it,dto close it — all from the sheet list.
Join Tables (&)
- Join two open tabs into a new tab using SQL-style joins (inner, left, right, cross) with column alignment support.
Inline Bar Charts (z=)
- Toggle an inline bar chart for any numeric column directly in the table view.
Pin Column (!)
- Pin the current column to the start of the table.
Column Resize (z_)
- Resize the current column to a specific character width.
Fill Null Values (zf / gf)
- Fill null values in the current column (
zf) or all columns (gf) with a user-provided value. Input widget respects the column's data type.
Global Cursor Search (;)
- Search the entire dataframe for the current cursor value, highlight all matches, and jump to the first one.
Last-Tab Jump (zB)
- Jump back to the previously focused tab.
Implode Column (z))
- Collapse rows by aggregating a column into a list, respecting selected columns as group keys. The imploded column now replaces the original column in-place.
Row Selection Expansion (gs / zs)
- Select the current row and all rows above (
gs) or below (zs).
Column Selection Expansion (g' / z')
- Select the current column and all columns to the left (
g') or right (z').
Unselect Rows (gu)
- Toggle the selection of the current row (
s) or unselect all selected rows (gu).
Delete Column Range (g* / z*)
- Delete the current column and all before it (
g*) or all after it (z*).
Cast to Boolean (z#)
- Cast the current column to boolean type.
Set Row as Header (g^)
- Mark the current row as the new column header row.
🔧 Improvements
- Per-column thousand separator (
z,): Toggle number formatting independently per column (previously global). - Per-column float precision (
</>): Adjust decimal places per float column independently. - Strip whitespace (
zSpace): Strip leading/trailing whitespace from string columns. - Page forward/backward now moves the cursor and preloads row batches correctly.
- Find & Replace: Enhanced search commands with cursor-value shortcuts (
z/,z?) and global search (;). - Row detail modal:
{/}navigate between rows; frequency and statistics accessible directly from row detail. - Frequency distribution now supports multiple selected columns.
- Statistics screen applies highlight styling for selected rows.
- EditCellScreen supports list-type values.
- BusyScreen now wraps background tasks with a decorator pattern.
- Python console moved to table-level (
Spaceto toggle);gSpaceruns a command by name. - Keybinding conflicts are detected and logged at startup; user config overrides are loaded from
~/.config/dataframe_textual/keybindings.json. - Numerous notification messages refined for clarity and consistency.
🐛 Bug Fixes
- Fixed out-of-bounds error in column retrieval.
- Fixed previous-match navigation going past the first match.
- Fixed paging cursor movement and row preloading.
- Fixed SheetScreen
d(close tab) always closing the first tab instead of the tab under the cursor. - Fixed implode column placing the result as the last column instead of replacing the original.
- Fixed lazyframe column count when
dfis not yet collected. - Fixed escape character handling in key display.
- Fixed column width calculation.
Full Changelog: v2.48.0...v3.0.0