A terminal spreadsheet multitool for discovering and arranging data


VisiData v2.6.1 twitter @VisiData CircleCI Gitpod ready-to-code

A terminal interface for exploring and arranging tabular data.

Frequency table

VisiData supports tsv, csv, sqlite, json, xlsx (Excel), hdf5, and many other formats.

Platform requirements

  • Linux, OS/X, or Windows (with WSL)
  • Python 3.6+
  • additional Python modules are required for certain formats and sources


To install the latest release from PyPi:

pip3 install visidata

To install the cutting edge develop branch (no warranty expressed or implied):

pip3 install git+https://github.com/saulpw/[email protected]

See visidata.org/install for detailed instructions for all available platforms and package managers.


$ vd 
$  | vd

Press Ctrl+Q to quit at any time.

Hundreds of other commands and options are also available; see the documentation.


Help and Support

If you have a question, issue, or suggestion regarding VisiData, please create an issue on Github or chat with us at #visidata on irc.libera.chat.

If you use VisiData regularly, please support me on Patreon!


Code in the stable branch of this repository, including the main vd application, loaders, and plugins, is available for use and redistribution under GPLv3.


VisiData is conceived and developed by Saul Pwanson .

Anja Kefala maintains the documentation and packages for all platforms.

Many thanks to numerous other contributors, and to those wonderful users who provide feedback, for helping to make VisiData the awesome tool that it is.

  • [Loader] Frictionless Data Packages

    [Loader] Frictionless Data Packages

    Dear @saulpw , this one is a big proposal, I think it's also a great idea (I will seem presumptuous); unfortunately I am not able to help you in a concrete way.

    "Data Packages" is the specification core of Open Knowledge Foundation "Frictionless Data" project. This spec solve big problems strictly related to structured text files (especially CSV and TSV), as lack of metadata, lack of info about separators and text qualifiers, lack of info about field types, ecc..

    Some interesting URL are:

    • the spec for data-package https://frictionlessdata.io/specs/data-package/#specification
    • and the one for table schema https://frictionlessdata.io/specs/table-schema/

    There is a Python module to manage (reading and writing) Data Packages https://github.com/frictionlessdata/datapackage-py

    If VisiData were a Data Packages reader and writer the number of users and stakeholder would increase significantly, because this is a big open data theme and many users of this world would be interested.

    This specs are useful in example for one of the most used opensource open data portal platform (CKAN), and are used as official input and output format in data.world and in kaggle.

    Thank you

    wishlist help wanted 
    opened by aborruso 29
  • How to access non-public schema in Postgres DB?

    How to access non-public schema in Postgres DB?

    Small description

    I maintain a Postgres database having a non-public schema, i.e. I either need to explicitely provide the schema name or set the search_path:

    # either one of these works
    select * from foo.bar;
    set search_path = foo;
    select * from bar;
    alter database foobar set search_path to foo; # this makes it persistent
    select * from bar;

    Trying to connect to this database with Visidata works but returns an empty set of tables – even with the persistent search_path using alter database:

    $ vd postgres://user:[email protected]/foobar
     table_name         ‖ ncols             #| nrows             #‖

    Expected result

    Something along the lines of this output:

     table_name   ‖ ncols  #| nrows  #‖
     tag_hub      ‖       5 |        …‖
     log          ‖       7 |        …‖
     metadata     ‖       6 |        …‖
     skin         ‖       9 |        …‖
     layout       ‖       8 |        …‖
     content      ‖      16 |        …‖
     choice       ‖       5 |        …‖
     site         ‖      10 |        …‖
     poll         ‖       9 |        …‖
     account      ‖       7 |        …‖
     vote         ‖       7 |        …‖
     membership   ‖       8 |        …‖
     image        ‖      10 |        …‖
     file         ‖      12 |        …‖
     tag          ‖       4 |        …‖

    I achieved this output by temporarily changing line 61 of loaders/postgres.py to the desired schema name:

    <         qstr = "SELECT table_name, COUNT(column_name) AS ncols FROM information_schema.columns WHERE table_schema = 'public' GROUP BY table_name"
    >         qstr = "SELECT table_name, COUNT(column_name) AS ncols FROM information_schema.columns WHERE table_schema = 'antville' GROUP BY table_name"

    Although this shows the correct list of tables, it still wouldn’t seem sufficient to somehow inject the correct schema name dynamically because of the missing nrows values () – entering one of the rows shows an empty output.

    Actual result with screenshot


    Additional context

    → vd -v
    saul.pw/VisiData v1.0
    bug fixed 
    opened by p3k 21
  • AttributeError: '_curses.curses window' object has no attribute 'get_wch'

    AttributeError: '_curses.curses window' object has no attribute 'get_wch'

    ❯ pip3 install --upgrade visidata                                                                                  
    Looking in indexes: https://pypi.org/simple             
    Collecting visidata                                                                                                    
      Downloading https://files.pythonhosted.org/packages/41/91/5c63791cbd2418834079508c46b43bd2e6568402c3238b5bd691f732a92d/visidata-1.4.tar.gz (122kB)
        100% |████████████████████████████████| 122kB 1.5MB/s                                               
    Requirement already satisfied, skipping upgrade: python-dateutil in ./Sites/pyenv/versions/3.6.0/lib/python3.6/site-packages (from visidata) (2.7.3)
    Requirement already satisfied, skipping upgrade: six>=1.5 in ./Sites/pyenv/versions/3.6.0/lib/python3.6/site-packages (from python-dateutil->visidata) (1.11.0)
    Installing collected packages: visidata                                                                                   
      Running setup.py install for visidata ... done                                                                          
    Successfully installed visidata-1.4                                                                                
    ❯ vd --version                                                                                                                                                                                
    saul.pw/VisiData v1.4                                                                                                                                                                         
    ❯ python -VV
    Python 3.6.0 (default, Jul  3 2018, 16:30:25)
    [GCC 7.3.0]
    ❯ vd ~/Downloads/faa-wildlife-strikes.csv
    Traceback (most recent call last):
      File "/home/kbingham/Sites/pyenv/versions/3.6.0/bin/vd", line 156, in <module>
      File "/home/kbingham/Sites/pyenv/versions/3.6.0/bin/vd", line 134, in main
      File "/home/kbingham/Sites/pyenv/versions/3.6.0/lib/python3.6/site-packages/visidata/vdtui.py", line 2736, in run
        ret = wrapper(cursesMain, sheetlist)
      File "/home/kbingham/Sites/pyenv/versions/3.6.0/lib/python3.6/site-packages/visidata/vdtui.py", line 2726, in wrapper
        return curses.wrapper(setupcolors, f, *args)
      File "/home/kbingham/Sites/pyenv/versions/3.6.0/lib/python3.6/curses/__init__.py", line 94, in wrapper
        return func(stdscr, *args, **kwds)
      File "/home/kbingham/Sites/pyenv/versions/3.6.0/lib/python3.6/site-packages/visidata/vdtui.py", line 2723, in setupcolors
        return f(stdscr, *args)
      File "/home/kbingham/Sites/pyenv/versions/3.6.0/lib/python3.6/site-packages/visidata/vdtui.py", line 2749, in cursesMain
        return vd().run(_scr)
      File "/home/kbingham/Sites/pyenv/versions/3.6.0/lib/python3.6/site-packages/visidata/vdtui.py", line 845, in run
        keystroke = self.getkeystroke(scr, sheet)
      File "/home/kbingham/Sites/pyenv/versions/3.6.0/lib/python3.6/site-packages/visidata/vdtui.py", line 728, in getkeystroke
        k = scr.get_wch()
    AttributeError: '_curses.curses window' object has no attribute 'get_wch'
    opened by qrkourier 20
  • Menus not rendering as expected on iTerm2

    Menus not rendering as expected on iTerm2

    Small description Menus look strange. See screenshot below. I also sometimes get junk characters left behind when menus close, but I don't have a repro for that.

    Actual result with screenshot image

    Steps to reproduce with sample data and a .vd Open any menu at any time. Window size and font don't seem to matter. I've tried:

    • MesloLGS NF (a fancy variant of Menlo)
    • Menlo (typical Mac default )
    • Courier

    Additional context Visidata: saul.pw/VisiData v2.8 iTerm2: 3.4.12 or Terminal.app: 2.11 MacOS: 11.2.3

    Let me know if there are any terminal parameters or env vars, etc that might help diagnose this.

    bug help wanted unsolved-mystery 
    opened by DanLipsitt 19
  • -f applies to all files subsequently loaded, not just those given on the command line

    -f applies to all files subsequently loaded, not just those given on the command line

    Small description I often invoke vd with -f to set the format for the given input files or input stream when I know it won't detect them properly. This works as expected. However, the -f is then sticky for the rest of that session and overrides normal format detection when I open other files from within the session. This includes using o / open-file as well as navigating within a zip file or remote s3 directory.

    Expected result -f applies only to stdin and the files named in the command-line invocation.

    Actual result with screenshot -f applies to all new files for that session.

    Steps to reproduce with sample data and a .vd From within the visidata repo, load some JSONL from stdin:

    vd -f jsonl < sample_data/test.jsonl

    then within vd, open sample_data/sample.tsv.

    Additional context saul.pw/VisiData v2.-4dev

    bug fixed filetype 
    opened by tsibley 19
  • Get openpyxl error when opening xlsx file where a cell in the table has an emptycell

    Get openpyxl error when opening xlsx file where a cell in the table has an emptycell

    OS: Windows 10 (10.0.19043 Build 19043) VisiData: v2.6 Python: v3.9.5 openpyxl: v3.0.9 test_excel_visidata.xlsx excel_emptycell_visidata_error.txt

    Opening an xlsx file with an empty cell gives this error and then prevents the row with that cell and all lower rows from being read: Traceback (most recent call last): File "/home/dslgr/.local/lib/python3.9/site-packages/visidata/threads.py", line 206, in _toplevelTryFunc t.status = func(*args, **kwargs) File "/home/dslgr/.local/lib/python3.9/site-packages/visidata/sheets.py", line 940, in reload for r in vd.Progress(itsource, gerund='loading', total=0): File "/home/dslgr/.local/lib/python3.9/site-packages/visidata/threads.py", line 68, in iter for item in self.iterable: File "/home/dslgr/.local/lib/python3.9/site-packages/visidata/loaders/xlsx.py", line 56, in iterload yield AttrDict({cell.column_letter:cell for cell in row}) File "/home/dslgr/.local/lib/python3.9/site-packages/visidata/loaders/xlsx.py", line 56, in yield AttrDict({cell.column_letter:cell for cell in row}) AttributeError: 'EmptyCell' object has no attribute 'column_letter'

    I attached an example xlsx file but this can easily be recreated with an xlsx file with an empty cell contained within the data. In this example only the first row will be read as the empty cell is in the second row. So the second and third rows aren't read.

    I believe this error is related to this issue: https://stackoverflow.com/questions/39596433/get-empty-cell-coordinates-with-openpyxl When looping through the cells of a row it may be necessary to also count the columns. If a cell value is None to then potentially get the column letter from this function: https://stackoverflow.com/a/23862195 This may also be helpful to reference: https://openpyxl.readthedocs.io/en/stable/api/openpyxl.cell.read_only.html?highlight=column_letter#openpyxl.cell.read_only.EmptyCell

    bug fixed 
    opened by dslgr 18
  • Add support for Undo

    Add support for Undo

    As I'm learning VisiData I find that sometimes I hit the wrong key combo and want to undo. - vs _ for instance is a pain to go to the Columns sheet and set the width to be non-zero when I was trying to expand the column in the first place. Or maybe I'm playing with a regex to split out a column and I just bungle it. A simple undo of the last command would be an awesome enhancement.

    opened by cclark 18
  • [Windows] Issue with viewing HelpSheet (manpage) on Windows

    [Windows] Issue with viewing HelpSheet (manpage) on Windows

    Small description pressing ctrl-h does not work after exiting the program (gq), I see in the terminal: [Errno 2] No such file or directory: '/dev/tty' 'man' is not recognized as an internal or external command, operable program or batch file. 'man' is not recognized as an internal or external command, operable program or batch file. 'man' is not recognized as an internal or external command, operable program or batch file. 'man' is not recognized as an internal or external command, operable program or batch file.

    'man' is probably invoked every time ctrl+h is pressed.

    Expected result I expect that enter will execute the regex filter help page should open Actual result with screenshot If you get an unexpected error, please include the full stack trace that you get with Ctrl-E.

    Steps to reproduce with sample data and a .vd press crtl+h

    Please attach the commandlog (saved with Ctrl-D) to show the steps that led to the issue. See here for more details.

    Additional context Please include the version of VisiData. Same as here: #741

    opened by bob-u 17
  • renaming a frequency sheet is not stored correctly in a log file

    renaming a frequency sheet is not stored correctly in a log file

    Small description

    Hi, I have two input TSV file, named one and two. I run these steps:

    • I open one and I set the column com_istat as key column;
    • I do the same for two and the column cod_istat;
    • I run an inner join for one and two and I have an output join table;
    • Starting from this join table I create a frequency table based on Denominazione field;
    • I rename this frequency table in result;
    • I save this table as result.tsv;
    • I save the log of this process in result.vd.

    Then if I run vd -y -b -p result.vd I have no sheet named result: vd does not find the source table to save, and I have no output.

    Expected result

    To have the output file. I know, I could not rename the file and I could run simply CTRL+s and save it. But it seems to me there is something wrong in the creation of the log.

    Actual result with screenshot


    Steps to reproduce with sample data and a .vd

    Here my input files, the two tables and the log.

    Additional context

    saul.pw/VisiData v2.5dev

    opened by aborruso 16
  • Incorrect date conversions

    Incorrect date conversions

    First I would like to say thank you so much for this software, it has revolutionized the way I work.

    Small description When converting dates of the form dd-mm-yyyy with the @ command, conversion is incorrect. For example 08-02-2020 becomes 2020-08-02 which is mixing up the day and month; while 16-02-2020 becomes 2020-02-16 which is correct;

    These values are all in the same column, as such should be converted with a homogeneous date format.

    Expected result

    Steps to reproduce with sample data and a .vd csv:



    sheet   col     row     longname        input   keystrokes      comment
                            open-file       vd_issue_sample.csv     o
    vd_issue_sample date            type-date               @

    Additional context Visidata v1.5.2 Ubuntu 20 installation.

    bug wish granted 
    opened by suntzuisafterU 16
  • Pasting from system clipboard

    Pasting from system clipboard

    Hi all! I just want to first say that this tool is awesome and I'm super happy to have discovered it!

    I have a particular use case that I'm curious if visidata can handle. I have a text file (or output from some command) that looks like this:

    line 1
    line 2
    line 3
    line a
    line b
    line c
    line I
    line II
    line III

    What I am trying to do is: (1) select the first three lines and copy them to the system clipboard (2) paste them so that they fill the first column of a blank visidata sheet (3) repeat two more times to get a final visidata sheet like this:

    line 1 | line a | line I
    line 2 | line b | line II
    line 3 | line c | line III

    Is there a way to do this easily in visidata without writing code?


    opened by kovasap 16
  • Index columns

    Index columns

    • set .vdj to be the default CmdLog save format
    • in the CmdLog type col indices as int, and col names as str.

    since 6e1334167f740a78832054e63020215acc6d5a88, the type of the col attribute matters. If replaying, and col is an int, the CmdLog will index by position. If col is a str it will index by column name.

    PR also adds a test for the replay indexing features supported by .vd, and .vdj.

    Closes #1349

    opened by anjakefala 0
  • [pyexpr] Hidden column value used rather than visible

    [pyexpr] Hidden column value used rather than visible

    Small description A name is used for multiple columns, it is possible to use the hidden value rather than the visible value.

    Expected result Visible columns are preferred in expressions, over hidden columns.

    Actual result with screenshot


    Steps to reproduce with sample data and a .vd

    Have 2 or more columns with the same name. Hide the leftmost one. Reference the column name in an expression.

    You get the unexpected result using the value from the hidden column not the visible column. In this case, I froze the original column, hide the original, and then rename the frozen column to the original. Since new columns are added to the right, expressions are using the original (and hidden value).

    Additional context Please include the version of VisiData. Latest version of develop

    Commonly I will clean up the value of a column. Hiding the original and intermediate values, and renaming the final column back to the name of the original. It was surprising to get the original value. It seems like Visidata should prefer the visible value over hidden values, since that is the least surprising value to use.

    There are many issues Visidata can have with multiple columns with the same name, so this is really just one of many possible issues around this condition.

    opened by frosencrantz 4
  • [bug/feature] stop all async* when vd.run returns

    [bug/feature] stop all async* when vd.run returns

    When you have a long running acync thread and exit a vd.run session, the thread continues. My expectation is that everything VisiData is stopped/garbage collected when vd.run returns.

    opened by geekscrapy 0
  • Notify when plugin update available

    Notify when plugin update available

    This will show a status message if an update to a plugin is available

    I often find I am out of date, but it is not common for me to actually check the plugin sheet...!

    The prevalence (vd.status/warning etc.) should be evaluated, is this the correct level? I suspect so as it allows people to ignore if they want to.

    My only concern is that on load, the status bar is becoming cluttered... Thinking about it, this might be an ideal candidate to have an icon/message etc. in the upper right corner to show a plugin has an update? Or maybe something in the menu showing the number of updates available? Many options! I think this is a good start though

    opened by geekscrapy 2
  • [v2.9] _curses.error: curses function returned NULL

    [v2.9] _curses.error: curses function returned NULL

    Small description This seems to happen intermittently and I cant reliably repro...

    When I go to close a sheet with quit-sheet, sometimes I get the following error:

    Traceback (most recent call last):
      File "/Users/geekscrapy/py3.7/lib/python3.7/site-packages/visidata/basesheet.py", line 167, in execCommand
        escaped = super().execCommand2(cmd, vdglobals=vdglobals)
      File "/Users/geekscrapy/py3.7/lib/python3.7/site-packages/visidata/basesheet.py", line 69, in execCommand2
        exec(code, vdglobals, LazyChainMap(vd, self))
      File "quit-sheet", line 1, in <module>
        import plugins.vpager
      File "/Users/geekscrapy/py3.7/lib/python3.7/site-packages/visidata/sheets.py", line 1068, in quit
      File "/Users/geekscrapy/py3.7/lib/python3.7/site-packages/visidata/sheets.py", line 1077, in confirmQuit
        vd.confirm(f'{verb} modified sheet "{vs.name}?" ')
      File "/Users/geekscrapy/py3.7/lib/python3.7/site-packages/visidata/form.py", line 87, in confirm
        ret = FormCanvas(source=form).run(vd.scrFull)
      File "/Users/geekscrapy/py3.7/lib/python3.7/site-packages/visidata/form.py", line 55, in run
        self.scrForm = vd.scrFull.derwin(maxh+2, maxw+1, (h-maxh)//2-1, (w-maxw)//2-1)
    _curses.error: curses function returned NULL

    I can however do anything else (work with the sheet, ctrl+i, etc.) I just can't close.

    Expected result To close the sheet and push the next on the stack

    Additional context I see this occurring when I use vd.run from within another curses application (prompt-toolkit to be exact), which is probably the cause. Having said this though, I have a something niggling in my head telling me it happened when I used vd natively as well...

    I'll add more context when it occurs again

    opened by geekscrapy 1
  • Hiding column cancels replay

    Hiding column cancels replay


    I like the Visidata replay feature and hope to be able to use it with my data.

    I've noticed that if I hide a column in a MS Excel spreadsheet, the replay is cancelled.

    1. Open vd with a MS Excel file that has multiple columns
    2. Hide a column with -
    3. Save the playback as test.vd
    4. Quit vd
    5. vd --play test.vd
    6. Notice replay canceled will appear

    I would expect the replay to hide the column I selected.

    This is what's in the playback:

    myfile  0               hide-col                -       Hide current column

    $ vd -v saul.pw/VisiData v2.9dev

    opened by jungle-boogie 3
  • v2.8(Dec 17, 2021)

    This is a pretty small release of mostly bugfixes, which still has a few changes that merit a minor version bump.

    The all-stars of this release are @ajkerrigan and @geekscrapy.

    @ajkerrigan found, debugged, and fixed a Python 3.10 compatibility bug. Before v2.8, you could see many warnings related to COLOR-1 in the status message.

    @geekscrapy contributed 7 PRs for v2.8. Thanks to his PRs, VisiData now gracefully skips blank lines in json files, and will not attempt to load plugins which failed to install.

    Source code(tar.gz)
    Source code(zip)
  • v2.7.1(Nov 16, 2021)

  • v2.7(Nov 15, 2021)

    A bunch of improvements, bugfixes, and a couple of new loaders.


    • [movement] bind Home/End to go-top/go-bottom (thanks @geekscrapy #1161)
    • [api] add vd.urlcache as alias for urlcache global (thanks @geekscrapy for PR #1164)
    • [plugins] do not continue installation if main package fails pip install (thanks @geekscrapy for PR #1194)
    • [plugins] allow for plugin records without SHA256; warn if absent (thanks @geekscrapy for PR #1183)
    • [load_lazy] do not load subsheets, if sheet.options.load_lazy is True (thanks @geekscrapy for PR #1193)
    • [save] confirm when save_foo function does not exist and saver fallsback to options.save_filetype (reported by @geekscrapy #1180)
    • [save] options.save_filetype default now 'tsv'
    • several cosmetic improvements


    • [lsv] add lsv filetype for simple awk-like records (requested by @fourjay #1179)
    • [ods] add odf filetype for Open Document Format spreadsheets
    • [xlsx] add extra columns (cellobject, fontcolor, fillcolor) if options.xlsx_meta_columns (default False) (thanks @hoclun-rigsep for PR #1098)
    • [sqlite] allow query/insert (no modify/delete yet) for WITHOUT ROWID tables (requested by @stephancb #1111)


    • [savers compression formats] fix corruption when saving to compression formats (#1159)
    • fix "ModuleNotFoundError: no module named 'plugins'" error on startup (#1131 #1152)
    • [windows] fix issue with Enter key on Windows (reported by @hossam-houssien #1154)
    • [draw] fix multiline rows by making height fixed for all rows (reported by @geekscrapy #916)
    • [DirSheet] fix bug where fix key column sheets (e.g. DirSheet, SqliteIndexSheet) keycols were not being saved in batchmode (reported by @geekscrapy #1181)
    • [async] make sure all threads started on sheet are cancelable (reported by @geekscrapy #1136)
    • [AttrDict] fix bug with setting value on nested AttrDict
    • [dup-X-deep] fix error with async_deepcopy (thanks @pstuifzand for fix)
    • [join] fix 'inconsistent-keys' issue when joining between XlsxSheet with typed columns and CsvSheet with untyped columns (reported by @davidwales #1124)
    • [sqlite] handle sqlite column names with spaces (thanks @davidskeck for PR #1157)
    • [sqlite] use options.encoding and options.encoding_errors for decoding of sqlite db text (reported by @WesleyAC #1156)
    • [xlsx] add handling for EmptyCell instances (thanks @hoclun-rigsep for PR #1121)
    • [xlsx] gate sheet name cleaning on options.clean_names (reported by @davidwales #1122)
    • [macos] fix bindings for Option+key
    • [random-rows] fix import (reported by @geekscrapy #1162)
    • [save-selected] better default save filename (reported by @geekscrapy #1180)
    • [save] fix bug where saving multiple sheets to a single non-embeddable format did not result in fail (reported by @geekscrapy #1180)
    • [slide] fix Shift slide-down and Shift slide-up with arrow keys (reported by @a-y-u-s-h #1137)
    • [replay] fix replay where join-sheets operation hangs (reported by @agjohnson #1141)
    • [undo] no more KeyError when Undoing modifications (reported by @geekscrapy #1133)
    • [unfurl-col] fix unfurl-col on cells containing exceptions (reported by @jsvine #1171)
    Source code(tar.gz)
    Source code(zip)
  • v2.6.1(Sep 30, 2021)

    In preparation for the VisiData workshop at Strangeloop 2021, this patch was released with several minor bugfixes.

    Features with fixes include:

    On top of this, we have updated the homebrew and personal debian repositories to contain the most recent version of VisiData.

    We appreciate everyone who has mentioned VisiData in several threads on HackerNews and reddit, recently. Talking about tools you love in public spaces, means a lot to everyone who dedicates time to work on them.

    Happy VisiDating!

    Source code(tar.gz)
    Source code(zip)
  • v2.6(Sep 20, 2021)

    v2.6 (2021-09-19)

    VisiData v2.6: now with menus!

    This release introduces a new[0] hierachical menu system for discovering and executing commands.

    Press Ctrl+H to open the help menu, arrows and Enter to move around. Or use the mouse.

    Here's a video demo of this new menu system, including a sample workflow within VisiData for finding which commands aren't in the menu (using the mouse almost entirely).

    Also in this release are several performance improvements, feature enhancements, and bugfixes. See the CHANGELOG for full details.

    [0] Back in v1.1 (2018), VisiData had an experimental one-line menu system, but it was removed in v1.3 (6 months later), as it wasn't feeling right.

    Source code(tar.gz)
    Source code(zip)
  • v2.5(Jul 9, 2021)

    v2.5 (2021-07-08)

    First off, some non-technical notices:

    Since 2017 when VisiData was started, I've created a number of plugins and tools that take advantage of the VisiData "platform". These have historically been separate from VisiData, but it became a fair amount of mental overhead tracking a dozen different repos when making changes to the VisiData core repo. So a little while ago I migrated some of my older projects, like vsh and vgit, into the saulpw/visidata repo, aiming at a "mono-repo". But they never really got integrated, because they didn't feel right either: some of them were wild experiments, some I don't want to release as open source, some I don't want to provide the level of support for, and some simply don't belong in the visidata repo (like galcon).

    So now I'm migrating towards a "duo-repo" approach. The saulpw/visidata repo can remain focused on providing a reliable and flexible platform, and a separate repo, "vdplus", is where I put all my VisiData plugins and extras. (This vdplus repo is private and not open-source, but Patreon subscribers can get access to it and use it if they want.)

    Secondly, the core VisiData repo now requires submitters to e-sign a Copyright Assignment Agreement (CAA). The core repo will always be open-source, but as the author I should have the legal authority to release it under a different license if I choose.

    Finally, our IRC channel has moved from Freenode to libera.chat; come visit us on the new #visidata!

    And now for the actual software changes:

    Interface Changes

    • quitguard ux improvement

      • [quitguard] confirm quit/reload only if sheet modified (references #955, #844, #483; thanks @jvns, @frosencrantz)
      • not enabled by default yet
    • [quit] add Shift+Q/quit-sheet-free to quit and free associated memory (thanks @cwarden)

    • New major keybinding!

      • x is now "cut" (copy and delete), like in vim.
      • In v2.3 the delete family was changed to delete without copying to the clipboard (previously it acted like "cut").
    • [options] save to foo.visidatarc from OptionsSheet (thanks @njthomas #958)

      • note that you can't save directly to .visidatarc (call it a security feature).

    Minor Improvements

    • [splitwin] push sheet in empty pane iff splitwin
    • [movement] bind Ctrl+Left/Right to go-left/right-page (thanks @davidwales #1002)
    • [unfurl] add options.unfurl_empty to include row for empty list/dict (thanks @frosencrantz #898)
    • [regex expand] deprecate expand_col_scanrows; standardize on options.default_sample_size (thanks @jsvine)
    • [canvas] add options.disp_canvas_charset to change displayed chars (thanks @albert-ying #963)
      • @albert-ying convinced me to make the canvas character set configurable. With options.disp_canvas_charset = ' o', any points on the graph become an o, which is hopefully big enough to see. You can set this to use different characters, just make sure that the first character is a space. This option can also be configured more precisely if you want to vary the character by how many/which points are present (like the braille characters).
    • [join] extend join columns now writable (and correct)

    Loader-specific Improvements

    • [sqlite] rename or drop tables from the sqlite index sheet (edit the name or delete the row and then z Ctrl+S to commit as usual)
    • [DirSheet] add y/gy to copy file(s) to given directory
    • [zstd] support loading zstd-compressed files (thanks @lxcode #971)

    Bugs fixed (34): #758 #895 #896 #898 #946 #952 #955 #958 #959 #961 #962 #963 #964 #966 #969 #971 #974 #975 #979 #982 #983 #987 #991 #1002 #1003 #1010 #1011 #1011 #1012 #1016 #1018 #1029 #1032 #1033

    See the CHANGELOG for the comprehensive list of bugfixes and changes.

    Source code(tar.gz)
    Source code(zip)
  • v2.4(Apr 12, 2021)

    v2.4 (2021-04-11)

    This release, hot on the heels of the 2.3 release last week, is primarily to address some bugs that were found in 2.3. Originally it was slated to be a patch release (2.3.1), but the removal of options.use_default_colors with the fix for #939 and the semantics of splitwindow felt sufficient to warrant a minor version bump, and so we tossed the few other improvements that were sitting on the develop branch.


    • [color] remove options.use_default_colors (thanks @lxcode #939)

      • options.color_default can now have both fg and bg
      • other color options which do not specify fg or bg will use the missing component from color_default
      • to use terminal default colors, set options.color_default=""
    • [splitwindow] stabilize sheet stack associations

      • Shift+Z pushes 'under sheet' (if any) onto other stack
      • Shift+Z does not swap panes anymore
      • g Tab changes which stack is in the top vs bottom panes
      • options.disp_splitwin_pct cannot be sheet-specific
    • [status] show nSelectedRows on rstatus


    • [pyobj-show-hidden] grab visibility lvl from sheet specific option (thanks @frosencrantz #947)
    • [splitwin] prevent flickering-on-full-window
    • [splitwin] if top sheet quit, keep bottom sheet in bottom pane

    Loader specific bugfixes

    • [gzip] fix progress bar when opening gzip (thanks @geekscrapy #925)
    • [http] fix loading files from url without specifying filetype
    • [sqlite] use TABLE_XINFO for hidden/virtual columns (thanks @dotcs #945)
    • [sqlite] reload perf: load without pre-counting rows (which required 2nd full table scan)
    • [vds] save typed values instead of formatted display values (thanks @frosencrantz #885)
    • [xlsx] stringify "header" row values for column names (thanks @davidwales #921)
    Source code(tar.gz)
    Source code(zip)
  • v2.3(Apr 5, 2021)

    This release adds a memory sheet and improves on several other features. Major changes are listed below. Please see the CHANGELOG for the full list of changes.

    1. Memory sheet, for recording values usable in expressions. View the memory sheet with open-memory (Alt+Shift+M), add current cell with Alt+M, add single aggregated value with z+. Also reference the current clipboard value as clipval. #912

    2. The split pane feature has been revamped. Now there is one sheet stack per pane, and sheets do not jump between panes. New sheets open in the current pane. Send the current sheet to the other pane with Shift+Z (same command as invoking splitpane in the first place). Ctrl+^ swaps sheets in the current pane. See the pane column on the Sheets Sheet (pane 0 means "not on any sheet stack", i.e. it's been quit). #894

    3. Colors now may have a background color in addition to the fg color and attributes. Add e.g. "on blue" or "on 214" to a color to set the background color. There is still the (curses) limit of 256 active colors shown at one time. (This is one of several changes in 2.3 necessary to use the new darkdraw plugin.) #435

    4. minor additions

    • new command: jump-first (bound to g Ctrl+^) to push the bottom sheet (used repeatedly will cycle through sheets in the current pane).
    • Ctrl+X within Ctrl+X (pyobj-expr) drops into a Python REPL.
    1. changes to options and commands
    • options.use_default_colors now defaults to True (was False).
    • delete commands no longer move deleted values to clipboard #895
    • zd and gzd (delete-cells) set the value to options.null_value instead of always using None.
    Source code(tar.gz)
    Source code(zip)
  • v2.2.1(Feb 8, 2021)

    This is a small patch.

    There are two bugfixes for setcol-fill (see #884), and a typo fix in the manpage.

    Additionally, there is now a packaged visidata.1, so that man visidata will also bring up the VisiData manpage, when the manpage is successfully installed.

    VisiData v2.2 has been packaged for Debian, and is slated to be part of the bullseye distribution. I am hoping I can sneak v2.2.1 in there, also.

    Happy data-sleuthing!

    Source code(tar.gz)
    Source code(zip)
  • v2.2(Jan 31, 2021)

    This release adds new features and changes some existing behavior. Please see the CHANGELOG for the complete list of changes and bugfixes.

    1. The interpretation of "global" vs. "sheet-specific" CLI options has changed.

    In v2.0 and v2.1, options given on the command-line were "sheet-specific" and only applied to files on the command-line, and -g (--global) had to be specified to make them apply to sheets created after launch. Now, options are "global" by default (affecting all sheets which don't have a sheet-specific override), and -n indicates that subsequent CLI options are sheet-specific. The -g option is now basically a no-op (though it can be given after -n (--nonglobal) to return to the default behavior after specifying some sheet-specific options). This fixes a few things that users (including myself) were consistently misinterpreting or getting frustrated with, and hopefully does not affect anyone adversely.

    1. New feature: persistent input history

    By popular demand, VisiData can now store user-provided input values so they persist between sessions. This is currently disabled by default, as it may have surprising privacy or security implications in some environments. Enable persistent input history by adding the following to visidatarc:

    1. New type: floatlocale

    The VisiData float type uses the Python builtin float, which only parses numbers in "international" notation. To parse locale-specific numbers (which use e.g. a decimal comma instead of a decimal point), there is now the floatlocale type, which parses numbers based on the LC_NUMERIC environment variable (which must be set before starting vd). A separate type was created because locale-based parsing was measured as 20x slower than the base float type. The type-floatlocale and type-floatlocale-selected (on ColumnsSheet) commands were added without keybindings; users who need this functionality will probably want to add the following to their visidatarc:

    bindkey('%', 'type-floatlocale')
    bindkey('g%', 'type-floatlocale-selected')
    1. Option change: Fancy Chooser now disabled by default

    The "fancy chooser", a tabular menu with helpstrings for choosing e.g. aggregators and jointypes, is now disabled by default. Choosing an aggregator or jointype now (again) uses the status/input line, and requires entering the value manually. To invoke the fancy chooser, use Ctrl+X. If the fancy chooser is preferred by default, set options.fancy_chooser=True.

    1. New format: .vds (VisiData Sheet)

    This new single-file format can store typed data and column information from multiple sheets. Use g Ctrl+S (save-all or save-selected) to invoke the multisheet saver, and then specify a filename with a .vds extension. When you load the file into vd, the Column typing and formatting will be the same!

    1. New loader (and saver): geojson

    Thanks @dracos for PR #876 implementing geojson loading and saving!

    1. Several other improvements and bugfixes
    Source code(tar.gz)
    Source code(zip)
  • v2.1.1(Jan 4, 2021)

    This release may be a small one, but it contains a handful of meaningful bugfixes that we wanted to get out the door.

    Happy New Year, everyone!

    - [macros] allow macro interfaces to be longnames (thanks @frosencrantz #787)
    - [save] better default save filename for url sheets (thanks @geekscrapy #824)


    - [cmdlog] record column, sheet, and row info for open-cell
    - [cmdlog] catch case of 'override' sheet for set-option
    - [expr-col] `curcol` now works for multiple invocations (thanks @geekscrapy #659)
    - [loaders postgres] account for postgres_schema when rendering Postgres tables (thanks @jdormit for PR #852)
    - [loaders url] fail unknown URL scheme (thanks @geekscrapy for PR #84)
    - [pyobj] fix Pyobj Sheets for lists (thanks @brookskindle #843)
    - [pipe] handle broken pipes gracefully (thanks @robdmc #851)
    - [scroll] fix issue with jagged scrolling down (thanks @uoee #832)
    - [sort] fix bug where total progress in sorting is (100 * # of columns to sort) (thanks @cwarden)
    Source code(tar.gz)
    Source code(zip)
  • v2.1(Dec 7, 2020)


    This release fixes several bugs in 2.0 and fills in some of the gaps. Please see the CHANGELOG for the complete list of changes and bugfixes.

    1. options.some_selected_rows

    Some commands, like setcol-expr (g=) operate on the selected rows. Before 2.0, if no rows were selected, these commands would fall back to operating over all rows. This is intuitive and helpful, but can cause problems with non-interactive script replay: sometimes there are legitimately no selected rows, and so the command should not do anything (but also not fail).

    So the behavior was changed in 2.0 to have reliable and deterministic results. It's reasonably easy to work around: select all rows with gs, repeat the command, and maybe unselect them all with gu. But this turned out to be ultimately disappointing for interactive use.

    So, in 2.1, there is now an option some_selected_rows, which if True, causes these commands to operate on all rows, if none are selected:

    • setcol-expr (g=)
    • setcol-iter (gz=)
    • setcol-subst (g*)
    • setcol-subst-all (gz*)

    This option applies only to interactive mode, and not to batch mode. In batch mode, commands that operate on selected rows will always use the list of selected rows, even if there are none (and so it won't do anything). Be careful about saving .vd scripts from sessions in which this option was set; the results when replaying in batch mode may not be as expected.

    1. options.numeric_binning

    For 2.0, ranged binning of numeric columns was implemented, and allowed to be disabled by setting options.numeric_binning to False. (By default it was set to True.)

    In 2.1, this option is now disabled by default, and must be enabled (whether globally or per-sheet) by setting it to True.

    1. Shift+Arrow within edit-cell to move cursor and re-enter edit mode

    By popular demand, pressing Shift+Arrow when editing a cell, will save the current value, move the cursor one row or column in the given direction, and re-enter edit mode. This makes it easier to enter data, either row-wise or column-wise.

    This feature obsoletes options.cmd_after_edit, which was always a terrible hack. It has no effect now.

    1. Expression can access column attributes

    In 2.0, expressions could use attributes on the vd singleton or the current sheet object, and had sheet and row special variables to refer to the sheet and row objects themselves.

    In 2.1, expressions can also use attributes of the expression column, and col can be used to refer to the column object directly. (So col.width and width both refer to the width of the expression column itself, if there are no columns named width.)

    1. Differentiate select-equal- and select-exact-.

    Previously, select-equal- (bound to ,) matched on the typed value. Now, select-equal- matches on the displayed value. New commands select-exact-cell/-row that match on typed value are bound to z, and gz, (the display value may be rounded or formatted with less precision, so using the typed value is "more precise".

    (Thanks @geekscrapy for noticing)

    1. New macro system

    A new command macro-record (bound to m) starts recording commands for use in a macro. The same command stops recording and prompts for a keystroke to bind the macro to. When the given keystroke is pressed, the macro will be executed. All macros run their commands on the current (row, column, sheet), regardless of the cursor position when the macro was recorded.

    The new command macro-sheet (bound to gm) opens an index of all current macros. A macro on this sheet can be viewed with Enter and then modified, saving changes with Ctrl+S

    This feature obsoletes the older iteration of macro system, and removes the deprecated z Ctrl+D command.

    (Thanks @bob-u for the suggestion)

    1. Other Additions and Improvements
    • Add mode and stdev aggregators.
    • Add sort-order indicator in column header.
    • Unset options with d on options sheet (also add options.unset() API function).
    • .vdj scripts are now hashbangable. Put #!vd -p at the start of the .vdj file and watch it go! (Note: extension must still be .vdj for now.)
    • The floatsi type (z%) can now parse SI strings like "2.3M" (thanks @anjakefala for sponsoring).
    • Regex capture (;) will use capture names as column names, if available (thanks @tsibley).
    1. Format-specific improvements
    • [http] auto-paginate by continuing with the given links.next.url from the response.

    • [json] 50% speedup for loading (thanks @lxcode).

    • [pdf] options.pdf_tables to parse tables from pdf with tabular.

    • [sqlite] Use internal rowid to update and delete rows (WITHOUT ROWID sqlite tables can no longer be modified).

    • [zip] Add extract-file, extract-selected, extract-file-to, extract-selected-to commands (bound to x, gx, zx, and gzx on the ZipSheet).

    • [fixed] Add fixed-width saver (uses col.width).

    • [clickhouse] Add plugin for clickhouse loader.

    Source code(tar.gz)
    Source code(zip)
  • v2.0.1(Oct 13, 2020)

    VisiData 2.0.1

    major changes since 1.5.2 (last official release)

    1. Plugin API
    2. Undo/Redo
    3. Deferred changes
    4. Split Window

    highlighted features added since 1.5.2

    • [iota] add i family of commands (iota/increment)
    • [unfurl-col] zM, which does row-wise expansion of iterables in a column
    • [join] add merge jointype (thanks @sfranky for feature request #405)
    • [freq/pivot] range binning for numeric columns
    • [options] options parsing rewrite allows for per-sheet options
    • [cli] stdout pipe/redirect
    • more visibility for long values, with multi-line rows and offset scrolling
    • add Alt/Esc as prefix for user keybindings
    • [input] Ctrl+Y paste from cell clipboard and other improvements

    new loaders since 1.5.2

    • MIME (.eml) (2.-5)
    • recutils (.rec) (2.-5)
    • VCard (.vcf) (2.-5)
    • IMAP (email)
    • MySQL (thanks @p3k)
    • PDF (text only)
    • numPY (.npy/.npz)
    • Unicode Separated Value (.usv)
    • Excel 2007-2010 binary fomat (.xlsb) (suggested by @woutervdijke #246)
    • feather, gbq, orc, parquet, pickle, sas, stata via pandas (thanks @khughitt for bug report #460)
    • postgres support for connecting directly to rds (thanks @danielcynerio for PR #536)

    For the full list, see below along with release notes from previous pre-releases, or view the CHANGELOG

    changes since pre-release v2.-4

    • Additions and Improvements

      • [aggregators] allow custom aggregators in plugins/visidatarc (thanks @geekscrapy for the feature request #651)
      • [loaders xlsx] automatically clean sheet name when saving; warn if sheet name changes (thanks @geekscrapy for the request #594)
      • [columns] unhide height attribute by default (thanks @frosencrantz for feature request #660)
      • add .vcf (VCard) loader
      • [sqlite] remove name of db from an SqliteSheet's name, only tablename
      • [syspaste] make syspaste- replayable and undoable (note that syspaste- value will be recorded in CommandLog)
      • [savers] many text saver filetypes via tabulate library (thanks @jsvine for original vdtabulate plugin)
      • [calc] ExprColumn no longer cached by default
      • [loaders rec] add new .rec file loader and multisheet saver (recutils)
      • [savers] implemented multisheet saver for both json and jsonl
      • [loaders eml] add new .eml file loader for email files with attachments
    • Options

      • add options.incr_base (thanks @chocolateboy for the suggestion #647)
      • (former) options.force_valid_colnames renamed to options.clean_names
        • applies to Sheets and Columns now (thanks @geekscrapy for the request #594)
      • for --X=Y, do not replace - with _ in Y (thanks @forensicdave for bug report #657)
      • add options.default_height for visibility toggle (thanks @frosencrantz for feature request #660)
      • add support for -- option-ending option on CLI.
      • [input] default now fancy_chooser = True
        • when fancy_chooser enabled, aggregators and jointype are chosen with a ChoiceSheet.
        • s to select, Enter to choose current row, g Enter to choose selected rows, q to not choose any
      • numeric_binning is now True by default (enables numeric binning on PivotSheet and FreqTable for numeric columns
    • Command changes and additions - (former) setcol-range (gz=) renamed to setcol-iter - (former) addcol-range-step (i) renamed to addcol-incr-step - (former) setcol-range (gi) renamed to setcol-incr - (former) addcol-range-step (zi) renamed to addcol-incr-step - (former) setcol-range-step (gzi) renamed to setcol-incr-step - add scroll-cells-* to scroll display of cells while remaining in a Column; bind to [g]z{hjkl} - (former) unbind z{hjkl} from scroll-col (thanks @geekscrapy for feature request #662) - add type-floatsi bound to z% (#661) - reload-selected now reloads all Sheets if none selected (thanks @geekscrapy for PR #685) - add customdate with fixed fmtstr for parsing (use [email protected] and input a fmtstr compatible with strptime (thanks @suntzuisafterU for feature request #677)

    • Bugfixes

      • [DirSheet] use changed ext as filetype when loading files (thanks @frosencrantz for bug report #645)
      • [slide] several major improvements to column sliding; key column sliding now works (thanks much to @geekscrapy for bug hunting #640)
      • [open-row] Sheets Sheet should be removed from stack upon open-row (thanks @cwarden for the bug report)
      • [cli] re-add --version (thanks @mlawren for bug report #674)
      • [open-config] fix gO (thanks @geekscrapy for bug report #676)
      • [splitwin] handle swap case for single sheet (thanks @geekscrapy for bug report #679)
      • [loaders xlsx] handle None column names for all Sequence Sheet loaders (thanks @jsvine for bug report #680)
      • [settings] retrieve from cache for top sheet if obj is None (thanks @aborruso for the bug report #675)
      • [settings] check if option is set on specific sheet before falling back to override
      • [describe] have DescribeSheet use source column's sheet's options.null_value to calculate its null column (thanks @aborruso for the bug report #675)
      • [undo] ensure that undos for complex commands (like expand-cols) are set more frequently (thanks @frosencrantz for the bug report #668)
        • it is still possible to find race conditions if the user presses commands fast enough, however they should happen far less frequently
      • [vlen] fix numeric binning for vlen() (thanks @frosencrantz for bug report #690)
      • [pivot] fix pivot case where no aggregator is set
      • [pyobj] fix filtering for PyobjSheet
      • [DirSheet] fix sorting for directory column of DirSheet (thanks @frosencrantz for bug report #691)
      • [json] fix bug saving cells with nested date values (thanks @ajkerrigan for PR #709)
      • [input] fix Ctrl+W bug when erasing word at beginning of line
      • [plugins] import .visidata/plugins by default
      • [pandas] use a safer reset_index() to avoid losing data when updating a pandas index (thanks @ajkerrigan for PR #710)
      • [threads] disable add-row on ThreadsSheet (thanks @geekscrapy for bug report #713)
    • deprecated

      • complete removal of status and statuses from deprecated (thanks @frosencrantz for bug report #621)
        • longnames are now open-status and show-status
      • remove cursorColIndex
    • API and Interface

      • Sheet(*names, **kwargs) autojoins list of name parts
      • openSource(), aggregator(), and aggregators are now part of vdobj
      • set_option is now setOption
      • move isError to Column.isError
      • deprecate load_pyobj, now PyobjSheet
      • add .getall('foo_') which returns all options prefixed with 'foo_'; deprecated options('foo_')
      • nSelected is now nSelectedRows
      • make Column.width property, so setting is same as Column.setWidth
      • evalexpr is now evalExpr
      • format is now formatValue
      • SettableColumn.cache is now ._store
      • vdtype() is now vd.addType()
      • add addColumnAtCursor (thanks @geekscrapy for bug report #714)
    • Plugins

      • update sparkline (thanks @layertwo #696)
      • plugin dependencies now install into plugins-deps (former plugin-deps)
    • Dev niceties

      • Fully automate dev setup with Gitpod.io (thanks @ajkerrigan for PR #673)
    Source code(tar.gz)
    Source code(zip)
  • v2.-4.0(Jul 28, 2020)

    New Features (v2.-4)

    1. reintegrate deferred mods; save with z Ctrl+S

    First and foremost, the 'defermods' feature has been reintegrated into core VisiData. It was added in v2.-1, but it caused some headaches, so we separated it out into a plugin for v2.-2, along with vls for the DirSheet. Then we found that we really missed having the functionality right in vd alongside everything else, and not having to reach for a specialized tool. @anjakefala got to the bottom of our headaches and did the heavy lifting to make sure that everything works properly now. So now the DirSheet and SqliteSheets are once again able to 'defer' their modifications and deletions, until saved to the source with z Ctrl+S. Ctrl+S saves the sheet to a regular data file as usual.

    See also the defermods page.

    Thanks to @anjakefala for her diligence and hard work on this!

    2. unfurl a column (unfurl-col bound to zM)

    As suggested by @jsvine, unfurl is a row-wise expansion of a column with containers.

    • expand-col does a column-wise expansion: 1 column is added for each key/value in the containers (assumes mostly homogenous data)
    • melt converts non-key columns into rows (on a new melted sheet)
    • unfurl-col is kind of like a shortcut for an expand followed by a melt (demo on twitter)

    In my mind, unfurl is conceptually closer to expand-col, but since it pushes a new sheet, putting it on a Shift+ command feels more natural. The unfurl-col command feels like a focused melt--melting lists or dicts in the cursor column, instead of the individual values of the non-key columns as melt does. So it's now bound to z Shift+M.

    3. 'i'ncrement and family

    Generating a range of numbers turns out to be surprisingly handy.

    Previously, if you wanted to make a column with a list of numbers, you'd have to use za to create a column, gs to select all the rows (losing your previous selection) gz= (setcol-range array languages, the 'increment' operator generates a sequence of integers from whole cloth.

    In fact there was a version of this in the rownum plugin, and another version in @jsvine's unfurl plugin. So we added equivalent commands to stock VisiData. Because of the tradition of using i-like characters in APL notation ('ι' in APL and 'i.' in J), and the coincidence that i has remained one of the few unbound keystrokes, I decided to develop this set of increment concepts, and bind them to the i family of commands. See below for the new commands.

    4. cli options improved; set sheet-specific options from CLI

    We had a couple of open issues with command line options, and finally I bit the bullet and just wrote a custom cmdline args parser, instead of using Python's argparse. It was actually about the same amount of code, but now the syntax is more regular, more permissive, and can set sheet-specific options multiple times and differently for different sheets. Thanks to @tsibley for patient testing and precise bug reports.

    See /options#cli for details on how the command line interface works.

    Also the visidata_dir option (default $HOME/.visidata) can now be set via the environment variable $VD_DIR. Likewise config can be set via $VD_CONFIG.

    5. fancy_chooser

    Setting the fancy_chooser option to True enables a fancy selection menu for adding aggregators and choosing jointypes. Help text is included for each item; press Enter to choose a single item, or select multiple rows and press g Enter, or q to abort. This uses the splitpane functionality from the previous release.

    6. column format strings

    Python has multiple syntaxes for formatting numbers within strings: %.02f which used with the % format operator, and {:.02f} used with .format(). Which should you use for in the fmtstr attribute on the Columns sheet? A Twitter poll was evenly split, and @tsibley suggested ¿porque no los dos?](https://twitter.com/trs/status/1182390622507827202) So as of v2.-4, you can use either format mechanism! If you want thousands separators though, you have to use {:,.02f}. See /blog/fmtstr for details.

    new and improved loaders

    • IMAP (email): open an imap:// url and it'll download all your email, which you can then save to .jsonl like I did

    • basic MySQL loader (requires ..; thanks @ )

    • basic PDF text extractor (requires pdfminer)

    • improved loaders: csv hdf5 html http json jsonl pandas pcap postgres xls yaml

    Thanks to @ajkerrigan for actively following up on the pandas and json bug reports, and all of his work in making them better.

    new commands

    • z Shift+M unfurl-col

    • i addcol-range adds a column with integer values reflecting the current row order.

    • gi setcol-range sets values in the current column for selected rows

    • zi addcol-range-step adds a column with values

    • gzi setcol-range-step sets values

    • x (Canvas) resize-x-input sets x axis dimensions on a plot

    • y (Canvas) resize-y-input sets y axis dimensions on a plot

    • (unbound) select-error

    • (unbound) select-error-col

    • (unbound) mouse-enable and mouse-disable

    • (unbound) guard-sheet sets quitguard on current sheet

    lots more improvements and bugfixes

    And of course there are tons of bugfixes and smaller improvements throughout. For a more complete list, see the CHANGELOG.

    Source code(tar.gz)
    Source code(zip)
  • v1.5.2(Jan 13, 2019)

    We are starting off the New Year with a very small patch for a few bugs.


    1. Fixed g*
      • thanks to both @jsvine and @layertwo for noticing and notifying us.
    2. If suspended during editline (with Ctrl+Z), VisiData will now correctly resume in the editline.
    3. Ctrl+W on an empty value in editline does not error out of the editline.

    And that's it.

    Happy new year, everyone!

    Source code(tar.gz)
    Source code(zip)
  • v1.5.1(Dec 19, 2018)

    The initial motivation for this patch was to fix an idle performance regression. In the interim, though, we have received a bunch of feedback for improvements and a couple of feature requests.

    So thanks for all of your ongoing engagement and for continuing to share VisiData with the world. We hope you enjoy this final release of 2018!

    A brief overview:

    1. Improvements to the pandas loader.

      • thanks to @nickray for the bughunting
    2. When set to True options.bulk_select_clear bulk select commands (|, g|, ,, etc) will clear the previously selected rows.

      • the default is set to False and exhibits the current behaviour of retaining the already selected rows
      • thanks to @aborruso for the suggestion
    3. Shift+O once again pushes the global options sheet. You can find the sheet options by pressing zO. gO now opens the .visidatarc which can be edited and saved from within the VisiData interface.

    4. Sorting is now asynchronous, per user request. Please let us know how you find it.

      • thanks to @apnewberry for starting that conversation
    5. gz^ now renames all visible columns to contents of selected rows and gz* substitutes over all visible columns

      • thanks, once again, to @aborruso for both suggestions

    As usual, the complete list of changes can be found in the Changelog.

    Source code(tar.gz)
    Source code(zip)
  • v1.5(Nov 3, 2018)

    For the most part, this is a bugfix release. A few other improvements are here as well:

    1. Basic plugin support

      • ~/.visidata added to sys.path on startup
      • copy plugin to e.g. ~/.visidata/vdfoo.py
      • add import vdfoo to .visidatarc to activate
    2. Error saving

      • for tsv and json, errors are saved as options.safe_error string (default #ERR)
      • if that option is an empty string, error message is saved instead
    3. Mouse improvements

      • click now moves to column also
      • right-click to edit cell, rename column, or rename sheet, depending on where clicked.
    4. xls/xlsx loaders now use options.header to determine number of rows used to set column names (default is 1).

    See the CHANGELOG for a more complete list of bugfixes and changes.

    Source code(tar.gz)
    Source code(zip)
  • v1.4(Sep 25, 2018)

    This is largely a bugfix and performance release. It was originally planned as a patch release (v1.3.2), but some features and interface changes crept in, so it is officially v1.4.

    • [pyobj] visidata.view(obj) and visidata.view_pandas(df)
    • [pandas] -f pandas loads file with pandas.read_<ext>
    • [date] date minus date now gives float number of days instead of seconds
    • [vdtui] internal colorizer API changed significantly
    • [vdtui] timeout and redraw only if other threads active

    As usual, a more complete list of changes and features is in the CHANGELOG.

    See the ROADMAP for the planned future direction of VisiData.

    Source code(tar.gz)
    Source code(zip)
  • v1.3.1(Aug 31, 2018)

    We found some issues with 1.3 (aggregators interacting with nulls/errors, primarily) that we didn't want to let sit until 1.4. So we fixed those issues and a couple others, and added a few 'minor' features. This patch version should be a definitive improvement over the base 1.3 version.

    The complete list of changes is in the CHANGELOG. Here are the new options and features:

    • new extend join type keeps the type of the first sheet, extending it with columns from the other sheets
    • rename-sheet command (thanks to @jsvine for suggestion; what default keybinding should it have?)
    • [DirSheet] add reload-rows (gz^R) to undo modifications on all selected rows
    • remove all options.foo_is_null and add options.null_value
    • options.save_errors (default True) to include errors when saving
    • add options.json_indent for json pretty-printing
    Source code(tar.gz)
    Source code(zip)
  • v1.3(Aug 11, 2018)


    It's been a productive 3 months since v1.2. The largest effort in this release was a commands/options reworking, which will hopefully pay dividends in the future. Many other so-called improvements were made as well. Here's a list of most of them:


    • All commands were thoughtfully renamed, and the command longnames should be largely stable now.
    • commands.tsv is an exhaustive list of commands and their attributes and side effects.
    • The manpage has moved to Ctrl+H, which should be its final resting place.
      • F1 will still open the manpage if the terminal doesn't intercept it.
      • but z? has been repurposed (see below).
      • Note that because iTerm reports Ctrl+H as Backspace, these help commands are also available by using Backspace (backspace for help, a new trend).
    • z Ctrl+H opens a list of commands available on this sheet.
    • Keybindings and longnames are separated out. The cmdlog now records longnames as well.
    • See the new keyboard layouts page (thanks to @deinspanjer for inspiration).

    changes to existing commands and options

    • The experimental menu system (was Space) has been removed.
    • Now Space (exec-longname) executes the command for the input longname (tab completion of available commands is supported). (This function was previously bound to Ctrl+A).
    • options.wrap (for TextSheet wrapping of lines) now defaults to False.
    • R (random-sheet) opens a new sheet instead of selecting random rows (reverting to former behavior).
    • za (addcol-empty) asks for column name
    • zd (delete-cell) moves value to clipboard ("cut", like other delete commands)


    • options can now be set on specific sheet types or even individual sheets. Shift+O opens options for the current sheet type, and g Shift+O opens the global options sheet.
    • See available colors by pressing Space and then typing the longname colors.

    new safety options

    • Error messages are sorted before informational status messages, and colored by color_error and color_warning (thanks to @jsvine for suggestion)
    • options.quitguard (default False to keep old behavior) if True, will confirm before quitting last sheet.
    • The sheets-graveyard (gS) command opens a sheet that shows all discarded (but "precious") sheets. These are stored as weak references so they will be garbage collected eventually, but can be resurrected from the graveyard sheet until then.
    • options.safety_first (default False) makes loading/saving more robust, likely at the cost of performance which can become significant in large files.
      • Currently, only removes NULs from csv input.
    • options.tsv_safe_char is split into tsv_safe_newline and tsv_safe_tab.

    new power features

    • z; (addcol-sh) adds new columns for stdout/stderr of a bash command, which uses $colname to substitute values from other columns (whole arguments only, so far).
    • z| (select-expr) and z\ (unselect-expr) select/unselect by Python expression (thanks to @jsvine for suggestion).
    • z/ (search-expr) and z? (searchr-expr) to search forward/backward by Python expression.
    • gI (describe-all) describes all columns in all sheeets (like gC (columns-all)).

    nice things

    • The g(, z(, and gz( variants of ( ('expand-column') are filled out.
    • z# sets type of current column to len.

    new loaders

    • yaml loader (thanks to @robcarrington, @JKiely, @anjakefala at PyCon Sprints for making this happen)
    • pcap loader (thanks to @vbrown608 and @TemperedNetworks)
    • xml loader
    • jsonl saver
    • [json loader] no more incremental display (need a better json parser than the Python stdlib offers)
    • pandas adapter (thanks to @jjzmajic for issue #162)

    minor changes

    • System clipboard command detection is more portable (thanks to @chocolateboy for the PR).
    • date supports adding a number of days (or like foo+6*hours, foo+9*months, etc).
    • Hidden columns are darkened on columns sheet.
    • Exceptions are rolled up properly.
    • options.motd_url now uses https by default (thanks to @jsvine for the warning).
    • [DirSheet] mode is editable (set to octal like 0o0644).
    • [internal dev] ProfileSheet is improved.

    known issues

    • cmdlog replay with a Ctrl+S (save-sheet) to an existing file gets stuck in an infinite loop when options.confirm_overwrite is on.
    • After renaming a file on a DirSheet, Ctrl+R (reload-sheet) is required to refresh the ext column for that row.
    • n/N (next-search/prev-search) won't continue a previous search-expr and searchr-expr.
    • show-aggregate with mean errors on int columns.
    • Contracting (with )) a previously expanded column on a dup-ed (with ") sheet results it in disappearing on the source sheet.

    Thanks to everyone who contributed to this release! As always, feedback and suggestions are welcome and appreciated.

    Source code(tar.gz)
    Source code(zip)
  • v1.2.1(Jul 7, 2018)

    @deinspanjer (issue #164) discovered that VisiData doesn't work with Python3.7 due to our use of the 'async' identifier, which is now off-limits as it is a formal keyword as of 3.7. The only change in 1.2.1 is changing 'async' to 'asyncthread' in order to work with Python 3.7.

    Thanks to the illustrious @anjakefala for getting this release out quickly and without incident (knock on wood).

    Source code(tar.gz)
    Source code(zip)
  • v1.2(May 3, 2018)

    Here are the major feature enhancements for v1.2. Please see the CHANGELOG for the complete list.

    Major features

    • DirSheet enhancements (modify file metadata, move/delete files)
    • multisave (single file multisave to html, md, and txt format, or into a directory for other formats)
    • prototype macro system with z^S on the commandlog
    • New conda package

    New commands and options

    • T to push derived sheet with transposed rows/columns
    • zs/zt/zu to select/unselect/toggle rows from top of sheet to cursor (thanks @SteveJSteiner for the suggestion)
    • gzs/gzt/gzu to select/unselect/toggle rows from bottom to cursor
    • gv to unhide all columns
    • gM to melt into multiple value columns
    • g* to transform selected rows in place
    • z</`z>' to move up/down to next null cell
    • ^A to execute a command by its longname
    • gD to open the directory at options.visidata_dir (default ~/.visidata)


    • options.cmdlog_histfile to specify a file to auto-append commandlog to (default empty means disabled)
    • options.tsv_safe_char to replace tabs and newlines when writing .tsv format (default empty means disabled, for faster saving)
    • options.error_is_null to count errors as null (default false)

    New supported formats and sources

    • sas7bda (SAS; requires sas7bdat)
    • xpt (SAS; requires xport)
    • sav (SPSS; requires savReaderWriter)
    • dta (Stata; requires pandas)
    • bz2 and xz (LZMA) compression (thanks @jpgrayson)
    Source code(tar.gz)
    Source code(zip)
  • v1.1(Mar 6, 2018)

    This is the first release since 1.0. The major additions and changes:

    • All external loader dependencies have been removed from the PyPI, brew, and Debian packages. This will make for much faster initial installation.

      • The json, csv, tsv, and sqlite loaders are still available with the base installation as they are supported by the Python standard library. Other loaders will need their dependencies to be installed manually. See requirements.txt for which external packages to install for each loader.
    • An experimental command menu is now available via Space. The goal is to make it easier for people to explore the available functionality, and to try commands without knowing their keybindings.

      • Use the standard VisiData movement keys (h/l/Arrows, q to back out)
      • The help strings are shown during navigation, along with the available keybindings, so this will hopefully help people learn the keybindings as they use commands, without having to break their flow to refer to the manpage.
      • Commands are organized in a hierarchy according to their longnames. This hierarchy may change in future releases, so these longnames are not yet stable enough to use for command aliases or in cmdlog replay. The actual command keys are more stable and should be preferred for the time being.
      • If you play with the menu system, please let me know what did or didn't work for you!
    • The Y command series was added to copy ("yank") to the system clipboard (with options.clipboard_copy_cmd, set to pbclip for MacOS by default) to conveniently paste data in any supported text output format.

      • Y copies the current row, zY copies the current cell, and gY copies all selected rows (or all rows).
      • This mirrors the existing y command series, which yanks to VisiData's internal clipboard.
    • - now works as a filename to specify stdin/stdout. Useful especially in batch mode to dump final sheet to stdout (-b -o -).

    New supported formats:

    • markdown (md) is now supported for saving (but not loading, yet) to an org-mode compatible table format.

    • .png files can now be loaded and saved, and crudely viewed on the canvas with an overloaded .. The pixels can be edited on the source sheet like any other data.

    • .ttf and .otf (font) files can be loaded and viewed on the canvas. This is super useful for just about no one, but it was a great excuse to implement Canvas.qcurve().

    These commands have been added or changed, and are expected to stay in future versions:

    • The za command adds an empty, editable column to any sheet. gza adds N new columns.

    • The ( and ) commands will expand/collapse list/dict columns (e.g. in nested json).

    • In the canvas, d deletes points from source sheet that are contained within the cursor. gd deletes all points shown on the screen.

    • The [email protected]#$%-_ special actions on the Columns Sheet and Describe Sheet have been removed. They were sometimes convenient, but more often made it difficult to interact with the Columns Sheet itself.

      • The g forms of these commands are still available and will operate on the source columns (with the exception of g_, which now works consistently on all sheets as expected).
    • The Shift+Arrows are aliased to HJKL (though these may not work in all environments).

    These additions are more experimental and may not stay in future versions:

    • The Backspace command drops the current sheet (like q), and also scrubs its history from the cmdlog.

    • ENTER is now aliased to modify-edit-cell by default.

    Other minor changes:

    • search and select with no input now uses the most recent input. n/N do this already for row search (as before), but the new behavior works more like standard vim/less/etc tools, and also applies to non-row search (like c).

    • Many sheets (pivot, describe, melt, and many loaders) have improvements and bugfixes to make them even better.

    Finally, some other news:

    • VisiData has been accepted into Debian for the next release! It is currently available if you've added the unstable repo; install with apt install visidata.

    • Jeremy Singer-Vine has put together a great tutorial for people who want a smoother path to start using VisiData.

    Thanks to everyone who contributed to this release! As always, feedback and suggestions are welcome and appreciated.

    Source code(tar.gz)
    Source code(zip)
  • v1.0(Jan 26, 2018)

    VisiData v1.0 (2018-01-25)

    VisiData 1.0 has been officially released! Changes since the 0.99 release candidate:

    • a complete overhaul of the website and documentation;
    • a 2x across-the-board performance improvement for async threads (from disabling profiling by default);
    • removed support for .visidatarc in the current directory and via XDG; only $HOME/.visidatarc is used now;
    • many bugfixes, both functional and cosmetic;
    • removed the "visidata[full]" package from PyPI;
    • a homebrew package (so you can now do brew install saulpw/vd/visidata on MacOS), and an apt package that is under review for inclusion in Debian.

    This is a huge milestone for VisiData. I devoted my sabbatical (the entire year of 2017) to creating an open-source tool that would be useful for myself and other terminal users, and it was very important for me to release a stable and lasting 1.0 so that it could be set aside when I resumed working.

    We could have gotten away without certain features and with fewer supported formats, but there is such breadth and depth included in 1.0 (as shown by demos like this one at the PyCascades 2018 conference), that I'm hard-pressed to choose which features should have been omitted.

    I owe a great deal to many people who have helped and supported me through this process. VisiData would not be what it is without them. The list of contributors includes everyone who has submitted to the repository, but there are some other groups to whom VisiData and I are eternally indebted:

    • the Recurse Center, for maintaining an awesome space and incredibly supportive community that I am lucky to have become a part of;
    • Office Nomads, my local co-working space where I could work without turning into Jack Torrance;
    • and the Python community, for creating such a broadly useful language and ecosystem, without which VisiData would not be nearly as powerful.

    Finally, a very special thanks to Anja for her incredible help in putting together the website, documentation, tests, and various releases.

    Share and enjoy!


    Source code(tar.gz)
    Source code(zip)
  • v0.99(Dec 23, 2017)

    No changes will be made on stable before 1.0 except for targeted bugfixes with minimal likelihood of regressing anything else. If there are any more bugfixes to be applied, they will be cherry-picked from continuing develop. Either v0.99 or v0.99.1 will become the formal 1.0 in a few weeks.

    User-facing changes in this version:

    • tab completion for filename and python expressions
    • load .html table elements (requires lxml)
      • http urls are now usable as sources (requires requests)
    • save as .json
    • ^W to erase a word in the line editor
    • gC views all columns on all sheets
    • median aggregator
    • v now 'visibility toggle' (moved from w)
    • --version (thanks to @jsvine)
    • options.use_default_colors (thanks to @wavexx)
    Source code(tar.gz)
    Source code(zip)
  • v0.98.1(Dec 5, 2017)

    v0.98.1 is a patch release that fixes a couple of minor bugs. The primary change in this release, however, is that the 'visidata' package on PyPI no longer includes all of the loaders' dependencies by default.

    This is a minor hassle for first-time users if they want to use certain formats, but since the goal is eventually supporting every possible data format, installing all dependencies for all users by default is not tenable. The base VisiData already includes support for tsv, csv, fixed width, sqlite, graphs, and more. Most users will only need one or two additional dependencies for their data sources.

    To install VisiData with all dependencies for all loaders:

    pip3 install "visidata[full]"

    Of course, you can install just the dependencies you need. See "SUPPORTED SOURCES" in the manpage for which packages to install.

    Source code(tar.gz)
    Source code(zip)
  • v0.98(Nov 24, 2017)

    When I announced that v0.97 was "feature complete", I must have been talking about vdtui. vdtui has been pretty stable, even as VisiData has added a low-resolution pixel canvas (using Braille unicode characters) to draw graphs and maps. In fact, apart from a few bug fixes and small API changes, the only addition to vdtui in v0.98 is basic mouse support.

    Here's a list of what's new in VisiData v0.98:

    • visidata.org revamp

    • [canvas] graphs and maps!

      • . or g. 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 cursor
      • ENTER to push source sheet with only rows at canvas cursor
      • 1-9 to toggle display of 'layers' (colors)
      • _ to zoom out to full width
      • disp_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 of zt due to conflict with t for toggle
      • ga adds N new rows
      • gz= sets value for selected/all rows to a Python sequence in this column
      • z_ sets column width to given value
      • z- cuts column width in half
      • P 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 [email protected]#$ 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
    • 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 was aggr_null_filter)
      • --skiplines option renamed to --skip, and --headerlines to --header
    • 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

    Source code(tar.gz)
    Source code(zip)
  • v0.97.1(Oct 30, 2017)

    It's VisiData's 1st birthday! I started working on VisiData 1 year ago today (Oct 29).

    v0.97.1 has only a few small patches:

    • Fixed help manpage on OS/X (man has no --local-file option)
    • Fixed Postgres (incomplete lazy import)
    • Fixed ENTER on SheetsSheet on SheetsSheet to be no-op
    • Fixed readthedocs redirect to visidata.org
    Source code(tar.gz)
    Source code(zip)
  • v0.97(Oct 6, 2017)

    Important If you like VisiData, sign up for the newsletter: https://tinyletter.com/visidata


    • I'm hanging out in #visidata on freenode! Come by and say hi if you use VisiData. I'd love to know how you're using it!

    • r/visidata (on reddit) is the forum for longer-form discussion.

    • See the new webpage at visidata.org! We migrated away from RTD, as it was too much hassle and limited our functionality.

    • We have some example tours generated from our automated tests. See visidata.org/tour. More will be coming with the next release!

    v0.97 has been released

    The main themes for this release are:

    1. commandlog replay fully operational (now running both automated tests and generating tours)
    2. a quick ref guide in man page format (available in visidata via F1, and also online at visidata.org/man)
    3. visidata.org is now the primary home page (we've transitioned away from readthedocs)

    There are also the usual suspects: new loaders, new commands, new options, and too many improvements and bugfixes to name. It is getting ever easier to write a new command or loader in a few minutes and have it just work.

    With this release, VisiData is feature complete. There will still be many reworkings, interface changes, added commands, tweaks, embellishments, arguments, and explanations, but as far as I can see, all of the functionality is now there. We are inching ever closer to a v1.0 that will hopefully stand the test of time.

    The main goals for the next release (v0.98) are 1) a set of great tours, and 2) documentation of the internal architecture: design decisions, implementation guidelines, and API references.

    Here are some more detailed descriptions of what comes with this release:

    New Loaders

    • simple remote postgres loader (vd postgres://user:[email protected]:6254/database)

    • fixed width column detection (ls -al | vd -f fixed --skiplines 1)

    New Commands and Options

    • F1 launches man page quick ref (gF1 now opens the command sheet)

    • vd --diff A B shows B with changes from A in red

    • a Describe Sheet with 'I' shows basic stats for every column!

    • streamlined commandlog (previously called editlog) functionality

    • ^D to quickly save the current cmdlog; vd -p cmdlog-1.vd to replay it

    • removed movement commands (use --replay-movement to reinsert movements)

    • player piano with --delay (used to make the tours on the website)

    • advanced editing, can now make new sheets from whole cloth!

    • 'A' to add a new sheet with some number of columns

    • 'a' to add a new empty row

    • 'gz=' set this column in selected rows to values from a python list expression

    • 'Del'/gDel to clear a cell (set a value to None)

    • 'y' to yank/delete row; 'p' to paste

    • 'zy' to yank (copy) cell contents; 'zp' to paste ('gzp' to paste to all selected rows)

    • 'f' to fill null cells with the previous non-null value


    Source code(tar.gz)
    Source code(zip)
  • v0.93(Jul 31, 2017)

    • 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 Column statistics (options.col_stats still disabled by default)
    Source code(tar.gz)
    Source code(zip)
Saul Pwanson
Data, optimization, tools
Saul Pwanson
CLabel is a terminal-based cluster labeling tool that allows you to explore text data interactively and label clusters based on reviewing that data.

CLabel is a terminal-based cluster labeling tool that allows you to explore text data interactively and label clusters based on reviewing that

Peter Baumgartner 27 Oct 30, 2021
Interactive Redis: A Terminal Client for Redis with AutoCompletion and Syntax Highlighting.

Interactive Redis: A Cli for Redis with AutoCompletion and Syntax Highlighting. IRedis is a terminal client for redis with auto-completion and syntax

null 1.8k Apr 20, 2022
A Terminal Client for MySQL with AutoCompletion and Syntax Highlighting.

mycli A command line client for MySQL that can do auto-completion and syntax highlighting. HomePage: http://mycli.net Documentation: http://mycli.net/

dbcli 10.3k Apr 25, 2022
Random scripts and other bits for interacting with the SpaceX Starlink user terminal hardware

starlink-grpc-tools This repository has a handful of tools for interacting with the gRPC service implemented on the Starlink user terminal (AKA "the d

null 163 Apr 27, 2022
Rich is a Python library for rich text and beautiful formatting in the terminal.

The Rich API makes it easy to add color and style to terminal output. Rich can also render pretty tables, progress bars, markdown, syntax highlighted source code, tracebacks, and more — out of the box.

Will McGugan 36.7k Apr 24, 2022
Lets you view, edit and execute Jupyter Notebooks in the terminal.

Lets you view, edit and execute Jupyter Notebooks in the terminal.

David Brochart 573 Apr 15, 2022
Module for converting 2D Python lists to fancy ASCII tables. Table2Ascii lets you display pretty tables in the terminal and on Discord.

table2ascii Module for converting 2D Python lists to a fancy ASCII/Unicode tables table2ascii ?? Installation ??‍?? Usage Convert lists to ASCII table

Jonah Lawrence 21 Mar 13, 2022
A terminal UI dashboard to monitor requests for code review across Github and Gitlab repositories.

A terminal UI dashboard to monitor requests for code review across Github and Gitlab repositories.

Kyle Harrison 145 Apr 24, 2022
This CLI give the possibility to do a queries in Star Wars API and returns a JSON in a terminal.

Star Wars CLI (swcli) This CLI give the possibility to do a queries in Star Wars API and returns a JSON in a terminal. Install $ pip install swcli Qu

Pery Lemke 5 Nov 5, 2021
WA Terminal is a CLI application that allows us to login and send message with WhatsApp with a single command.

WA Terminal is a CLI application that allows us to login and send message with WhatsApp with a single command.

Aziz Fikri 15 Apr 15, 2022
A useful and easy to use Terminal Timer made with Python.

Terminal SpeedCubeTimer Installation ¡No requirements! Just Download and play Usage Starts timer.py and you will see this. python timer.py Scramble

Achalogy 3 Nov 19, 2021
A Tempmail Tool for Terminal and Termux.

A Tempmail Tool for Terminal and Termux.

MAO-COMMUNITY 6 Mar 20, 2022
CLTools provides various tools and command to use in the terminal.

CLTools provides various tools and command to use in the terminal. As of date, CLTools is only able to generate temporary email addresses and receive emails. There are plans to integrate more tools and options in the future.

Ashwin Chugh 2 Feb 14, 2022
Stream comments, submissions from subreddits and users across reddit right in your terminal

reddit_from_terminal stream comments, submissions from subreddits and users across reddit right in your terminal Alert! : Can't watch media contents(p

Pritam Dhara 2 Dec 30, 2021
Alacritty terminal used with Bash, Tmux, Vim, Mutt, Lynx, etc. and the many different additions added to each configuration file

Alacritty terminal used with Bash, Tmux, Vim, Mutt, Lynx, etc. and the many different additions added to each configuration file

Carter 19 Nov 11, 2021
A terminal application for managing images and artifacts in Azure Container Registry.

acr-browser acr-browser is a terminal-based user interface for managing container images and artifacts in Azure Container Registry. ?? This project ow

Sam Dobson 4 Feb 18, 2022
Tablicate - Python library for easy table creation and output to terminal

Tablicate Tablicate - Python library for easy table creation and output to terminal Features Column-wise justification alignment (left, right, center)

null 2 Mar 12, 2022
🌈 Lightweight Python package that makes it easy and fast to print terminal messages in colors. 🌈

?? Colorist for Python ?? Lightweight Python package that makes it easy and fast to print terminal messages in colors. Prerequisites Python 3.9 or hig

Jakob Bagterp 1 Feb 5, 2022
Python commandline tool for remembering linux/terminal commands

ehh Remember linux commands Commandline tool for remembering linux/terminal commands. It stores your favorite commands in ~/ehh.json in your homedir a

null 33 Apr 24, 2022