Skip to content

v3.0.0

Choose a tag to compare

@need47 need47 released this 27 Jun 13:05
· 14 commits to main since this release

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 S to open a SheetScreen modal listing all open tabs with tab name, loaded rows, total rows, column count, and source filename.
  • Press Enter to jump to a tab, e to rename it, d to 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 (Space to toggle); gSpace runs 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 df is not yet collected.
  • Fixed escape character handling in key display.
  • Fixed column width calculation.

Full Changelog: v2.48.0...v3.0.0