- [regex] fix
g*
#239 (thanks to @jsvine for bug hunting) - [editline] suspend during editline will resume in editline
- [editline]
Ctrl+W
on an empty value in editline now works
- [manpage] update the manpage to be more accurate for boolean command line options
- [canvas] fix mouse right-click and cursor movement on canvas
- [idle performance] fix regression
- [columns] fix editing of "value" column on ColumnsSheet
- [describe] fix colorizer inheritance
- [csv] always create at least one column
- [pandas] fix pandas eval (
=
, etc) #208 (thanks to @nickray for suggesting) - [pandas] preserve columns types from DataFrame #208 (thanks to @nickray for suggesting)
- [pandas] remove data autodetect #208 (thanks to @nickray for suggesting)
- [selection]
options.bulk_select_clear
per #229 (thanks to @aborruso for suggesting) - [setcol-subst-all] add
gz*
to substitute over all visible cols (thanks to @aborruso for suggesting) - [options] Shift+O now global options (was sheet options);
zO
now sheet options;gO
now opens .visidatarc which can be edited (was global options) - [sort] orderBy now asynchronous #207 (thanks to @apnewberry for suggesting)
- [fill] fill now async; uses previous non-null regardless of selectedness #217 (thanks to @aborruso for suggesting)
- [pandas]
options.pandas_filetype_*
passed topandas.read_<filetype>
(likecsv_*
to Pythoncsv
module) # 210 (thanks to @pigmonkey for suggesting) - [rename-col-selected]
z^
now renames the current column to contents of selected rows (previouslygz^
);gz^
now renames all visible columns to contents of selected rows #220 (thanks to @aborruso for suggesting) - [vdtui null] show null display note in cells which match
options.null_value
(was only for None) # 213 (thanksto @aborruso for suggesting) - [vdtui] visidata.loadConfigFile("~/.visidatarc") for use in REPL #211 (thanks to @apnewberry for suggesting)
- [progress] include thread name on right status during async
- [progress] add gerund to display (instead of threadname)
- [http] user specified filetype overrieds mime type
- e.g.
vd https://url.com/data -f html
- e.g.
- [clipboard] use
options.save_filetype
for default format
- [clipboard] fix broken
gzY
(syscopy-cells) - [cmdlog] always encode .vd files in utf-8, regardless of options.encoding
- [tsv] major
save_tsv
performance improvement - [tsv] make short rows missing entries editable
- [shp] reset columns on reload
- [graph] shift rightmost x-axis label to be visible
- [http] allow CLI urls to have
=
in them - [fixed width] truncate cell edits on fixed width sheets
- [aggregators] ignore unknown aggregators
visidata.view(obj)
: obj no longer required to have a__name__
- [save tsv json] errors are saved as
options.safe_error
(default#ERR
)- if empty, error message is saved instead
- [plugins]
~/.visidata
added to sys.path on startup- put plugin in
~/.visidata/vdfoo.py
- put
import vdfoo
in.visidatarc
to activate
- put plugin in
- [aggregators] show-aggregate (
z+
) now aggregates selectedRows - [tsv] add unnamed columns if extra cells in rows
- [diff] now based on display value (more intuitive)
- [mouse] move to column also
- [mouse] right-click to rename-col, rename-sheet, or edit-cell
- [cosmetic] addcol-new (
za
) input new column name on top of new column - [cosmetic] include file iteration in progress meter
- [xls xlsx] use options.header to determine column names
- batch mode with no script should use implicit stdin only if no other files given (Closed #182)
- [pivot] pivot keycolumn copy was yielding strange nulls
- [join] fix extend join
- [csv] include first row in file even if
options.header
== 0 - [sysclip] fix bug where
gzY
did not copy selected rows (Closed #186) - [motd] fix bug with disabling
options.motd_url
(Closed #190)
- various improvements in performance and in CPU usage (Closed #184, #153)
- [pyobj]
visidata.view(obj)
andvisidata.view_pandas(df)
- [pandas]
-f pandas
loads file withpandas.read_<ext>
- [TextSheet] wrap made consistent with new options
- [date] date minus date now gives float number of days instead of seconds
- [pcap] add support for reading pcapng (thanks @layertwo!)
- [setcol] limit
gz=
range parameters to the number of rows selected to be filled (thanks @ssiegel!) - [anytype] format anytype with simple str()
- [http] add
tab-seperated-values
to content_filetypes mapping - [join] add
extend
join type to use keep all rows and retain SheetType from first selected sheet rename-sheet
renames current sheet to input- [json] add options.json_indent for pretty-printing
- [tsv json txt] add options.save_errors (default True) to include errors when saving
- remove all options.foo_is_null and fix according to 178-nulls.md
- add
z^C
andgz^C
to cancel threads in current/selected row(s) - [bugfix]
^R
(reload) on a filtered sheet ("
) now reloads only the filtered rows - [aggregators] fix summation with exceptions
- [DirSheet] add
gz^R
(reload-rows) to undo modifications on selected rows
-
commands overhaul; see
commands.tsv
(command longnames should now be largely stable) -
add quantile aggregators (q3/q4/q5/q10)
-
add
z;
to add new column from bash expr, with$
columnNames as variables -
keyboard layout (thanks to @deinspanjer for the inspiration)
-
O
launches sheet-specific options (see design/169.md);gO
launches global OptionsSheet -
options.wrap now defaults to False
-
options.quitguard enables confirmation before quitting last sheet
-
options.safety_first makes loading/saving more robust, at the cost of performance
- currently only removing NULs from csv input
-
dedup, sort, color status messages by "priority" (thanks to @jsvine for suggestion)
-
remove menu system
-
can now edit source values from FreqSheet
-
Command changes
^H
is now main command to open the manpage!z^H
opens a list of all commands for this sheet.R
(random-sheet
) pushes sheet instead of selecting (reverting to former behavior)za
(addcol-empty
) asks for column namezd
(delete-cell
) moves value to clipboard ("cut", like other delete commands)- add
gI
(describe-all
) likegC
(columns-all
) - add
gS
(sheets-graveyard
) - add
g(
,z(
,gz(
variants of(
'expand-column' - add
z|
andz\
to un/select by python expr (thanks to @jsvine for suggestion) - add
z#
to set type of current column tolen
- add
z;
to get the stdout/stderr from running a cmdline program with $colname args Space
is now bound to exec-longname (wasmenu
;^A
was exec-longname previously)
-
Loaders:
- add pandas adapter
- add xml loader
- add pcap loader (thanks to @vbrown608 and @TemperedNetworks)
- add yaml loader (thanks to @robcarrington, @JKiely, @anjakefala at PyCon Sprints for making this happen)
- add jsonl saver
- remove
tsv_safe_char
and split intotsv_safe_newline
andtsv_safe_tab
-
initial commit of a task warrior app (vtask)
- more portable system clipboard handling (thanks @chocolateboy for PR)
- [json] no more incremental display during loading (need better json parser than stdlib)
date
supports adding a number of days (or6*hours
,9*months
, etc)- hidden columns are darkened on columns sheet
- exception rollup
- dev/commands.tsv table of commands
- motd default url uses https
- improve ProfileSheet
- [DirSheet] editable
mode
(set to octal like0o0644
)
- python 3.7
- Change
async
decorator toasyncthread
and renameasync.py
to avoid using Python 3.7 keyword
- Change
- macro system
gD
goes to directory browser ofoptions.visidata_dir
(default to~/.visidata/
) which contains saved commandlogs and macrosz^S
on CommandLog saves selected rows to macro for given keystroke, saving to.visidata/macro/command-longname.vd
- macro list saved at
.visidata/macros.vd
(keystroke, filename)
options.cmdlog_histfile
for auto-appended (default: empty means disabled)- [DirSheet] edits make deferred changes to any field
- add
directory
andfiletype
columns - note: only 256 changes maintained per column (same as column cache size)
^S
saves all deferred changesz^S
saves changes for the current file only^R
clears all changes (reload)z^R
clears changes on the current file onlyd
/gd
marks the current/selected file for deletion- if
directory
is edited, on^S
(save) file is moved (if directory not existing, a new directory is created)
- add
- New conda package
- add .visidatarc snippets with examples of extra functionality
- add replayable options #97
g^S
for multisave to single file (.html
,.md
and.txt
are currently supported) or directoryz^S
to save selected rows of current column only (along with key columns)T
to transpose rows and columns #129^A
to specify a command longname to execute^O
/g^O
to open current/selected files in external editorg^R
on SheetsSheet to reload all [selected] sheetsoptions.error_is_null
to treat errors as nulls when applicableg,
fixed to compare by visible column values, not by row objectsgv
to unhide all columnsgM
open melted sheet (unpivot) with key columns retained and regex capture groups determining how the non-key columns will be reduced to Variable-Value rowsg*
replace selected row cells in current column with regex transform- Shift-Up/Down aliases for mac #135
- options.wrap now true by default on TextSheet (
v
to toggle) save_txt
with single column concatenates all values to single file+
can add multiple aggregators- ^X bugfix: use evalexpr over cursorRow
z
/gz
s
/t
/u
to select to/from cursorRowz<
andz>
to move up/down to next null cell"
no longer reselects all rowssheet-set-diff
command to act like--diff
- math functions (like sin/cos) now at toplevel
- bugfix: freeze
- all
csv_
options sent to csv.reader/writer options.tsv_safe_char
to replace \t and \n in tsv files; set to empty for speedup during tsv save- loaders and savers
- support bz2 and xz (LZMA) compression (thanks @jpgrayson)
- add loaders for:
- sas7bda (SAS; requires
sas7bdat
) - xpt (SAS; requires
xport
) - sav (SPSS; requires
savReaderWriter
) - dta (Stata; requires
pandas
)
- sas7bda (SAS; requires
- .shp can save as .geojson
- add htm as alias for html filetype
- json bugfix: fix #133 json loader column deduction
- [experimental] bin/vsh initial commit
- VisiData will be included in the next debian repository release!
- remove all install dependencies
- additional libraries must be installed manually for certain loaders; see requirements.txt
- experimental hierarchical menu system with SPACE to explore commands
- use standard movement keys (
hjkl
/arrows
) to navigate within a command level - Use
Enter
/q
to navigate down/up a command tree - abort with
gq
or^C
- existing chooseOne selections (aggregators/joins) still use simple input() for now
- most longnames changed
- let me know if anyone is using any longnames at all, and we will stabilize the names
- if you do end up playing with it, please let me know what did and didn't work for you
- use standard movement keys (
- randomized message/announcement/tip on startup; disable with
options.motd_url = None
- cache messages in
$HOME/.visidata/
- cache messages in
Command additions/changes:
-
add
za
andgza
to add 1/N new blanks column -
add
(
and)
commands to expand/collapse list/dict columns (e.g. in nested json) -
add
Backspace
command to drop sheet likeq
and also scrub its history from the cmdlog -
[canvas] add
d
andgd
to delete points from source sheet -
remove
!@#$%-_
special actions on columns sheet -
alias Shift+Arrows to
HJKL
(may not work in all environments) -
alias
ENTER
to modify-edit-cell by default -
add
Y
/gY
/zY
to copy row/selected/cell to system clipboard (with options.clipboard_copy_cmd) -
filename
-
works to specify stdin/stdout (-b -o -
will dump final sheet to stdout) -
search/select uses most recent when not given any (as in vim/etc)
-
annotate None with disp_note_none ('∅'); previously was not visually distinguishable from empty string
-
save to .md org-mode compatible table format
-
load/view/edit/save png, edit pixels in data form
-
load/view ttf/otf font files
-
[canvas] draw quadratic curves with qcurve([(x,y)...])
-
improvements/bugfixes: pivot, describe, melt, sqlite, shp, html
- date.sub returns timedelta object (was int days)
- pivot table bugfixes
- many cosmetic fixes
- disable default profiling for perf improvements
- remove .visidatarc support in PWD or XDG; only $HOME/.visidatarc supported now
- website and docs complete overhaul
- do not execute .py files
- apt/brew packages submitted
- tab completion for filename and python expr
v
now 'visibility toggle' (moved fromw
)^W
to erase a word in the line editorgC
--version
(thanks to @jsvine)options.use_default_colors
(thanks to @wavexx)median
aggregator- .html loads tables (requires lxml)
- simple http works (requires requests)
- json save
- json incremental load
- [cmdlog] use rowkey if available instead of row number; options.rowkey_prefix
- [cmdlog] only set row/col when relevant
- [vdtui] task renamed to thread
- /howto/dev/loader
- /design/graphics
- [packaging]
- make non Python standard library loader dependencies optional
- provide method for full installation via
pip3 install "visidata[full]"
- visidata.org change copyright in footer
- [docs] add csv dialects to manpage (closes issue #88)
- [bugfix]
- fix for
^Z
in builtin line editor - fixed-width loader needs source kwarg
- fix for
-
visidata.org revamp
-
[canvas] graphs and maps!
.
org.
to push a graph or a map from the current sheet (dot=plot)- supports .shp and vector .mbtiles
- mouse left-click/drag to set cursor
- mouse right-click/drag to scroll canvas
- scrollwheel to zoom in/out on a canvas
s
/u
to select/unselect rows at canvas cursorENTER
to push source sheet with only rows at canvas cursor- 1-9 to toggle display of 'layers' (colors)
_
to zoom out to full widthdisp_pixel_random
option chooses pixel attrs at random (weighted), instead of most common+
/-
to zoom in/out via keyboard
-
Updates to commands
- Remove ` (backtick) command
- Remove most zscroll commands (
zs
/ze
)zz
moves cursor to center, uncertain about the future ofzt
due to conflict witht
for toggle
ga
adds N new rowsgz=
sets value for selected/all rows to a Python sequence in this columnz_
sets column width to given valuez-
cuts column width in halfP
is now "paste before" (like vim);R
now pushes a random sample^Z
now sends SIGSTOP;^O
"opens" the external $EDITOR (from builtin line editor)- [ColumnsSheet] Added
~!@#$
commands back, to set type of source columns w
is becoming a more universal "visibility toggle"- [TextSheet]
w
toggles wordwrap - [canvas]
w
toggles display of the labels - [pyobj]
w
toggles hidden properties and methods
- [TextSheet]
-
Updates to command line args and options
- set initial row/col with
+<row#>:<col#>
(numeric only) --delimiter
/-d
option (separate from--csv-delimiter
) sets delimiter for tsv filetype--replay-wait
/-w
renamed from--delay
/-d
disp_date_fmt
option for date display format string (default is date-only)zero_is_null
/empty_is_null
/none_is_null
/false_is_null
set which values are considered null (previously wasaggr_null_filter
)--skiplines
option renamed to--skip
, and--headerlines
to--header
- set initial row/col with
-
Design improvements
- Add specific rowtype for each sheet (see right status)
- dates are a kind of numeric type (useful for graphing as the x-axis)
use_default_colors
(at behest of @wavexx)- more robust Progress indicator
- populate DescribeSheet in async thread
- remove default names for unnamed columns
- history up/down in edit widget now feels right
-
API changes
- change main Column API to getter(col, row) and setter(col, row, val)
- move Path and subclasses out of vdtui
- TextSheet source is any iterable of strings
- Sheet.filetype provides default save filename extension
- Fix postgres lazy import
- BugFix: issue #83 -
z?
works on OSX - BugFix: on SheetsSheets itself now does nothing
- Move from readthedocs to visidata.org
- Features
- [replay]
- move vdplay into vd --play
- -p --play now replays scripts live
- --delay interspaces replay by delay seconds
- --batch to replay without interface
- --output to save at end of replay
- --replay-movement=True has --play move the cursor cell-by-cell
- -y --confirm-overwrite=False
- replay scripts can be strformatted with field=value
- add ^U command to pause/resume playback
- add ^K to cancel replay
- add Space command to go to next step of replay while paused
- [global]
- remap toggle to 't' (was Space)
- remap ^Y to push sheet of cursorRow
- 'A' creates new sheet with N empty columns
- remap 'r' to regex search of row key
- add zr/zc to go to row/col number
- F1/z? now launches man page
- gF1/gz? now launches commands sheet
- add
f
command to fill empty cells with the content of a non-empty cell up the current column - add Del/gDel to set value(s) to None
- remove TAB/Shift-TAB sheet cycling
- add z^ command to set current column name to current cell value
- add gz^ to set current column name to cell values in selected rows
- add 'z=' to show computed expression over current row
- z' adds cache to current column (gz' for all columns)
gh
moves cursor to leftmost column (instead of leftmost non-key column)
- [aggregators]
- allow multiple aggregators
- 'g+ adds an aggregator to selected columns on columns sheets
- sets the exact set of aggregators on the column sheet with 'e'/'ge'
- 'z+' displays result of aggregation over selected rows for current column on status
- rework aggregators so multiple aggregators can be set
- [sheets sheet]
- '&' on Sheets sheet is now sole join sheet command; jointype is input directly
- add sheet concat
- [columns sheet]
- remap ~!@#$%^ on Columns sheet to behave like they do on other sheets
- add g prefix to ~!@#$%^ to operate on all 'selected rows' on Columns sheet (thus modifying column parameters on source sheet)
- [textsheet]
- add 'w' command on TextSheets to toggle wrap
- [cmdlog]
- editlog renamed to cmdlog
- cmdlog has a new format which minimises recordings of movement commands
- '^D' now saves cmdlog sheet
- [pivot]
- zEnter pushes this cell; Enter pushes whole row
- [describe]
- add DescribeSheet with 'I' command for viewing descriptive statistics
- add zs/zu/zt/zEnter commands to engage with rows on source sheet which are being described in current cell of describe sheet
- [frequency]
- 'zF' provides summary aggregation
- [metasheets]
- add hidden source column to metasheets
- ^P view status history
- [loaders]
- add 'postgres' schema for simple loader from postgres:// url
- add gEnter for .zip file mass open
- add 'fixed' filetype to use fixed column detector
- [clipboard]
- remove
B
clipboard sheet - rework all d/y/p commands for only one buffer
- remove g^Z and gp
- remove
- [options]
- remove -d debug option
- add --diff to add colorizer against base sheet
- diffs a pair of tsvs cell-by-cell
- theme options removed as CLI arguments (still available for .visidatarc or apps)
'
appends frozen column- rename and reorder options
- [replay]
- Community
- [docs]
- replace .rst userguide with VisiData man page
- [visidata.org]
- update index.html
- automate creation of tour pages from tours.vd
- tours will be played and recorded using asciinema
- then compiled into a .html with mkdemo.py for http://visidata.org/tour
- upload html version of manpage
- [docs]
- Internals
- renamed toplevel command() to globalCommand(); removed Sheet.command(); sheet commands now specified in Sheet.commands list of Command() objects at class level
- setter API now (sheet,col,row,value)
- move
visidata/addons/*.py
into toplevel package
- data can be piped through stdin
- remap:
N
is now previous match (instead ofp
) :
now regex split- add
bin/viewtsv
example tsv viewer as an example of a small vdtui application - add
options.cmd_after_edit
for automove after edit - add clipboard functionality
y
yanks row at cursor to clipboard;gy
copies all selected rowsd
deletes row and move to clipboard;gd
moves all selected rowsp
now pastes the row most recently added to the clipboard after current row;gp
pastes all rows from clipboard after current rowShift-B
opens clipboard sheetCtrl-z
now undoes the most recent delete;gCtrl-z
undoes all deletes
- Fix cursor row highlighting of identical rows
- move some functionality out of vdtui into seperate python files
- add Ctrl-z command to launch external $EDITOR
- add
options.force_valid_names
- add options.textwrap for TextSheet
- add vd.remove(sheet)
- Sheet.sources now modifiable
- fix display/feel bugs in editText
- remove BACKSPACE for editlog undo
- fix colorizer API
- add
ctrl-u
command to toggle profiling of main thread - fix
C
olumn statistics (options.col_stats
still disabled by default)
F
requency sheet groups numeric data into intervals- added
histogram_bins
andhistogram_even_interval
options - added
w
command on the sheet that toggleshistogram_even_interval
- added
- change key for 'eval Python expression as new pyobj sheet' from Ctrl-O to Ctrl-X
- make options automatically typed based on default
- documentation cleanups
- remove R command (set filetype on CLI)
- tour of screenshot.gif
- regex transform now
*
(';' is still regex split) - Make regex search/select to work more like vim
- Move several non-essential commands out of vd.py
- change license of vd.py to MIT
- vdtutor start
- currency type with
$
; str type moved to~
; remove type autodetect - www/ for landing page
- move from .md to .rst for documentation
- colorizers
g[
andg]
to sort by all key columns;
and.
experimental regex commands
- pivot sheets with
W
- undo with
BACKSPACE
and replay withga
- dev guide and user guide
ge
mass edit- freeze with
g'
- creating sustainable dev process at RC
z
scrolling prefix
- async select/unselect
- aggregator functions on columns
- .xls
- asynchronous commands (each in its own thread) with
^T
sheet of long-running commands^C
cancelENTER
to see the final performance profile
P
random population of current sheet- headerlines default now 1
- options settable with command-line arguments (
--encoding=cp437
) - input() histories with UP/DOWN (and viewable with
I
) - unicode input now works
- editText clears value on first typing
"
duplicates sheet with only selected rows;g"
duplicates entire sheet verbatim
- sortable date
- open_zip comes back
g~
(autodetect all columns)"
copies row to immediately following- nulls, uniques on columns sheet
- right column
- regex subst
- unreverse [/] sort keys ([ = ascending)
- reverse [/] sort keys
- goto
r
ow by number orc
olumn by name
- type detection with
~
- date type
- fix outer join
- expose col.type in column header
- push value conversion to time of usage/display
- F1 help sheet
- ^O directly exposes eval result as sheet
- custom editText with initial value, ESC that raises VEscape, and readline edit keys
- make all sheets subclasses of VSheet
- remove .zip opening and url fetching
- added options ColumnStats and csv_header
- pin key columns to left
- join sheets on exact key match
- -r/--readonly mode
- inputs: .csv, .tsv, .json, .hdf5, .xlsx, .zip
- outputs: .csv, .tsv
- hjkl cursor movement, t/m/b scroll to position screen cursor
- skip up/down columns by value
- row/column reordering and deleting
- resize column to fix max width of onscreen row
- filter/search by regex in column
- sort asc/desc by one column
g
lobal prefix supersizes many commandse
dit cell contents- convert column to int/str/float
- reload sheet with different format options
- add new column by Python expression
s
elect/u
nselect rows, bulk delete withgd
F
requency table for current column with histogramS
heets metasheet to manage/navigate multiple sheets,C
olumns metasheetO
ptions sheet to change the style or behaviorE
rror metasheetg^P
status history sheet