<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>VisiData Releases Feed</title>
  <subtitle></subtitle>
  <link href="https://visidata.org/releases.xml" rel="self"/>
  <link href="https://visidata.org/releases/"/>
  <updated>2021-12-16T00:00:00Z</updated>
  <id>https://visidata.org/releases/</id>
  <author>
    <name>Saul Pwanson</name>
    <email>vd@saul.pw</email>
  </author>
  
  <entry>
    <title>v2.8</title>
    <link href="https://visidata.org/blog/2021/v2.8/"/>
    <updated>2021-12-16T00:00:00Z</updated>
    <id>https://visidata.org/blog/2021/v2.8/</id>
    <content type="html">&lt;h2 id=&quot;v28-2021-12-16&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://visidata.org/blog/2021/v2.8/#v28-2021-12-16&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://github.com/saulpw/visidata/releases/tag/v2.8&quot;&gt;v2.8&lt;/a&gt; (2021-12-16)&lt;/h2&gt;
&lt;h3&gt;VisiData v2.8: Python 3.10 compatibility&lt;/h3&gt;
&lt;p&gt;This is a pretty small release of mostly bugfixes, which still has a few changes that merit a minor version bump.&lt;/p&gt;
&lt;p&gt;The all-stars of this release are &lt;a href=&quot;https://github.com/ajkerrigan&quot;&gt;@ajkerrigan&lt;/a&gt; and &lt;a href=&quot;https://github.com/geekscrapy&quot;&gt;@geekscrapy&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;@ajkerrigan &lt;a href=&quot;https://github.com/saulpw/visidata/issues/1227&quot;&gt;found, debugged, and fixed a Python 3.10 compatibility bug&lt;/a&gt;. Before v2.8, you could see many warnings related to &lt;code&gt;COLOR-1&lt;/code&gt; in the status message.&lt;/p&gt;
&lt;p&gt;@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.&lt;/p&gt;
&lt;p&gt;Happy holidays!&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>v2.7.1</title>
    <link href="https://visidata.org/blog/2021/v2.7.1/"/>
    <updated>2021-11-15T00:00:00Z</updated>
    <id>https://visidata.org/blog/2021/v2.7.1/</id>
    <content type="html">&lt;h2 id=&quot;271-2021-11-15&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://visidata.org/blog/2021/v2.7.1/#271-2021-11-15&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://github.com/saulpw/visidata/releases/tag/v2.7.1&quot;&gt;2.7.1&lt;/a&gt; (2021-11-15)&lt;/h2&gt;
&lt;h3&gt;VisiData v2.7.1: hotfix&lt;/h3&gt;
&lt;p&gt;The ever-vigilant @geekscrapy found a bug with Enter on the helpmenu &lt;a href=&quot;https://github.com/saulpw/visidata/issues/1196&quot;&gt;#1196&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This is a small enough fix for a very important feature.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>v2.7</title>
    <link href="https://visidata.org/blog/2021/v2.7/"/>
    <updated>2021-11-14T00:00:00Z</updated>
    <id>https://visidata.org/blog/2021/v2.7/</id>
    <content type="html">&lt;h2 id=&quot;v27-2021-11-14&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://visidata.org/blog/2021/v2.7/#v27-2021-11-14&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://github.com/saulpw/visidata/releases/tag/v2.7&quot;&gt;v2.7&lt;/a&gt; (2021-11-14)&lt;/h2&gt;
&lt;h3&gt;VisiData v2.7: new loaders - odf and lsv&lt;/h3&gt;
&lt;p&gt;A bunch of improvements, bugfixes, and a couple of new loaders.&lt;/p&gt;
&lt;h3&gt;Improvements&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;[movement] bind Home/End to go-top/go-bottom (thanks @geekscrapy &lt;a href=&quot;https://github.com/saulpw/visidata/issues/1161&quot;&gt;#1161&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[api] add vd.urlcache as alias for urlcache global (thanks @geekscrapy for PR &lt;a href=&quot;https://github.com/saulpw/visidata/issues/1164&quot;&gt;#1164&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;[plugins] do not continue installation if main package fails pip install (thanks @geekscrapy for PR &lt;a href=&quot;https://github.com/saulpw/visidata/issues/1194&quot;&gt;#1194&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;[plugins] allow for plugin records without SHA256; warn if absent (thanks @geekscrapy for PR &lt;a href=&quot;https://github.com/saulpw/visidata/issues/1183&quot;&gt;#1183&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;[load_lazy] do not load subsheets, if sheet.options.load_lazy is True (thanks @geekscrapy for PR &lt;a href=&quot;https://github.com/saulpw/visidata/issues/1193&quot;&gt;#1193&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;[save] confirm when save_foo function does not exist and saver fallsback to options.save_filetype (reported by @geekscrapy &lt;a href=&quot;https://github.com/saulpw/visidata/issues/1180&quot;&gt;#1180&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;[save] options.save_filetype default now &#39;tsv&#39;&lt;/li&gt;
&lt;li&gt;several cosmetic improvements&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Loaders&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;[lsv] add &lt;code&gt;lsv&lt;/code&gt; filetype for simple awk-like records (requested by @fourjay &lt;a href=&quot;https://github.com/saulpw/visidata/issues/1179&quot;&gt;#1179&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;[ods] add &lt;code&gt;odf&lt;/code&gt; filetype for Open Document Format spreadsheets&lt;/li&gt;
&lt;li&gt;[xlsx] add extra columns (&lt;code&gt;cellobject&lt;/code&gt;, &lt;code&gt;fontcolor&lt;/code&gt;, &lt;code&gt;fillcolor&lt;/code&gt;) if &lt;code&gt;options.xlsx_meta_columns&lt;/code&gt; (default False) (thanks @hoclun-rigsep for PR &lt;a href=&quot;https://github.com/saulpw/visidata/issues/1098&quot;&gt;#1098&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;[sqlite] allow query/insert (no modify/delete yet) for &lt;code&gt;WITHOUT ROWID&lt;/code&gt; tables (requested by @stephancb &lt;a href=&quot;https://github.com/saulpw/visidata/issues/1111&quot;&gt;#1111&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Bugfixes&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;[savers compression formats] fix corruption when saving to compression formats (&lt;a href=&quot;https://github.com/saulpw/visidata/issues/1159&quot;&gt;#1159&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;fix &amp;quot;ModuleNotFoundError: no module named &#39;plugins&#39;&amp;quot; error on startup (&lt;a href=&quot;https://github.com/saulpw/visidata/issues/1131&quot;&gt;#1131&lt;/a&gt; &lt;a href=&quot;https://github.com/saulpw/visidata/issues/1152&quot;&gt;#1152&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;[windows] fix issue with Enter key on Windows (reported by @hossam-houssien &lt;a href=&quot;https://github.com/saulpw/visidata/issues/1154&quot;&gt;#1154&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;[draw] fix multiline rows by making height fixed for all rows (reported by @geekscrapy &lt;a href=&quot;https://github.com/saulpw/visidata/issues/916&quot;&gt;#916&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;[DirSheet] fix bug where fix key column sheets (e.g. DirSheet, SqliteIndexSheet) keycols were not being saved in batchmode (reported by @geekscrapy &lt;a href=&quot;https://github.com/saulpw/visidata/issues/1181&quot;&gt;#1181&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;[async] make sure all threads started on sheet are cancelable (reported by @geekscrapy &lt;a href=&quot;https://github.com/saulpw/visidata/issues/1136&quot;&gt;#1136&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;[AttrDict] fix bug with setting value on nested AttrDict&lt;/li&gt;
&lt;li&gt;[dup-X-deep] fix error with async_deepcopy (thanks @pstuifzand for fix)&lt;/li&gt;
&lt;li&gt;[join] fix &#39;inconsistent-keys&#39; issue when joining between XlsxSheet with typed columns and CsvSheet with untyped columns (reported by @davidwales &lt;a href=&quot;https://github.com/saulpw/visidata/issues/1124&quot;&gt;#1124&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;[sqlite] handle sqlite column names with spaces (thanks @davidskeck for PR &lt;a href=&quot;https://github.com/saulpw/visidata/issues/1157&quot;&gt;#1157&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;[sqlite] use &lt;code&gt;options.encoding&lt;/code&gt; and &lt;code&gt;options.encoding_errors&lt;/code&gt; for decoding of sqlite db text (reported by @WesleyAC &lt;a href=&quot;https://github.com/saulpw/visidata/issues/1156&quot;&gt;#1156&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;[xlsx] add handling for EmptyCell instances (thanks @hoclun-rigsep for PR &lt;a href=&quot;https://github.com/saulpw/visidata/issues/1121&quot;&gt;#1121&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;[xlsx] gate sheet name cleaning on &lt;code&gt;options.clean_names&lt;/code&gt; (reported by @davidwales &lt;a href=&quot;https://github.com/saulpw/visidata/issues/1122&quot;&gt;#1122&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;[macos] fix bindings for &lt;code&gt;Option&lt;/code&gt;+key&lt;/li&gt;
&lt;li&gt;[random-rows] fix import (reported by @geekscrapy &lt;a href=&quot;https://github.com/saulpw/visidata/issues/1162&quot;&gt;#1162&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;[save-selected] better default save filename (reported by @geekscrapy &lt;a href=&quot;https://github.com/saulpw/visidata/issues/1180&quot;&gt;#1180&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;[save] fix bug where saving multiple sheets to a single non-embeddable format did not result in fail (reported by @geekscrapy &lt;a href=&quot;https://github.com/saulpw/visidata/issues/1180&quot;&gt;#1180&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;[slide] fix Shift slide-down and Shift slide-up with arrow keys (reported by @a-y-u-s-h &lt;a href=&quot;https://github.com/saulpw/visidata/issues/1137&quot;&gt;#1137&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;[replay] fix replay where &lt;code&gt;join-sheets&lt;/code&gt; operation hangs (reported by @agjohnson &lt;a href=&quot;https://github.com/saulpw/visidata/issues/1141&quot;&gt;#1141&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;[undo] no more KeyError when Undoing modifications (reported by @geekscrapy &lt;a href=&quot;https://github.com/saulpw/visidata/issues/1133&quot;&gt;#1133&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;[unfurl-col] fix unfurl-col on cells containing exceptions (reported by @jsvine &lt;a href=&quot;https://github.com/saulpw/visidata/issues/1171&quot;&gt;#1171&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Happy VisiDatin&#39;!&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>v2.6.1</title>
    <link href="https://visidata.org/blog/2021/v2.6.1/"/>
    <updated>2021-09-29T00:00:00Z</updated>
    <id>https://visidata.org/blog/2021/v2.6.1/</id>
    <content type="html">&lt;h2 id=&quot;v261-2021-09-28&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://visidata.org/blog/2021/v2.6.1/#v261-2021-09-28&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://github.com/saulpw/visidata/releases/tag/v2.6.1&quot;&gt;v2.6.1&lt;/a&gt; (2021-09-28)&lt;/h2&gt;
&lt;h3&gt;VisiData v2.6.1: minor bugfixes!&lt;/h3&gt;
&lt;p&gt;In preparation for the &lt;a href=&quot;https://thestrangeloop.com/2021/introduction-to-visidata.html&quot;&gt;VisiData workshop at Strangeloop 2021&lt;/a&gt;, this patch was released with several minor bugfixes.&lt;/p&gt;
&lt;p&gt;Features with fixes include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/saulpw/visidata/issues/1116&quot;&gt;sysopen-row&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/saulpw/visidata/issues/1123&quot;&gt;fixed-format saver&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;DirSheet&#39;s copy-files&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/saulpw/visidata/issues/1125&quot;&gt;sqlite loader&#39;s exception handling&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;On top of this, we have updated the &lt;a href=&quot;https://github.com/visidata/homebrew-vd&quot;&gt;homebrew&lt;/a&gt; and &lt;a href=&quot;https://github.com/visidata/deb-vd&quot;&gt;personal debian&lt;/a&gt; repositories to contain the most recent version of VisiData.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Happy VisiDating!&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>v2.6</title>
    <link href="https://visidata.org/blog/2021/v2.6/"/>
    <updated>2021-09-19T00:00:00Z</updated>
    <id>https://visidata.org/blog/2021/v2.6/</id>
    <content type="html">&lt;h2 id=&quot;v26-2021-09-19&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://visidata.org/blog/2021/v2.6/#v26-2021-09-19&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://github.com/saulpw/visidata/releases/tag/v2.6&quot;&gt;v2.6&lt;/a&gt; (2021-09-19)&lt;/h2&gt;
&lt;h3&gt;VisiData v2.6: now with menus!&lt;/h3&gt;
&lt;p&gt;This release introduces a new[0] hierachical menu system for discovering and executing commands.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://visidata.org/blog/assets/2021-menu.png&quot; alt=&quot;menu&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Press Ctrl+H to open the help menu, arrows and Enter to move around.  Or use the mouse.&lt;/p&gt;
&lt;p&gt;Here&#39;s a &lt;a href=&quot;https://www.youtube.com/watch?v=QixtGeSbSLU&quot;&gt;video demo of this new menu system&lt;/a&gt;, including a sample workflow within VisiData for finding which commands aren&#39;t in the menu (using the mouse almost entirely).&lt;/p&gt;
&lt;p&gt;Also in this release are several performance improvements, feature enhancements, and bugfixes.  See the &lt;a href=&quot;https://github.com/saulpw/visidata/blob/v2.6/CHANGELOG.md&quot;&gt;CHANGELOG&lt;/a&gt; for full details.&lt;/p&gt;
&lt;p&gt;[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&#39;t feeling right.&lt;/p&gt;
&lt;hr /&gt;
</content>
  </entry>
  
  <entry>
    <title>v2.5</title>
    <link href="https://visidata.org/blog/2021/v2.5/"/>
    <updated>2021-07-08T00:00:00Z</updated>
    <id>https://visidata.org/blog/2021/v2.5/</id>
    <content type="html">&lt;h2 id=&quot;v25-2021-07-08&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://visidata.org/blog/2021/v2.5/#v25-2021-07-08&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://github.com/saulpw/visidata/releases/tag/v2.5&quot;&gt;v2.5&lt;/a&gt; (2021-07-08)&lt;/h2&gt;
&lt;p&gt;First off, some non-technical notices:&lt;/p&gt;
&lt;p&gt;Since 2017 when VisiData was started, I&#39;ve created a number of plugins and tools that take advantage of the VisiData &amp;quot;platform&amp;quot;.
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 &amp;quot;mono-repo&amp;quot;.
But they never really got integrated, because they didn&#39;t feel right either: some of them were wild experiments, some I don&#39;t want to release as open source, some I don&#39;t want to provide the level of support for, and some simply don&#39;t belong in the visidata repo (like galcon).&lt;/p&gt;
&lt;p&gt;So now I&#39;m migrating towards a &amp;quot;duo-repo&amp;quot; approach.
The saulpw/visidata repo can remain focused on providing a reliable and flexible platform, and a separate repo, &amp;quot;vdplus&amp;quot;, 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.)&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Finally, our IRC channel has moved from Freenode to libera.chat; come visit us on the new #visidata!&lt;/p&gt;
&lt;p&gt;And now for the actual software changes:&lt;/p&gt;
&lt;h2 id=&quot;interface-changes&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://visidata.org/blog/2021/v2.5/#interface-changes&quot;&gt;&lt;/a&gt;Interface Changes&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;quitguard ux improvement&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;[quitguard] confirm quit/reload only if sheet modified (references #955, #844, #483; thanks @jvns, @frosencrantz)&lt;/li&gt;
&lt;li&gt;not enabled by default yet&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[quit] add Shift+Q/quit-sheet-free to quit and free associated memory (thanks @cwarden)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;New major keybinding!&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;x&lt;/code&gt; is now &amp;quot;cut&amp;quot; (copy and delete), like in vim.&lt;/li&gt;
&lt;li&gt;In v2.3 the &lt;code&gt;d&lt;/code&gt;elete family was changed to delete without copying to the clipboard (previously it acted like &amp;quot;cut&amp;quot;).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[options] save to foo.visidatarc from OptionsSheet (thanks @njthomas #958)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;note that you can&#39;t save directly to &lt;code&gt;.visidatarc&lt;/code&gt; (call it a security feature).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;minor-improvements&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://visidata.org/blog/2021/v2.5/#minor-improvements&quot;&gt;&lt;/a&gt;Minor Improvements&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[splitwin] push sheet in empty pane iff splitwin&lt;/li&gt;
&lt;li&gt;[movement] bind &lt;code&gt;Ctrl+Left/Right&lt;/code&gt; to &lt;code&gt;go-left&lt;/code&gt;/&lt;code&gt;right-page&lt;/code&gt; (thanks @davidwales #1002)&lt;/li&gt;
&lt;li&gt;[unfurl] add &lt;code&gt;options.unfurl_empty&lt;/code&gt; to include row for empty list/dict (thanks @frosencrantz #898)&lt;/li&gt;
&lt;li&gt;[regex expand] deprecate &lt;code&gt;expand_col_scanrows&lt;/code&gt;; standardize on &lt;code&gt;options.default_sample_size&lt;/code&gt; (thanks @jsvine)&lt;/li&gt;
&lt;li&gt;[canvas] add &lt;code&gt;options.disp_canvas_charset&lt;/code&gt; to change displayed chars (thanks @albert-ying #963)
&lt;ul&gt;
&lt;li&gt;@albert-ying convinced me to make the canvas character set configurable.  With &lt;code&gt;options.disp_canvas_charset = &#39; o&#39;&lt;/code&gt;, 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).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;[join] extend join columns now writable (and correct)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;loader-specific-improvements&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://visidata.org/blog/2021/v2.5/#loader-specific-improvements&quot;&gt;&lt;/a&gt;Loader-specific Improvements&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[sqlite] rename or drop tables from the sqlite index sheet (&lt;code&gt;e&lt;/code&gt;dit the name or &lt;code&gt;d&lt;/code&gt;elete the row and then &lt;code&gt;z Ctrl+S&lt;/code&gt; to commit as usual)&lt;/li&gt;
&lt;li&gt;[DirSheet] add y/gy to copy file(s) to given directory&lt;/li&gt;
&lt;li&gt;[zstd] support loading zstd-compressed files (thanks @lxcode #971)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;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&lt;/p&gt;
&lt;p&gt;See the &lt;a href=&quot;https://github.com/saulpw/visidata/blob/v2.5/CHANGELOG.md&quot;&gt;CHANGELOG&lt;/a&gt; for a comprehensive list of bugfixes and changes.&lt;/p&gt;
&lt;hr /&gt;
</content>
  </entry>
  
  <entry>
    <title>v2.4</title>
    <link href="https://visidata.org/blog/2021/v2.4/"/>
    <updated>2021-04-11T00:00:00Z</updated>
    <id>https://visidata.org/blog/2021/v2.4/</id>
    <content type="html">&lt;h2 id=&quot;v24-2021-04-11&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://visidata.org/blog/2021/v2.4/#v24-2021-04-11&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://github.com/saulpw/visidata/releases/tag/v2.4&quot;&gt;v2.4&lt;/a&gt; (2021-04-11)&lt;/h2&gt;
&lt;p&gt;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 &lt;code&gt;options.use_default_colors&lt;/code&gt; 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.&lt;/p&gt;
&lt;h2 id=&quot;improvements&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://visidata.org/blog/2021/v2.4/#improvements&quot;&gt;&lt;/a&gt;Improvements&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;[color] remove &lt;code&gt;options.use_default_colors&lt;/code&gt; (thanks @lxcode #939)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;options.color_default&lt;/code&gt; can now have both fg and bg&lt;/li&gt;
&lt;li&gt;other color options which do not specify fg or bg will use the missing component from &lt;code&gt;color_default&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;to use terminal default colors, set &lt;code&gt;options.color_default=&amp;quot;&amp;quot;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[splitwindow] stabilize sheet stack associations&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Shift+Z&lt;/code&gt; pushes &#39;under sheet&#39; (if any) onto other stack&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Shift+Z&lt;/code&gt; does not swap panes anymore&lt;/li&gt;
&lt;li&gt;&lt;code&gt;g Tab&lt;/code&gt; changes which stack is in the top vs bottom panes&lt;/li&gt;
&lt;li&gt;&lt;code&gt;options.disp_splitwin_pct&lt;/code&gt; cannot be sheet-specific&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[status] show nSelectedRows on rstatus&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;bugfixes&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://visidata.org/blog/2021/v2.4/#bugfixes&quot;&gt;&lt;/a&gt;Bugfixes&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[pyobj-show-hidden] grab visibility lvl from sheet specific option (thanks @frosencrantz #947)&lt;/li&gt;
&lt;li&gt;[splitwin] prevent flickering-on-full-window&lt;/li&gt;
&lt;li&gt;[splitwin] if top sheet quit, keep bottom sheet in bottom pane&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Loader specific bugfixes&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;[gzip] fix progress bar when opening gzip (thanks @geekscrapy #925)&lt;/li&gt;
&lt;li&gt;[http] fix loading files from url without specifying filetype&lt;/li&gt;
&lt;li&gt;[sqlite] use &lt;code&gt;TABLE_XINFO&lt;/code&gt; for hidden/virtual columns (thanks @dotcs #945)&lt;/li&gt;
&lt;li&gt;[sqlite] reload perf: load without pre-counting rows (which required 2nd full table scan)&lt;/li&gt;
&lt;li&gt;[vds] save typed values instead of formatted display values (thanks @frosencrantz #885)&lt;/li&gt;
&lt;li&gt;[xlsx] stringify &amp;quot;header&amp;quot; row values for column names (thanks @davidwales #921)&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  
  <entry>
    <title>v2.3</title>
    <link href="https://visidata.org/blog/2021/v2.3/"/>
    <updated>2021-04-04T00:00:00Z</updated>
    <id>https://visidata.org/blog/2021/v2.3/</id>
    <content type="html">&lt;h2 id=&quot;v23-2021-04-04&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://visidata.org/blog/2021/v2.3/#v23-2021-04-04&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://github.com/saulpw/visidata/releases/tag/v2.3&quot;&gt;v2.3&lt;/a&gt; (2021-04-04)&lt;/h2&gt;
&lt;p&gt;This release adds a memory sheet and improves on several other features.  Major changes are listed below.   Please see the &lt;a href=&quot;https://github.com/saulpw/visidata/blob/stable/CHANGELOG.md#v2.3&quot;&gt;CHANGELOG&lt;/a&gt; for the full list of changes.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Memory sheet, for recording values usable in expressions.  View the memory sheet with &lt;code&gt;open-memory&lt;/code&gt; (&lt;code&gt;Alt+Shift+M&lt;/code&gt;), add current cell with &lt;code&gt;Alt+M&lt;/code&gt;, add single aggregated value with &lt;code&gt;z+&lt;/code&gt;.  Also reference the current clipboard value as &lt;code&gt;clipval&lt;/code&gt;.  #912&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;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 &lt;code&gt;Shift+Z&lt;/code&gt; (same command as invoking splitpane in the first place).  &lt;code&gt;Ctrl+^&lt;/code&gt; swaps sheets in the current pane.  See the &lt;code&gt;pane&lt;/code&gt; column on the Sheets Sheet (pane 0 means &amp;quot;not on any sheet stack&amp;quot;, i.e. it&#39;s been quit). #894&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Colors now may have a background color in addition to the fg color and attributes.  Add e.g. &amp;quot;&lt;strong&gt;on blue&lt;/strong&gt;&amp;quot; or &amp;quot;&lt;strong&gt;on 214&lt;/strong&gt;&amp;quot; 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 &lt;code&gt;darkdraw&lt;/code&gt; plugin.) #435&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;minor additions&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;new command: &lt;code&gt;jump-first&lt;/code&gt; (bound to &lt;code&gt;g Ctrl+^&lt;/code&gt;) to push the bottom sheet (used repeatedly will cycle through sheets in the current pane).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Ctrl+X&lt;/code&gt; within &lt;code&gt;Ctrl+X&lt;/code&gt; (&lt;code&gt;pyobj-expr&lt;/code&gt;) drops into a Python REPL.&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start=&quot;5&quot;&gt;
&lt;li&gt;changes to options and commands&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;options.use_default_colors&lt;/code&gt; now defaults to &lt;code&gt;True&lt;/code&gt; (was &lt;code&gt;False&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;delete&lt;/code&gt; commands no longer move deleted values to clipboard #895&lt;/li&gt;
&lt;li&gt;&lt;code&gt;zd&lt;/code&gt; and &lt;code&gt;gzd&lt;/code&gt; (&lt;code&gt;delete-cells&lt;/code&gt;) set the value to &lt;code&gt;options.null_value&lt;/code&gt; instead of always using &lt;code&gt;None&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  
  <entry>
    <title>v2.2</title>
    <link href="https://visidata.org/blog/2021/v2.2/"/>
    <updated>2021-01-30T00:00:00Z</updated>
    <id>https://visidata.org/blog/2021/v2.2/</id>
    <content type="html">&lt;h2 id=&quot;v22-2021-01-30&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://visidata.org/blog/2021/v2.2/#v22-2021-01-30&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://github.com/saulpw/visidata/releases/tag/v2.2&quot;&gt;v2.2&lt;/a&gt; (2021-01-30)&lt;/h2&gt;
&lt;p&gt;This release adds new features and changes some existing behavior.
Please see the &lt;a href=&quot;https://github.com/saulpw/visidata/blob/stable/CHANGELOG.md#v2.2&quot;&gt;CHANGELOG&lt;/a&gt; for the complete list of changes and bugfixes.&lt;/p&gt;
&lt;p&gt;VisiData v2.2 has been successfully packaged for Debian, and is slated to be part of the bullseye distribution.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The interpretation of &amp;quot;global&amp;quot; vs. &amp;quot;sheet-specific&amp;quot; CLI options has changed.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;In v2.0 and v2.1, options given on the command-line were &amp;quot;sheet-specific&amp;quot; and only applied to files on the command-line, and &lt;code&gt;-g&lt;/code&gt; (&lt;code&gt;--global&lt;/code&gt;) had to be specified to make them apply to sheets created after launch.
Now, options are &amp;quot;global&amp;quot; by default (affecting all sheets which don&#39;t have a sheet-specific override), and &lt;code&gt;-n&lt;/code&gt; indicates that subsequent CLI options are sheet-specific.
The &lt;code&gt;-g&lt;/code&gt; option is now basically a no-op (though it can be given after &lt;code&gt;-n&lt;/code&gt; (&lt;code&gt;--nonglobal&lt;/code&gt;) 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.&lt;/p&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;New feature: persistent input history&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;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:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;options.input_history=&#39;previnputs&#39;
&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;New type: &lt;code&gt;floatlocale&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The VisiData &lt;code&gt;float&lt;/code&gt; type uses the Python builtin &lt;code&gt;float&lt;/code&gt;, which only parses numbers in &amp;quot;international&amp;quot; notation.
To parse locale-specific numbers (which use e.g. a decimal comma instead of a decimal point), there is now the &lt;code&gt;floatlocale&lt;/code&gt; type, which parses numbers based on the &lt;code&gt;LC_NUMERIC&lt;/code&gt; 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 &lt;code&gt;float&lt;/code&gt; type.
The &lt;code&gt;type-floatlocale&lt;/code&gt; and &lt;code&gt;type-floatlocale-selected&lt;/code&gt; (on ColumnsSheet) commands were added without keybindings; users who need this functionality will probably want to add the following to their visidatarc:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;bindkey(&#39;%&#39;, &#39;type-floatlocale&#39;)
bindkey(&#39;g%&#39;, &#39;type-floatlocale-selected&#39;)
&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;4&quot;&gt;
&lt;li&gt;Option change: Fancy Chooser now disabled by default&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The &amp;quot;fancy chooser&amp;quot;, 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 &lt;code&gt;Ctrl+X&lt;/code&gt;.
If the fancy chooser is preferred by default, set &lt;code&gt;options.fancy_chooser=True&lt;/code&gt;.&lt;/p&gt;
&lt;ol start=&quot;5&quot;&gt;
&lt;li&gt;New format: .vds (VisiData Sheet)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This new single-file format can store typed data and column information from multiple sheets.
Use &lt;code&gt;g Ctrl+S&lt;/code&gt; (&lt;code&gt;save-all&lt;/code&gt; or &lt;code&gt;save-selected&lt;/code&gt;) 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!&lt;/p&gt;
&lt;ol start=&quot;6&quot;&gt;
&lt;li&gt;New loader (and saver): geojson&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Thanks @dracos for PR #876 implementing geojson loading and saving!&lt;/p&gt;
&lt;ol start=&quot;7&quot;&gt;
&lt;li&gt;Several other improvements and bugfixes&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;On February 7th, a patch, v2.2.1, was shipped.&lt;/p&gt;
&lt;p&gt;It contains two bugfixes for &lt;code&gt;setcol-fill&lt;/code&gt; (see &lt;a href=&quot;https://github.com/saulpw/visidata/issues/884&quot;&gt;issue #884&lt;/a&gt;, and a typo fix in the man page.&lt;/p&gt;
&lt;p&gt;Additionally, there is now a packaged &lt;code&gt;visidata.1&lt;/code&gt;, so that &lt;code&gt;man visidata&lt;/code&gt; will also bring up the VisiData manpage, when the manpage is successfully installed.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>v2.1.1</title>
    <link href="https://visidata.org/blog/2021/v2.1.1/"/>
    <updated>2021-01-03T00:00:00Z</updated>
    <id>https://visidata.org/blog/2021/v2.1.1/</id>
    <content type="html">&lt;h2 id=&quot;v211-2021-01-03&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://visidata.org/blog/2021/v2.1.1/#v211-2021-01-03&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://github.com/saulpw/visidata/releases/tag/v2.1.1&quot;&gt;v2.1.1&lt;/a&gt; (2021-01-03)&lt;/h2&gt;
&lt;p&gt;This release may be a small one, but it contains a handful of meaningful bugfixes that we wanted to get out the door.&lt;/p&gt;
&lt;p&gt;Happy New Year, everyone!&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;[macros] allow macro interfaces to be longnames (thanks @frosencrantz #787)&lt;/li&gt;
&lt;li&gt;[save] better default save filename for url sheets (thanks @geekscrapy #824)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Bugfixes&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;[cmdlog] record column, sheet, and row info for open-cell&lt;/li&gt;
&lt;li&gt;[cmdlog] catch case of &#39;override&#39; sheet for set-option&lt;/li&gt;
&lt;li&gt;[expr-col] &lt;code&gt;curcol&lt;/code&gt; now works for multiple invocations (thanks @geekscrapy #659)&lt;/li&gt;
&lt;li&gt;[loaders postgres] account for postgres_schema when rendering Postgres tables (thanks @jdormit for PR #852)&lt;/li&gt;
&lt;li&gt;[loaders url] fail unknown URL scheme (thanks @geekscrapy for PR #84)&lt;/li&gt;
&lt;li&gt;[pyobj] fix Pyobj Sheets for lists (thanks @brookskindle #843)&lt;/li&gt;
&lt;li&gt;[pipe] handle broken pipes gracefully (thanks @robdmc #851)&lt;/li&gt;
&lt;li&gt;[scroll] fix issue with jagged scrolling down (thanks @uoee #832)&lt;/li&gt;
&lt;li&gt;[sort] fix bug where total progress in sorting is (100 * # of columns to sort) (thanks @cwarden)&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  
  <entry>
    <title>v2.1</title>
    <link href="https://visidata.org/blog/2020/v2.1/"/>
    <updated>2020-12-06T00:00:00Z</updated>
    <id>https://visidata.org/blog/2020/v2.1/</id>
    <content type="html">&lt;h2 id=&quot;v21-2020-12-06&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://visidata.org/blog/2020/v2.1/#v21-2020-12-06&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://github.com/saulpw/visidata/releases/tag/v2.1&quot;&gt;v2.1&lt;/a&gt; (2020-12-06)&lt;/h2&gt;
&lt;p&gt;This release fixes several bugs in 2.0 and fills in some of the gaps.
Please see the &lt;a href=&quot;https://github.com/saulpw/visidata/blob/stable/CHANGELOG.md#v2.1&quot;&gt;CHANGELOG&lt;/a&gt; for the complete list of changes and bugfixes.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;options.some_selected_rows&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Some commands, like &lt;code&gt;setcol-expr&lt;/code&gt; (&lt;code&gt;g=&lt;/code&gt;) 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&#39;s reasonably easy to work around: select all rows with &lt;code&gt;gs&lt;/code&gt;, repeat the command, and maybe unselect them all with &lt;code&gt;gu&lt;/code&gt;.
But this turned out to be ultimately disappointing for interactive use.&lt;/p&gt;
&lt;p&gt;So, in 2.1, there is now an option &lt;code&gt;some_selected_rows&lt;/code&gt;, which if True, causes these commands to operate on all rows, if none are selected:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;`setcol-expr` (`g=`)
`setcol-iter` (`gz=`)
`setcol-subst` (`g*`)
`setcol-subst-all` (`gz*`)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;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&#39;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.&lt;/p&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;&lt;code&gt;options.numeric_binning&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;For 2.0, ranged binning of numeric columns was implemented, and allowed to be disabled by setting &lt;code&gt;options.numeric_binning&lt;/code&gt; to False.
(By default it was set to True.)&lt;/p&gt;
&lt;p&gt;In 2.1, this option is now disabled by default, and must be enabled (whether globally or per-sheet) by setting it to True.&lt;/p&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;[input] Shift+Arrow within &lt;code&gt;edit-cell&lt;/code&gt; to move cursor and re-enter edit mode&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;This feature obsoletes &lt;code&gt;options.cmd_after_edit&lt;/code&gt;, which was always a terrible hack.  It has no effect now.&lt;/p&gt;
&lt;ol start=&quot;4&quot;&gt;
&lt;li&gt;Expression can access column attributes&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;In 2.0, expressions could use attributes on the &lt;code&gt;vd&lt;/code&gt; singleton or the current &lt;code&gt;sheet&lt;/code&gt; object, and had &lt;code&gt;sheet&lt;/code&gt; and &lt;code&gt;row&lt;/code&gt; special variables to refer to the sheet and row objects themselves.&lt;/p&gt;
&lt;p&gt;In 2.1, expressions can also use attributes of the expression column, and &lt;code&gt;col&lt;/code&gt; can be used to refer to the column object directly.
(So &lt;code&gt;col.width&lt;/code&gt; and &lt;code&gt;width&lt;/code&gt; both refer to the width of the expression column itself, if there are no columns named &lt;code&gt;width&lt;/code&gt;.)&lt;/p&gt;
&lt;ol start=&quot;5&quot;&gt;
&lt;li&gt;Differentiate &lt;code&gt;select-equal-&lt;/code&gt; and &lt;code&gt;select-exact-&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Previously,  &lt;code&gt;select-equal-&lt;/code&gt; (bound to &lt;code&gt;,&lt;/code&gt;) matched on the &lt;strong&gt;typed value&lt;/strong&gt;.
Now, &lt;code&gt;select-equal-&lt;/code&gt; matches on the &lt;strong&gt;displayed value&lt;/strong&gt;.
New commands &lt;code&gt;select-exact-cell&lt;/code&gt;/&lt;code&gt;-row&lt;/code&gt; that match on &lt;strong&gt;typed value&lt;/strong&gt; are bound to &lt;code&gt;z,&lt;/code&gt; and &lt;code&gt;gz,&lt;/code&gt; (the display value may be rounded or formatted with less precision, so using the
typed value is &amp;quot;more precise&amp;quot;.&lt;/p&gt;
&lt;p&gt;(Thanks @geekscrapy for noticing)&lt;/p&gt;
&lt;ol start=&quot;6&quot;&gt;
&lt;li&gt;New macro system&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;A new command &lt;code&gt;macro-record&lt;/code&gt; (bound to &lt;code&gt;m&lt;/code&gt;) 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.&lt;/p&gt;
&lt;p&gt;The new command &lt;code&gt;macro-sheet&lt;/code&gt; (bound to &lt;code&gt;gm&lt;/code&gt;) opens an index of all current macros.  A macro on this sheet can be viewed with &lt;code&gt;Enter&lt;/code&gt; and then modified, saving changes with &lt;code&gt;Ctrl+S&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;This feature obsoletes the older iteration of macro system, and removes the deprecated &lt;code&gt;z Ctrl+D&lt;/code&gt; command.&lt;/p&gt;
&lt;p&gt;(Thanks @bob-u for the suggestion)&lt;/p&gt;
&lt;ol start=&quot;7&quot;&gt;
&lt;li&gt;Other Additions and Improvements&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;Add &lt;code&gt;mode&lt;/code&gt; and &lt;code&gt;stdev&lt;/code&gt; aggregators.&lt;/li&gt;
&lt;li&gt;Add sort-order indicator in column header.&lt;/li&gt;
&lt;li&gt;Unset options with &lt;code&gt;d&lt;/code&gt; on options sheet (also add &lt;code&gt;options.unset()&lt;/code&gt; API function).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.vdj&lt;/code&gt; scripts are now hashbangable.  Put &lt;code&gt;#!vd -p&lt;/code&gt; at the start of the .vdj file and watch it go!  (Note: extension must still be .vdj for now.)&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;floatsi&lt;/code&gt; type (&lt;code&gt;z%&lt;/code&gt;) can now parse SI strings like &amp;quot;2.3M&amp;quot; (thanks @anjakefala for sponsoring).&lt;/li&gt;
&lt;li&gt;Regex capture (&lt;code&gt;;&lt;/code&gt;) will use capture names as column names, if available (thanks @tsibley).&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start=&quot;8&quot;&gt;
&lt;li&gt;Format-specific improvements&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;[http] auto-paginate by continuing with the given &lt;code&gt;links.next.url&lt;/code&gt; from the response.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[json] 50% speedup for loading (thanks @lxcode).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[pdf] &lt;code&gt;options.pdf_tables&lt;/code&gt; to parse tables from pdf with &lt;code&gt;tabular&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[sqlite] Use internal rowid to update and delete rows (&lt;code&gt;WITHOUT ROWID&lt;/code&gt; sqlite tables can no longer be modified).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[zip] Add &lt;code&gt;extract-file&lt;/code&gt;, &lt;code&gt;extract-selected&lt;/code&gt;, &lt;code&gt;extract-file-to&lt;/code&gt;, &lt;code&gt;extract-selected-to&lt;/code&gt; commands (bound to &lt;code&gt;x&lt;/code&gt;, &lt;code&gt;gx&lt;/code&gt;, &lt;code&gt;zx&lt;/code&gt;, and &lt;code&gt;gzx&lt;/code&gt; on the ZipSheet).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[fixed] Add fixed-width saver (uses col.width).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[clickhouse] Add plugin for &lt;a href=&quot;https://visidata.org/blog/2020/v2.1/clickhouse.tech&quot;&gt;clickhouse&lt;/a&gt; loader.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  
  <entry>
    <title>v2.0</title>
    <link href="https://visidata.org/blog/2020/v2.0/"/>
    <updated>2020-10-14T00:00:00Z</updated>
    <id>https://visidata.org/blog/2020/v2.0/</id>
    <content type="html">&lt;h2 id=&quot;visidata-v20-2020-10-14&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://visidata.org/blog/2020/v2.0/#visidata-v20-2020-10-14&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://github.com/saulpw/visidata/releases/tag/v2.0.1&quot;&gt;VisiData v2.0&lt;/a&gt; (2020-10-14)&lt;/h2&gt;
&lt;p&gt;This is a major milestone.  After almost 2 years of development, version 2.0 of VisiData is finally released.  It&#39;s got several major improvements, a bunch of new loaders, and tons of new features and quality of life improvements.  And, most importantly, an API specification for plugins.&lt;/p&gt;
&lt;h2 id=&quot;1-licensing-changes&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://visidata.org/blog/2020/v2.0/#1-licensing-changes&quot;&gt;&lt;/a&gt;1. Licensing Changes&lt;/h2&gt;
&lt;p&gt;[tl;dr: no more MIT vdtui; GPL3 for everything]&lt;/p&gt;
&lt;p&gt;Previously, there was a core vdtui single-file library that I licensed as MIT, as I thought it might be a platform for a variety of apps like VisiData.  Approximately no one showed interest in that though, and it became unwieldy to maintain, so over the course of developing VisiData 2.0, the vdtui library was thoroughly dismantled.  It&#39;s now just the visidata module as a whole, which I&#39;m releasing under GPL3.  The last released version of vdtui.py under MIT was 1.5.2 if anyone wants to use that.&lt;/p&gt;
&lt;h2 id=&quot;2-plugin-api&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://visidata.org/blog/2020/v2.0/#2-plugin-api&quot;&gt;&lt;/a&gt;2. Plugin API&lt;/h2&gt;
&lt;p&gt;[tl;dr: &amp;quot;2.0&amp;quot; has a stable documented API; expect a growing ecosystem of plugins for a wide variety of use cases.]&lt;/p&gt;
&lt;p&gt;To be honest, this is what held off the 2.0 release for so long.  I knew I wanted to go through every function and decide whether I wanted to include it in the 2.0 API to be supported for the rest of the 2.x lifecycle, which might be years.  (We don&#39;t intend to strictly adhere to &amp;quot;semver&amp;quot;, but it&#39;s still important to try to maintain backwards compatibility within a major version number.)  So now, we have an API spec with over 200 functions, which will be of interest if you want to customize VisiData, or create a plugin for it, or just to know more about its internal components.&lt;/p&gt;
&lt;p&gt;Take a look at the actual API, at &lt;a href=&quot;https://visidata.org/docs/api&quot;&gt;visidata.org/docs/api&lt;/a&gt;.  It still needs a bit more polish, but the meat and bones are there.&lt;/p&gt;
&lt;h2 id=&quot;3-undo-and-redo&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://visidata.org/blog/2020/v2.0/#3-undo-and-redo&quot;&gt;&lt;/a&gt;3. Undo and Redo&lt;/h2&gt;
&lt;p&gt;This is a &amp;quot;game changer&amp;quot; according to @jsvine.&lt;/p&gt;
&lt;p&gt;Undo and redo, along with the new &lt;code&gt;guard-sheet&lt;/code&gt; command, make it much easier to rely on VisiData for data cleaning and data entry.&lt;/p&gt;
&lt;p&gt;If you upgrade to 2.0 and learn nothing else about it, your life will be better for knowing Shift+U (undo) and Shift+R (redo).&lt;/p&gt;
&lt;h2 id=&quot;4-deferred-modifications&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://visidata.org/blog/2020/v2.0/#4-deferred-modifications&quot;&gt;&lt;/a&gt;4. Deferred modifications&lt;/h2&gt;
&lt;p&gt;[tl;dr: if you add/edit/delete rows on a few specific sheets, the changes won&#39;t take place right away; you&#39;ll have to press z Ctrl+S]&lt;/p&gt;
&lt;p&gt;Certain sheets which know how to incrementally update their source--notably, the DirSheet and SqliteSheet--&lt;strong&gt;defer&lt;/strong&gt; changes made to them, requiring an explicit save/commit step with commit-sheet (z Ctrl+S).&lt;/p&gt;
&lt;p&gt;These changes are colorized on the screen and can be saved as data (or not saved, in the case of deletes) with save-sheet (Ctrl+S), even if they haven&#39;t been committed back to the original source with commit-sheet.&lt;/p&gt;
&lt;p&gt;This means vd can work quite naturally as an interactive file manager, or as a sqlite database editor.  I&#39;ve been using it to manage my mp3 collection and my personal contacts database, which was a tsv file until I wanted to add a multiline &amp;quot;notes&amp;quot; field, so I saved it as a .json file and used that for a few months, and now I&#39;ve been using it in an sqlite database.  Of course they all look the same in VisiData so I can go back and forth without any friction.&lt;/p&gt;
&lt;h2 id=&quot;5-split-window&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://visidata.org/blog/2020/v2.0/#5-split-window&quot;&gt;&lt;/a&gt;5. Split Window&lt;/h2&gt;
&lt;p&gt;Press Shift+Z to split the terminal window into a top panel and bottom panel.&lt;/p&gt;
&lt;p&gt;One panel contains the current/top sheet, the other panel contains the sheet &amp;quot;under&amp;quot; the top sheet.  Press Tab or Ctrl+^ to go between them.&lt;/p&gt;
&lt;p&gt;The fancy chooser (now the default for choosing aggregators or jointypes) uses this split window, and I have many other ideas for it as well.&lt;/p&gt;
&lt;p&gt;It may not seem like much now, but I predict that this becomes a sleeper hit.&lt;/p&gt;
&lt;p&gt;[previously blogged at: &lt;a href=&quot;https://visidata.org/blog/2020/splitwin&quot;&gt;visidata.org/blog/2020/splitwin&lt;/a&gt;)]&lt;/p&gt;
&lt;h2 id=&quot;6-so-many-other-features&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://visidata.org/blog/2020/v2.0/#6-so-many-other-features&quot;&gt;&lt;/a&gt;6. So many other features&lt;/h2&gt;
&lt;p&gt;Here&#39;s curated list of highlights, the ones that seemed like people would be interested to know about:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;more visibility for long values, with &amp;quot;v&amp;quot; to toggle multi-line rows and and z+hjkl to adjust cell offset&lt;/li&gt;
&lt;li&gt;[iota] the &amp;quot;i&amp;quot; family of commands to add an increment column&lt;/li&gt;
&lt;li&gt;[unfurl] zM, which does row-wise expansion of iterables in a column (very useful with nested data)&lt;/li&gt;
&lt;li&gt;[join] add &amp;quot;merge&amp;quot; jointype&lt;/li&gt;
&lt;li&gt;[numeric binning] ranged binning for numeric columns&lt;/li&gt;
&lt;li&gt;[cli] custom options parsing allows for per-sheet options&lt;/li&gt;
&lt;li&gt;[cli] pipe and redirect to stdout; use as an interactive chooser&lt;/li&gt;
&lt;li&gt;[input] Ctrl+Y paste from cell clipboard and other improvements&lt;/li&gt;
&lt;li&gt;Alt+ as new keyboard layer for user keybindings&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And, as with every release, there are a bunch of new loaders, including MIME, recutils, vcard, imap, mysql, pdf, npy/npz, and more!
See the new &lt;a href=&quot;https://visidata.org/formats&quot;&gt;/formats&lt;/a&gt; page for a full list of supported formats, in tidy tabular form.&lt;/p&gt;
&lt;p&gt;Then if you still haven&#39;t seen enough, you can see the &lt;a href=&quot;https://github.com/saulpw/visidata/blob/stable/CHANGELOG.md#v2.0&quot;&gt;CHANGELOG&lt;/a&gt; for the complete list of bugfixes and changes.&lt;/p&gt;
&lt;p&gt;Okay, that about wraps it up for this release.
If anything I&#39;ve written about here sounds interesting and you&#39;d like me to cover it first, or more in-depth, let me know!  Send me &lt;a href=&quot;https://visidata.org/blog/2020/v2.0/vd@saul.pw&quot;&gt;an email&lt;/a&gt;, or &lt;a href=&quot;https://visidata.org/blog/2020/v2.0/twitter.com/VisiData&quot;&gt;tweet @VisiData&lt;/a&gt;, or &lt;a href=&quot;https://visidata.org/blog/2020/v2.0/github.com/saulpw/visidata/issues&quot;&gt;open a github issue&lt;/a&gt;, or chat with us on Freenode #visidata; however you want to get in touch, we&#39;d love to hear from you.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>v1.5.2</title>
    <link href="https://visidata.org/blog/2019/v1.5.2/"/>
    <updated>2019-01-12T00:00:00Z</updated>
    <id>https://visidata.org/blog/2019/v1.5.2/</id>
    <content type="html">&lt;h2 id=&quot;v152-2019-01-12&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://visidata.org/blog/2019/v1.5.2/#v152-2019-01-12&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://github.com/saulpw/visidata/releases/tag/v1.5.2&quot;&gt;v1.5.2&lt;/a&gt; (2019-01-12)&lt;/h2&gt;
&lt;p&gt;We are starting off the New Year with a very small patch for a few bugs.&lt;/p&gt;
&lt;p&gt;Briefly,&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Fixed &lt;code&gt;g*&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;thanks to both @jsvine and @layertwo for noticing and notifying us.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;If suspended during editline (with &lt;code&gt;Ctrl+Z&lt;/code&gt;), VisiData will now correctly resume in the editline.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Ctrl+W&lt;/code&gt; on an empty value in editline does not error out of the editline.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/saulpw/visidata/blob/stable/CHANGELOG.md#v152-2019-01-12&quot;&gt;And that&#39;s it&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Happy new year, everyone!&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>v1.5.1</title>
    <link href="https://visidata.org/blog/2018/v1.5.1/"/>
    <updated>2018-12-17T00:00:00Z</updated>
    <id>https://visidata.org/blog/2018/v1.5.1/</id>
    <content type="html">&lt;h2 id=&quot;v151-2018-12-17&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://visidata.org/blog/2018/v1.5.1/#v151-2018-12-17&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://github.com/saulpw/visidata/releases/tag/v1.5.1&quot;&gt;v1.5.1&lt;/a&gt; (2018-12-17)&lt;/h2&gt;
&lt;h2 id=&quot;v151-bugfixes-and-user-feedback&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://visidata.org/blog/2018/v1.5.1/#v151-bugfixes-and-user-feedback&quot;&gt;&lt;/a&gt;v1.5.1: Bugfixes and user feedback&lt;/h2&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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!&lt;/p&gt;
&lt;p&gt;A brief overview:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Improvements to the pandas loader.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;thanks to @nickray for the bughunting&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;When set to True &lt;code&gt;options.bulk_select_clear&lt;/code&gt; bulk select commands (&lt;code&gt;|&lt;/code&gt;, &lt;code&gt;g|&lt;/code&gt;, &lt;code&gt;,&lt;/code&gt;, etc) will clear the previously selected rows.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the default is set to False and exhibits the current behaviour of retaining the already selected rows&lt;/li&gt;
&lt;li&gt;thanks to @aborruso for the suggestion&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;Shift+O&lt;/code&gt; once again pushes the global options sheet. You can find the sheet options by pressing &lt;code&gt;zO&lt;/code&gt;. &lt;code&gt;gO&lt;/code&gt; now opens the &lt;code&gt;.visidatarc&lt;/code&gt; which can be edited and saved from within the VisiData interface.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Sorting is now asynchronous, per user request. Please let us know how you find it.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;thanks to @apnewberry for starting that conversation&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;gz^&lt;/code&gt; now renames all visible columns to contents of selected rows and &lt;code&gt;gz*&lt;/code&gt; substitutes over all visible columns&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;thanks, once again, to @aborruso for both suggestions&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;As usual, the complete list of changes can be found in the &lt;a href=&quot;https://github.com/saulpw/visidata/blob/stable/CHANGELOG.md#v151-2018-12-17&quot;&gt;Changelog&lt;/a&gt;.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>v1.5</title>
    <link href="https://visidata.org/blog/2018/v1.5/"/>
    <updated>2018-11-02T00:00:00Z</updated>
    <id>https://visidata.org/blog/2018/v1.5/</id>
    <content type="html">&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/saulpw/visidata/releases/tag/v1.5&quot;&gt;v1.5&lt;/a&gt; (2018-11-02)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For the most part, this is a bugfix release.  A few other improvements are here as well:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Basic plugin support&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;~/.visidata&lt;/code&gt; added to sys.path on startup&lt;/li&gt;
&lt;li&gt;copy plugin to e.g. &lt;code&gt;~/.visidata/vdfoo.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;add &lt;code&gt;import vdfoo&lt;/code&gt; to &lt;code&gt;.visidatarc&lt;/code&gt; to activate&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Error saving&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;for tsv and json, errors are saved as &lt;code&gt;options.safe_error&lt;/code&gt; string (default &lt;code&gt;#ERR&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;if that option is an empty string, error message is saved instead&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Mouse improvements&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;click now moves to column also&lt;/li&gt;
&lt;li&gt;right-click to edit cell, rename column, or rename sheet, depending on where clicked.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;xls/xlsx loaders now use &lt;code&gt;options.header&lt;/code&gt; to determine number of rows used to set column names (default is 1).&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;See the &lt;a href=&quot;https://github.com/saulpw/visidata/blob/stable/CHANGELOG.md&quot;&gt;CHANGELOG&lt;/a&gt; for a more complete list of bugfixes and changes.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>v1.4</title>
    <link href="https://visidata.org/blog/2018/v1.4/"/>
    <updated>2018-09-24T00:00:00Z</updated>
    <id>https://visidata.org/blog/2018/v1.4/</id>
    <content type="html">&lt;h2 id=&quot;v14-2018-09-24&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://visidata.org/blog/2018/v1.4/#v14-2018-09-24&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://github.com/saulpw/visidata/releases/tag/v1.4&quot;&gt;v1.4&lt;/a&gt; (2018-09-24)&lt;/h2&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;[pyobj] &lt;code&gt;visidata.view(obj)&lt;/code&gt; and &lt;code&gt;visidata.view_pandas(df)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;[pandas] &lt;code&gt;-f pandas&lt;/code&gt; loads file using &lt;code&gt;pandas.read_&amp;lt;ext&amp;gt;()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;[date] date minus date now gives float number of days instead of seconds&lt;/li&gt;
&lt;li&gt;[vdtui] internal colorizer API changed significantly&lt;/li&gt;
&lt;li&gt;[vdtui] significant idle performance improvement&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As usual, a more complete list of changes and features is in the &lt;a href=&quot;https://github.com/saulpw/visidata/blob/stable/CHANGELOG.md&quot;&gt;CHANGELOG&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;See the &lt;a href=&quot;https://github.com/saulpw/visidata/blob/stable/dev/ROADMAP&quot;&gt;ROADMAP&lt;/a&gt; for the planned future direction of VisiData.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>v1.3.1</title>
    <link href="https://visidata.org/blog/2018/v1.3.1/"/>
    <updated>2018-08-19T00:00:00Z</updated>
    <id>https://visidata.org/blog/2018/v1.3.1/</id>
    <content type="html">&lt;h2 id=&quot;v131-2018-08-19&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://visidata.org/blog/2018/v1.3.1/#v131-2018-08-19&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://github.com/saulpw/visidata/releases/tag/v1.3.1&quot;&gt;v1.3.1&lt;/a&gt; (2018-08-19)&lt;/h2&gt;
&lt;p&gt;We found some issues with 1.3 (aggregators interacting with nulls/errors, primarily) that we didn&#39;t want to let sit until 1.4.  So we fixed those issues and a couple others, and added a few &#39;minor&#39; features.  This patch version should be a definitive improvement over the base 1.3 version.&lt;/p&gt;
&lt;p&gt;The complete list of changes is in the &lt;a href=&quot;https://github.com/saulpw/visidata/blob/stable/CHANGELOG.md&quot;&gt;CHANGELOG&lt;/a&gt;.  Here are the new options and features:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;new &lt;code&gt;extend&lt;/code&gt; join type keeps the type of the first sheet, extending it with columns from the other sheets&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rename-sheet&lt;/code&gt; command (thanks to @jsvine for suggestion; what default keybinding should it have?)&lt;/li&gt;
&lt;li&gt;[DirSheet] add &lt;code&gt;reload-rows&lt;/code&gt; (&lt;code&gt;gz^R&lt;/code&gt;) to undo modifications on all selected rows&lt;/li&gt;
&lt;li&gt;remove all options.foo_is_null and add options.null_value&lt;/li&gt;
&lt;li&gt;options.save_errors (default True) to include errors when saving&lt;/li&gt;
&lt;li&gt;add options.json_indent for json pretty-printing&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  
  <entry>
    <title>v1.3</title>
    <link href="https://visidata.org/blog/2018/v1.3/"/>
    <updated>2018-08-11T00:00:00Z</updated>
    <id>https://visidata.org/blog/2018/v1.3/</id>
    <content type="html">&lt;h2 id=&quot;v13-2018-08-11&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://visidata.org/blog/2018/v1.3/#v13-2018-08-11&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://github.com/saulpw/visidata/releases/tag/v1.3&quot;&gt;v1.3&lt;/a&gt; (2018-08-11)&lt;/h2&gt;
&lt;p&gt;It&#39;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&#39;s a list of most of them:&lt;/p&gt;
&lt;h3&gt;commands&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;All commands were thoughtfully renamed, and the command longnames should be largely stable now.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/saulpw/visidata/stable/visidata/commands.tsv&quot;&gt;&lt;code&gt;commands.tsv&lt;/code&gt;&lt;/a&gt; is an exhaustive list of commands and their attributes and side effects.&lt;/li&gt;
&lt;li&gt;The manpage has moved to &lt;code&gt;Ctrl+H&lt;/code&gt; (sysopen-help), which is hopefully its final keybinding.
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;F1&lt;/code&gt; will still open the manpage if the terminal doesn&#39;t intercept it.&lt;/li&gt;
&lt;li&gt;but &lt;code&gt;z?&lt;/code&gt; has been repurposed (see below).&lt;/li&gt;
&lt;li&gt;Note that because iTerm reports &lt;code&gt;Ctrl+H&lt;/code&gt; as &lt;code&gt;Backspace&lt;/code&gt;, these help commands are also available by using &lt;code&gt;Backspace&lt;/code&gt; (backspace for help, a new trend).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;z Ctrl+H&lt;/code&gt; opens a list of commands available on this sheet.&lt;/li&gt;
&lt;li&gt;Keybindings and longnames are separated out.  The cmdlog now records longnames as well.&lt;/li&gt;
&lt;li&gt;See the new &lt;a href=&quot;http://visidata.org/docs/kblayout/&quot;&gt;keyboard layouts page&lt;/a&gt; (thanks to @deinspanjer for inspiration).&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;changes to existing commands and options&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;The experimental menu system (was &lt;code&gt;Space&lt;/code&gt;) has been removed.&lt;/li&gt;
&lt;li&gt;Now &lt;code&gt;Space&lt;/code&gt; (exec-longname) executes the command for the input longname (tab completion of available commands is supported).  (This function was previously bound to &lt;code&gt;Ctrl+A&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;options.wrap&lt;/code&gt; (for TextSheet wrapping of lines) now defaults to &lt;code&gt;False&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;R&lt;/code&gt; (random-sheet) opens a new sheet instead of selecting random rows (reverting to former behavior).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;za&lt;/code&gt; (addcol-empty) asks for column name&lt;/li&gt;
&lt;li&gt;&lt;code&gt;zd&lt;/code&gt; (delete-cell) moves value to clipboard (&amp;quot;cut&amp;quot;, like other delete commands)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;options&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;options can now be set on specific sheet types or even individual sheets.  &lt;code&gt;Shift+O&lt;/code&gt; opens &lt;a href=&quot;http://visidata.org/docs/customize/&quot;&gt;options for the current sheet type&lt;/a&gt;, and &lt;code&gt;g Shift+O&lt;/code&gt; opens the global options sheet.&lt;/li&gt;
&lt;li&gt;See available colors by pressing &lt;code&gt;Space&lt;/code&gt; and then typing the longname &lt;code&gt;colors&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;new safety options&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Error messages are sorted before informational status messages, and colored by &lt;code&gt;color_error&lt;/code&gt; and &lt;code&gt;color_warning&lt;/code&gt; (thanks to @jsvine for suggestion)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;options.quitguard&lt;/code&gt; (default &lt;code&gt;False&lt;/code&gt; to keep old behavior) if True, will confirm before quitting last sheet.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;gS&lt;/code&gt; (sheets-graveyard) command opens a sheet that shows all discarded (but &amp;quot;precious&amp;quot;) sheets.  These are stored as weak references so they will be garbage collected eventually, but can be resurrected from the graveyard sheet until then.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;options.safety_first&lt;/code&gt; (default &lt;code&gt;False&lt;/code&gt;) makes loading/saving more robust, likely at the cost of performance which can become significant in large files.
&lt;ul&gt;
&lt;li&gt;Currently, only removes NULs from csv input.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;options.tsv_safe_char&lt;/code&gt; is split into &lt;code&gt;tsv_safe_newline&lt;/code&gt; and &lt;code&gt;tsv_safe_tab&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;new power features&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;z;&lt;/code&gt; (&lt;code&gt;addcol-sh&lt;/code&gt;) adds new columns for stdout/stderr of a &lt;code&gt;bash&lt;/code&gt; command, which uses &lt;code&gt;$colname&lt;/code&gt; to substitute values from other columns (whole arguments only, so far).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;z|&lt;/code&gt; (&lt;code&gt;select-expr&lt;/code&gt;) and &lt;code&gt;z\&lt;/code&gt; (&lt;code&gt;unselect-expr&lt;/code&gt;) select/unselect by Python expression (thanks to @jsvine for suggestion).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;z/&lt;/code&gt; (&lt;code&gt;search-expr&lt;/code&gt;) and &lt;code&gt;z?&lt;/code&gt; (&lt;code&gt;searchr-expr&lt;/code&gt;) to search forward/backward by Python expression.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;gI&lt;/code&gt; (&lt;code&gt;describe-all&lt;/code&gt;) describes all columns in all sheeets (like &lt;code&gt;gC&lt;/code&gt; (&lt;code&gt;columns-all&lt;/code&gt;)).&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;nice things&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;The &lt;code&gt;g(&lt;/code&gt;, &lt;code&gt;z(&lt;/code&gt;, and &lt;code&gt;gz(&lt;/code&gt; variants of &lt;code&gt;(&lt;/code&gt; (&#39;expand-column&#39;) are filled out.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;z#&lt;/code&gt; sets type of current column to &lt;code&gt;len&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;new-loaders&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://visidata.org/blog/2018/v1.3/#new-loaders&quot;&gt;&lt;/a&gt;new loaders&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;yaml loader (thanks to @robcarrington, @JKiely, @anjakefala at PyCon Sprints for making this happen)&lt;/li&gt;
&lt;li&gt;pcap loader (thanks to @vbrown608 and @TemperedNetworks)&lt;/li&gt;
&lt;li&gt;xml loader&lt;/li&gt;
&lt;li&gt;jsonl saver&lt;/li&gt;
&lt;li&gt;[json loader] no more incremental display (need a better json parser than the Python stdlib offers)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/saulpw/visidata/issues/162#issuecomment-400488487&quot;&gt;pandas adapter&lt;/a&gt; (thanks to @jjzmajic for issue #162)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;minor-changes&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://visidata.org/blog/2018/v1.3/#minor-changes&quot;&gt;&lt;/a&gt;minor changes&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;System clipboard command detection is more portable (thanks to @chocolateboy for the PR).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;date&lt;/code&gt; supports adding a number of days (or like &lt;code&gt;foo+6*hours&lt;/code&gt;, &lt;code&gt;foo+9*months&lt;/code&gt;, etc).&lt;/li&gt;
&lt;li&gt;Hidden columns are darkened on columns sheet.&lt;/li&gt;
&lt;li&gt;Exceptions are rolled up properly.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;options.motd_url&lt;/code&gt; now uses https by default (thanks to @jsvine for the warning).&lt;/li&gt;
&lt;li&gt;[DirSheet] &lt;code&gt;mode&lt;/code&gt; is editable (set to octal like &lt;code&gt;0o0644&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;[internal dev] ProfileSheet is improved.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;known-issues&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://visidata.org/blog/2018/v1.3/#known-issues&quot;&gt;&lt;/a&gt;known issues&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;cmdlog replay with a &lt;code&gt;Ctrl+S&lt;/code&gt; (&lt;code&gt;save-sheet&lt;/code&gt;) to an existing file gets stuck in an infinite loop when &lt;code&gt;options.confirm_overwrite&lt;/code&gt; is on.&lt;/li&gt;
&lt;li&gt;After renaming a file on a &lt;strong&gt;DirSheet&lt;/strong&gt;, &lt;code&gt;Ctrl+R&lt;/code&gt; (&lt;code&gt;reload-sheet&lt;/code&gt;) is required to refresh the &lt;code&gt;ext&lt;/code&gt; column for that row.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;n&lt;/code&gt;/&lt;code&gt;N&lt;/code&gt; (&lt;code&gt;next-search&lt;/code&gt;/&lt;code&gt;prev-search&lt;/code&gt;) won&#39;t continue a previous &lt;code&gt;search-expr&lt;/code&gt; and &lt;code&gt;searchr-expr&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;show-aggregate&lt;/code&gt; with &lt;em&gt;mean&lt;/em&gt; errors on &lt;code&gt;int&lt;/code&gt; columns.&lt;/li&gt;
&lt;li&gt;Contracting (with &lt;code&gt;)&lt;/code&gt;) a previously expanded column on a dup-ed (with &lt;code&gt;&amp;quot;&lt;/code&gt;) sheet results it in disappearing on the source sheet.&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  
  <entry>
    <title>v1.2.1</title>
    <link href="https://visidata.org/blog/2018/v1.2.1/"/>
    <updated>2018-07-06T00:00:00Z</updated>
    <id>https://visidata.org/blog/2018/v1.2.1/</id>
    <content type="html">&lt;h2 id=&quot;v121-2018-07-06&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://visidata.org/blog/2018/v1.2.1/#v121-2018-07-06&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://github.com/saulpw/visidata/releases/tag/v1.2.1&quot;&gt;v1.2.1&lt;/a&gt; (2018-07-06)&lt;/h2&gt;
&lt;p&gt;@deinspanjer (issue &lt;a href=&quot;https://github.com/saulpw/visidata/issues/164&quot;&gt;#164&lt;/a&gt;) discovered that VisiData doesn&#39;t work with Python3.7 due to our use of the &#39;async&#39; 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 &#39;async&#39; to &#39;asyncthread&#39; in order to work with Python 3.7.&lt;/p&gt;
&lt;p&gt;Thanks to the illustrious @anjakefala for getting this release out quickly and without incident (knock on wood).&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>v1.2</title>
    <link href="https://visidata.org/blog/2018/v1.2/"/>
    <updated>2018-05-03T00:00:00Z</updated>
    <id>https://visidata.org/blog/2018/v1.2/</id>
    <content type="html">&lt;h2 id=&quot;v12-2018-05-03&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://visidata.org/blog/2018/v1.2/#v12-2018-05-03&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://github.com/saulpw/visidata/releases/tag/v1.2&quot;&gt;v1.2&lt;/a&gt; (2018-05-03)&lt;/h2&gt;
&lt;p&gt;Here are the major feature enhancements for v1.2.  Please see the &lt;a href=&quot;https://github.com/saulpw/visidata/blob/stable/CHANGELOG.md&quot;&gt;CHANGELOG&lt;/a&gt; for the complete list.&lt;/p&gt;
&lt;h2 id=&quot;major-features&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://visidata.org/blog/2018/v1.2/#major-features&quot;&gt;&lt;/a&gt;Major features&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;DirSheet enhancements (modify file metadata, move/delete files)&lt;/li&gt;
&lt;li&gt;multisave (single file multisave to html, md, and txt format, or into a directory for other formats)&lt;/li&gt;
&lt;li&gt;prototype macro system with &lt;code&gt;z^S&lt;/code&gt; on the commandlog&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/conda-forge/visidata-feedstock&quot;&gt;New conda package&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;new-commands-and-options&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://visidata.org/blog/2018/v1.2/#new-commands-and-options&quot;&gt;&lt;/a&gt;New commands and options&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;T&lt;/code&gt; to push derived sheet with transposed rows/columns&lt;/li&gt;
&lt;li&gt;&lt;code&gt;zs&lt;/code&gt;/&lt;code&gt;zt&lt;/code&gt;/&lt;code&gt;zu&lt;/code&gt; to select/unselect/toggle rows from top of sheet to cursor (thanks @SteveJSteiner for the suggestion)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;gzs&lt;/code&gt;/&lt;code&gt;gzt&lt;/code&gt;/&lt;code&gt;gzu&lt;/code&gt; to select/unselect/toggle rows from bottom to cursor&lt;/li&gt;
&lt;li&gt;&lt;code&gt;gv&lt;/code&gt; to unhide all columns&lt;/li&gt;
&lt;li&gt;&lt;code&gt;gM&lt;/code&gt; to melt into multiple value columns&lt;/li&gt;
&lt;li&gt;&lt;code&gt;g*&lt;/code&gt; to transform selected rows in place&lt;/li&gt;
&lt;li&gt;&lt;code&gt;z&amp;lt;&lt;/code&gt;/`z&amp;gt;&#39; to move up/down to next null cell&lt;/li&gt;
&lt;li&gt;&lt;code&gt;^A&lt;/code&gt; to execute a command by its longname&lt;/li&gt;
&lt;li&gt;&lt;code&gt;gD&lt;/code&gt; to open the directory at &lt;code&gt;options.visidata_dir&lt;/code&gt; (default &lt;code&gt;~/.visidata&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;options&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;options.cmdlog_histfile&lt;/code&gt; to specify a file to auto-append commandlog to (default empty means disabled)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;options.tsv_safe_char&lt;/code&gt; to replace tabs and newlines when writing .tsv format (default empty means disabled, for faster saving)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;options.error_is_null&lt;/code&gt; to count errors as null (default false)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;new-supported-formats-and-sources&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://visidata.org/blog/2018/v1.2/#new-supported-formats-and-sources&quot;&gt;&lt;/a&gt;New supported formats and sources&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;sas7bda (SAS; requires &lt;code&gt;sas7bdat&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;xpt (SAS; requires &lt;code&gt;xport&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;sav (SPSS; requires &lt;code&gt;savReaderWriter&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;dta (Stata; requires &lt;code&gt;pandas&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;bz2 and xz (LZMA) compression (thanks @jpgrayson)&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  
  <entry>
    <title>v1.1</title>
    <link href="https://visidata.org/blog/2018/v1.1/"/>
    <updated>2018-03-06T00:00:00Z</updated>
    <id>https://visidata.org/blog/2018/v1.1/</id>
    <content type="html">&lt;h2 id=&quot;v11-2018-03-06&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://visidata.org/blog/2018/v1.1/#v11-2018-03-06&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://github.com/saulpw/visidata/releases/tag/v1.1&quot;&gt;v1.1&lt;/a&gt; (2018-03-06)&lt;/h2&gt;
&lt;p&gt;This is the first release since 1.0.  The major additions and changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;All external loader dependencies have been removed from the PyPI, brew, and Debian packages.  This will make for much faster initial installation.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;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 &lt;a href=&quot;https://github.com/saulpw/visidata/blob/stable/requirements.txt&quot;&gt;requirements.txt&lt;/a&gt; for which external packages to install for each loader.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;An experimental command menu is now available via &lt;code&gt;Space&lt;/code&gt;. The goal is to make it easier for people to explore the available functionality, and to try commands without knowing their keybindings.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Use the standard VisiData movement keys (&lt;code&gt;h&lt;/code&gt;/&lt;code&gt;l&lt;/code&gt;/Arrows, &lt;code&gt;q&lt;/code&gt; to back out)&lt;/li&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;li&gt;If you play with the menu system, please let me know what did or didn&#39;t work for you!&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The &lt;code&gt;Y&lt;/code&gt; command series was added to copy (&amp;quot;yank&amp;quot;) to the system clipboard (with &lt;code&gt;options.clipboard_copy_cmd&lt;/code&gt;, set to &lt;code&gt;pbclip&lt;/code&gt; for MacOS by default) to conveniently paste data in any supported text output format.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Y&lt;/code&gt; copies the current row, &lt;code&gt;zY&lt;/code&gt; copies the current cell, and &lt;code&gt;gY&lt;/code&gt; copies all selected rows (or all rows).&lt;/li&gt;
&lt;li&gt;This mirrors the existing &lt;code&gt;y&lt;/code&gt; command series, which yanks to VisiData&#39;s internal clipboard.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;-&lt;/code&gt; now works as a filename to specify stdin/stdout.  Useful especially in batch mode to dump final sheet to stdout (&lt;code&gt;-b -o -&lt;/code&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;New supported formats:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;markdown (&lt;code&gt;md&lt;/code&gt;) is now supported for saving (but not loading, yet) to an org-mode compatible table format.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;.png files can now be loaded and saved, and crudely viewed on the canvas with an overloaded &lt;code&gt;.&lt;/code&gt;.  The pixels can be edited on the source sheet like any other data.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;.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 &lt;code&gt;Canvas.qcurve()&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These commands have been added or changed, and are expected to stay in future versions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The &lt;code&gt;za&lt;/code&gt; command adds an empty, editable column to any sheet.  &lt;code&gt;gza&lt;/code&gt; adds N new columns.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The &lt;code&gt;(&lt;/code&gt; and &lt;code&gt;)&lt;/code&gt; commands will expand/collapse list/dict columns (e.g. in nested json).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In the canvas, &lt;code&gt;d&lt;/code&gt; deletes points from source sheet that are contained within the cursor.  &lt;code&gt;gd&lt;/code&gt; deletes all points shown on the screen.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The &lt;code&gt;!@#$%-_&lt;/code&gt; 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.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The &lt;code&gt;g&lt;/code&gt; forms of these commands are still available and will operate on the source columns (with the exception of &lt;code&gt;g_&lt;/code&gt;, which now works consistently on all sheets as expected).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The &lt;code&gt;Shift+Arrows&lt;/code&gt; are aliased to &lt;code&gt;HJKL&lt;/code&gt; (though these may not work in all environments).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These additions are more experimental and may not stay in future versions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The &lt;code&gt;Backspace&lt;/code&gt; command drops the current sheet (like &lt;code&gt;q&lt;/code&gt;), and also scrubs its history from the cmdlog.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;ENTER&lt;/code&gt; is now aliased to &lt;code&gt;modify-edit-cell&lt;/code&gt; by default.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Other minor changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;search and select with no input now uses the most recent input.  &lt;code&gt;n&lt;/code&gt;/&lt;code&gt;N&lt;/code&gt; 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 &lt;code&gt;c&lt;/code&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Many sheets (pivot, describe, melt, and many loaders) have improvements and bugfixes to make them even better.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Finally, some other news:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;VisiData has been accepted into Debian for the next release!  It is currently available if you&#39;ve added the &lt;code&gt;unstable&lt;/code&gt; repo; install with &lt;code&gt;apt install visidata&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://jsvine.github.io/intro-to-visidata/&quot;&gt;Jeremy Singer-Vine has put together a great tutorial&lt;/a&gt; for people who want a smoother path to start using VisiData.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Thanks to everyone who contributed to this release!  As always, feedback and suggestions are welcome and appreciated.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>v1.0</title>
    <link href="https://visidata.org/blog/2018/v1.0/"/>
    <updated>2018-01-25T00:00:00Z</updated>
    <id>https://visidata.org/blog/2018/v1.0/</id>
    <content type="html">&lt;h2 id=&quot;v10-2018-01-25&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://visidata.org/blog/2018/v1.0/#v10-2018-01-25&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://github.com/saulpw/visidata/releases/tag/v1.0&quot;&gt;v1.0&lt;/a&gt; (2018-01-25)&lt;/h2&gt;
&lt;p&gt;VisiData 1.0 has been officially released!  Changes since the 0.99 release candidate:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;a complete overhaul of &lt;a href=&quot;http://visidata.org/&quot;&gt;the website&lt;/a&gt; and &lt;a href=&quot;http://visidata.org/docs&quot;&gt;documentation&lt;/a&gt;;&lt;/li&gt;
&lt;li&gt;a 2x across-the-board performance improvement for async threads (from disabling profiling by default);&lt;/li&gt;
&lt;li&gt;removed support for .visidatarc in the current directory and via XDG; only &lt;code&gt;$HOME/.visidatarc&lt;/code&gt; is used now;&lt;/li&gt;
&lt;li&gt;many bugfixes, both functional and cosmetic;&lt;/li&gt;
&lt;li&gt;removed the &amp;quot;visidata[full]&amp;quot; package from PyPI;&lt;/li&gt;
&lt;li&gt;a &lt;a href=&quot;https://github.com/saulpw/homebrew-vd&quot;&gt;homebrew package&lt;/a&gt; (so you can now do &lt;code&gt;brew install saulpw/vd/visidata&lt;/code&gt; on MacOS), and an &lt;a href=&quot;https://github.com/saulpw/deb-vd&quot;&gt;apt package&lt;/a&gt; that is under review for inclusion in Debian.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;We could have gotten away without certain features and with fewer &lt;a href=&quot;http://visidata.org/man#loaders&quot;&gt;supported formats&lt;/a&gt;, but there is such breadth and depth included in 1.0 (as shown by demos like &lt;a href=&quot;https://www.youtube.com/watch?v=N1CBDTgGtOU&quot;&gt;this one at the PyCascades 2018 conference&lt;/a&gt;), that I&#39;m hard-pressed to choose which features should have been omitted.&lt;/p&gt;
&lt;p&gt;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.
&lt;a href=&quot;http://visidata.org/about&quot;&gt;The list of contributors&lt;/a&gt; includes everyone who has submitted to the repository, but there are some other groups to whom VisiData and I are eternally indebted:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the &lt;a href=&quot;http://recurse.com/&quot;&gt;Recurse Center&lt;/a&gt;, for maintaining an awesome space and incredibly supportive community that I am lucky to have become a part of;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://officenomads.com/&quot;&gt;Office Nomads&lt;/a&gt;, my local co-working space where I could work without turning into &lt;a href=&quot;https://www.youtube.com/watch?v=4lQ_MjU4QHw&quot;&gt;Jack Torrance&lt;/a&gt;;&lt;/li&gt;
&lt;li&gt;and the &lt;a href=&quot;https://www.python.org/&quot;&gt;Python community&lt;/a&gt;, for creating such a broadly useful language and ecosystem, without which VisiData would not be nearly as powerful.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Finally, a very special thanks to &lt;a href=&quot;https://github.com/anjakefala&quot;&gt;Anja&lt;/a&gt; for her incredible help in putting together the website, documentation, tests, and various releases.&lt;/p&gt;
&lt;p&gt;Share and enjoy!&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>v0.99</title>
    <link href="https://visidata.org/blog/2017/v0.99/"/>
    <updated>2017-12-22T00:00:00Z</updated>
    <id>https://visidata.org/blog/2017/v0.99/</id>
    <content type="html">&lt;h2 id=&quot;v099-2017-12-22&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://visidata.org/blog/2017/v0.99/#v099-2017-12-22&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://github.com/saulpw/visidata/releases/tag/v0.99&quot;&gt;v0.99&lt;/a&gt; (2017-12-22)&lt;/h2&gt;
&lt;p&gt;This is a 1.0 release candidate.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;User-facing changes in this version:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;tab completion for filename and python expressions&lt;/li&gt;
&lt;li&gt;load .html table elements (requires lxml)
&lt;ul&gt;
&lt;li&gt;http urls are now usable as sources (requires requests)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;save as .json&lt;/li&gt;
&lt;li&gt;&lt;code&gt;^W&lt;/code&gt; to erase a word in the line editor&lt;/li&gt;
&lt;li&gt;&lt;code&gt;gC&lt;/code&gt; views all columns on all sheets&lt;/li&gt;
&lt;li&gt;&lt;code&gt;median&lt;/code&gt; aggregator&lt;/li&gt;
&lt;li&gt;&lt;code&gt;v&lt;/code&gt; now &#39;visibility toggle&#39; (moved from &lt;code&gt;w&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--version&lt;/code&gt; (thanks to @jsvine)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;options.use_default_colors&lt;/code&gt; (thanks to @wavexx)&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  
  <entry>
    <title>v0.98.1</title>
    <link href="https://visidata.org/blog/2017/v0.98.1/"/>
    <updated>2017-12-04T00:00:00Z</updated>
    <id>https://visidata.org/blog/2017/v0.98.1/</id>
    <content type="html">&lt;h2 id=&quot;v0981-2017-12-04&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://visidata.org/blog/2017/v0.98.1/#v0981-2017-12-04&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://github.com/saulpw/visidata/releases/tag/v0.98.1&quot;&gt;v0.98.1&lt;/a&gt; (2017-12-04)&lt;/h2&gt;
&lt;p&gt;v0.98.1 is a patch release that fixes a couple of minor bugs.  The primary change in this release, however, is that the &#39;visidata&#39; package on PyPI no longer includes all of the loaders&#39; dependencies by default.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;To install VisiData with all dependencies for all loaders:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pip3 install &amp;quot;visidata[full]&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Of course, you can install just the dependencies you need.  See &lt;a href=&quot;http://visidata.org/man/#loaders&quot;&gt;&amp;quot;SUPPORTED SOURCES&amp;quot;&lt;/a&gt; in the manpage for which packages to install.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>v0.98</title>
    <link href="https://visidata.org/blog/2017/v0.98/"/>
    <updated>2017-11-23T00:00:00Z</updated>
    <id>https://visidata.org/blog/2017/v0.98/</id>
    <content type="html">&lt;h2 id=&quot;v098--2017-11-23&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://visidata.org/blog/2017/v0.98/#v098--2017-11-23&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://github.com/saulpw/visidata/releases/tag/v0.98&quot;&gt;v0.98&lt;/a&gt;  (2017-11-23)&lt;/h2&gt;
&lt;p&gt;Title: VisiData v0.98, now with graphs and maps (experimental)&lt;/p&gt;
&lt;p&gt;When I announced that v0.97 was &amp;quot;feature complete&amp;quot;, 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.&lt;/p&gt;
&lt;p&gt;Here&#39;s a list of what&#39;s new in VisiData v0.98:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;http://visidata.org/&quot;&gt;visidata.org&lt;/a&gt; revamp&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[canvas] graphs and maps!&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;.&lt;/code&gt; or &lt;code&gt;g.&lt;/code&gt; to push a graph or a map from the current sheet (dot=plot)&lt;/li&gt;
&lt;li&gt;supports .shp and vector .mbtiles&lt;/li&gt;
&lt;li&gt;mouse left-click/drag to set cursor&lt;/li&gt;
&lt;li&gt;mouse right-click/drag to scroll canvas&lt;/li&gt;
&lt;li&gt;scrollwheel to zoom in/out on a canvas&lt;/li&gt;
&lt;li&gt;&lt;code&gt;s&lt;/code&gt;/&lt;code&gt;u&lt;/code&gt; to select/unselect rows at canvas cursor&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ENTER&lt;/code&gt; to push source sheet with only rows at canvas cursor&lt;/li&gt;
&lt;li&gt;1-9 to toggle display of &#39;layers&#39; (colors)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;_&lt;/code&gt; to zoom out to full width&lt;/li&gt;
&lt;li&gt;&lt;code&gt;disp_pixel_random&lt;/code&gt; option chooses pixel attrs at random (weighted), instead of most common&lt;/li&gt;
&lt;li&gt;&lt;code&gt;+&lt;/code&gt;/&lt;code&gt;-&lt;/code&gt; to zoom in/out via keyboard&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Updates to commands&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Remove ` (backtick) command&lt;/li&gt;
&lt;li&gt;Remove most zscroll commands (&lt;code&gt;zs&lt;/code&gt;/&lt;code&gt;ze&lt;/code&gt;)
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;zz&lt;/code&gt; moves cursor to center, uncertain about the future of &lt;code&gt;zt&lt;/code&gt; due to conflict with &lt;code&gt;t&lt;/code&gt; for toggle&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ga&lt;/code&gt; adds N new rows&lt;/li&gt;
&lt;li&gt;&lt;code&gt;gz=&lt;/code&gt; sets value for selected/all rows to a Python sequence in this column&lt;/li&gt;
&lt;li&gt;&lt;code&gt;z_&lt;/code&gt; sets column width to given value&lt;/li&gt;
&lt;li&gt;&lt;code&gt;z-&lt;/code&gt; cuts column width in half&lt;/li&gt;
&lt;li&gt;&lt;code&gt;P&lt;/code&gt; is now &amp;quot;paste before&amp;quot; (like vim); &lt;code&gt;R&lt;/code&gt; now pushes a random sample&lt;/li&gt;
&lt;li&gt;&lt;code&gt;^Z&lt;/code&gt; now sends SIGSTOP; &lt;code&gt;^O&lt;/code&gt; &amp;quot;opens&amp;quot; the external $EDITOR (from builtin line editor)&lt;/li&gt;
&lt;li&gt;[ColumnsSheet] Added &lt;code&gt;~!@#$&lt;/code&gt; commands back, to set type of source columns&lt;/li&gt;
&lt;li&gt;&lt;code&gt;w&lt;/code&gt; is becoming a more universal &amp;quot;visibility toggle&amp;quot;
&lt;ul&gt;
&lt;li&gt;[TextSheet] &lt;code&gt;w&lt;/code&gt; toggles wordwrap&lt;/li&gt;
&lt;li&gt;[canvas] &lt;code&gt;w&lt;/code&gt; toggles display of the labels&lt;/li&gt;
&lt;li&gt;[pyobj] &lt;code&gt;w&lt;/code&gt; toggles hidden properties and methods&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Updates to command line args and options&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;set initial row/col with &lt;code&gt;+&amp;lt;row#&amp;gt;:&amp;lt;col#&amp;gt;&lt;/code&gt; (numeric only)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--delimiter&lt;/code&gt;/&lt;code&gt;-d &lt;/code&gt; option (separate from &lt;code&gt;--csv-delimiter&lt;/code&gt;) sets delimiter for tsv filetype&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--replay-wait&lt;/code&gt;/&lt;code&gt;-w&lt;/code&gt; renamed from &lt;code&gt;--delay&lt;/code&gt;/&lt;code&gt;-d&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;disp_date_fmt&lt;/code&gt; option for date display format string (default is date-only)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;zero_is_null&lt;/code&gt;/&lt;code&gt;empty_is_null&lt;/code&gt;/&lt;code&gt;none_is_null&lt;/code&gt;/&lt;code&gt;false_is_null&lt;/code&gt; set which values are considered null (previously was &lt;code&gt;aggr_null_filter&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--skiplines&lt;/code&gt; option renamed to &lt;code&gt;--skip&lt;/code&gt;, and &lt;code&gt;--headerlines&lt;/code&gt; to &lt;code&gt;--header&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Design improvements&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Add specific rowtype for each sheet (see right status)&lt;/li&gt;
&lt;li&gt;dates are a kind of numeric type (useful for graphing as the x-axis)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;use_default_colors&lt;/code&gt; (at behest of @wavexx)&lt;/li&gt;
&lt;li&gt;more robust Progress indicator&lt;/li&gt;
&lt;li&gt;populate DescribeSheet in async thread&lt;/li&gt;
&lt;li&gt;remove default names for unnamed columns&lt;/li&gt;
&lt;li&gt;history up/down in edit widget now feels right&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;API changes&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;change main Column API to getter(col, row) and setter(col, row, val)&lt;/li&gt;
&lt;li&gt;move Path and subclasses out of vdtui&lt;/li&gt;
&lt;li&gt;TextSheet source is any iterable of strings&lt;/li&gt;
&lt;li&gt;Sheet.filetype provides default save filename extension&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  
  <entry>
    <title>v0.97.1</title>
    <link href="https://visidata.org/blog/2017/v0.97.1/"/>
    <updated>2017-10-29T00:00:00Z</updated>
    <id>https://visidata.org/blog/2017/v0.97.1/</id>
    <content type="html">&lt;h2 id=&quot;v0971-2017-10-29&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://visidata.org/blog/2017/v0.97.1/#v0971-2017-10-29&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://github.com/saulpw/visidata/releases/tag/v0.97.1&quot;&gt;v0.97.1&lt;/a&gt; (2017-10-29)&lt;/h2&gt;
&lt;p&gt;It&#39;s VisiData&#39;s 1st birthday! I started working on VisiData 1 year ago today (Oct 29).&lt;/p&gt;
&lt;p&gt;v0.97.1 has only a few small patches:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fixed help manpage on OS/X (man has no --local-file option)&lt;/li&gt;
&lt;li&gt;Fixed Postgres (incomplete lazy import)&lt;/li&gt;
&lt;li&gt;Fixed ENTER on SheetsSheet on SheetsSheet to be no-op&lt;/li&gt;
&lt;li&gt;Fixed readthedocs redirect to visidata.org&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  
  <entry>
    <title>v0.97</title>
    <link href="https://visidata.org/blog/2017/v0.97/"/>
    <updated>2017-10-06T00:00:00Z</updated>
    <id>https://visidata.org/blog/2017/v0.97/</id>
    <content type="html">&lt;p&gt;[originally sent as TinyLetter #1]&lt;/p&gt;
&lt;h2 id=&quot;v097-2017-10-06&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://visidata.org/blog/2017/v0.97/#v097-2017-10-06&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://github.com/saulpw/visidata/releases/tag/v0.97&quot;&gt;v0.97&lt;/a&gt; (2017-10-06)&lt;/h2&gt;
&lt;p&gt;&lt;s&gt;&lt;strong&gt;Important&lt;/strong&gt; If you like VisiData, sign up for the &lt;a href=&quot;https://tinyletter.com/visidata&quot;&gt;newsletter&lt;/a&gt;!&lt;/s&gt;&lt;/p&gt;
&lt;h2 id=&quot;community&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://visidata.org/blog/2017/v0.97/#community&quot;&gt;&lt;/a&gt;Community&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;I&#39;m hanging out in #visidata on freenode! Come by and say hi if you use VisiData. I&#39;d love to know how you&#39;re using it!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;s&gt;r/visidata (on reddit) is the forum for longer-form discussion.&lt;/s&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;See the new webpage at &lt;a href=&quot;http://visidata.org/&quot;&gt;visidata.org&lt;/a&gt;! We migrated away from RTD, as it was too much hassle and limited our functionality.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We have some example tours generated from our automated tests. See &lt;a href=&quot;http://visidata.org/test&quot;&gt;visidata.org/tour&lt;/a&gt;. More will be coming with the next release!&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;v097-has-been-released&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://visidata.org/blog/2017/v0.97/#v097-has-been-released&quot;&gt;&lt;/a&gt;v0.97 has been released&lt;/h2&gt;
&lt;p&gt;The main themes for this release are:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;commandlog replay fully operational (now running both automated tests and generating tours)&lt;/li&gt;
&lt;li&gt;a quick ref guide in man page format (available in visidata via F1, and also online at &lt;a href=&quot;http://visidata.org/man&quot;&gt;visidata.org/man&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://visidata.org/&quot;&gt;visidata.org&lt;/a&gt; is now the primary home page (we&#39;ve transitioned away from readthedocs)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;With this release, VisiData is &lt;em&gt;feature complete&lt;/em&gt;. 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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Here are some more detailed descriptions of what comes with this release:&lt;/p&gt;
&lt;h2 id=&quot;new-loaders&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://visidata.org/blog/2017/v0.97/#new-loaders&quot;&gt;&lt;/a&gt;New Loaders&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;simple remote postgres loader (vd postgres://user:password@dbserver.com:6254/database)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;fixed width column detection (ls -al | vd -f fixed --skiplines 1)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;new-commands-and-options&quot; tabindex=&quot;-1&quot;&gt;&lt;a class=&quot;heading-anchor&quot; href=&quot;https://visidata.org/blog/2017/v0.97/#new-commands-and-options&quot;&gt;&lt;/a&gt;New Commands and Options&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;F1 launches man page quick ref (gF1 now opens the command sheet)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;vd --diff A B shows B with changes from A in red&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;a Describe Sheet with &#39;I&#39; shows basic stats for every column!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;streamlined commandlog (previously called editlog) functionality&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;^D to quickly save the current cmdlog; vd -p cmdlog-1.vd to replay it&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;removed movement commands (use --replay-movement to reinsert movements)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;player piano with --delay (used to make the tours on the website)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;advanced editing, can now make new sheets from whole cloth!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&#39;A&#39; to add a new sheet with some number of columns&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&#39;a&#39; to add a new empty row&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&#39;gz=&#39; set this column in selected rows to values from a python list expression&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&#39;Del&#39;/gDel to clear a cell (set a value to None)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&#39;y&#39; to yank/delete row; &#39;p&#39; to paste&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&#39;zy&#39; to yank (copy) cell contents; &#39;zp&#39; to paste (&#39;gzp&#39; to paste to all selected rows)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&#39;f&#39; to fill null cells with the previous non-null value&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  
  <entry>
    <title>v0.93</title>
    <link href="https://visidata.org/blog/2017/v0.93/"/>
    <updated>2017-07-30T00:00:00Z</updated>
    <id>https://visidata.org/blog/2017/v0.93/</id>
    <content type="html">&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/saulpw/visidata/releases/tag/v0.93&quot;&gt;v0.93&lt;/a&gt; (2017-07-30)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Fix display/feel bugs in &lt;code&gt;editText&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Remove BACKSPACE for editlog undo&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Fix colorizer API&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Add &lt;code&gt;ctrl-u&lt;/code&gt; command to toggle profiling of main thread&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Fix Column statistics (&lt;code&gt;options.col_stats&lt;/code&gt; still disabled by default)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
</feed>