visidata 3.2__tar.gz → 3.3__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (311) hide show
  1. visidata-3.3/CHANGELOG.md +2979 -0
  2. visidata-3.3/CODE_OF_CONDUCT.md +1 -0
  3. visidata-3.3/CONTRIBUTING.md +84 -0
  4. {visidata-3.2 → visidata-3.3}/MANIFEST.in +5 -0
  5. {visidata-3.2/visidata.egg-info → visidata-3.3}/PKG-INFO +3 -3
  6. {visidata-3.2 → visidata-3.3}/README.md +1 -1
  7. visidata-3.3/requirements.scm +20 -0
  8. visidata-3.3/requirements.txt +59 -0
  9. {visidata-3.2 → visidata-3.3}/setup.py +1 -1
  10. {visidata-3.2 → visidata-3.3}/visidata/__init__.py +1 -1
  11. {visidata-3.2 → visidata-3.3}/visidata/_input.py +36 -22
  12. {visidata-3.2 → visidata-3.3}/visidata/_open.py +1 -1
  13. {visidata-3.2 → visidata-3.3}/visidata/basesheet.py +0 -2
  14. {visidata-3.2 → visidata-3.3}/visidata/cliptext.py +4 -1
  15. {visidata-3.2 → visidata-3.3}/visidata/column.py +43 -32
  16. {visidata-3.2 → visidata-3.3}/visidata/deprecated.py +5 -0
  17. {visidata-3.2 → visidata-3.3}/visidata/experimental/liveupdate.py +1 -1
  18. {visidata-3.2 → visidata-3.3}/visidata/features/cmdpalette.py +61 -22
  19. {visidata-3.2 → visidata-3.3}/visidata/features/expand_cols.py +0 -1
  20. {visidata-3.2 → visidata-3.3}/visidata/features/go_col.py +1 -2
  21. {visidata-3.2 → visidata-3.3}/visidata/features/layout.py +1 -2
  22. {visidata-3.2 → visidata-3.3}/visidata/features/reload_every.py +3 -3
  23. {visidata-3.2 → visidata-3.3}/visidata/form.py +6 -5
  24. {visidata-3.2 → visidata-3.3}/visidata/freqtbl.py +2 -2
  25. {visidata-3.2 → visidata-3.3}/visidata/fuzzymatch.py +6 -5
  26. {visidata-3.2 → visidata-3.3}/visidata/guides/CommandsSheet.md +1 -0
  27. {visidata-3.2 → visidata-3.3}/visidata/help.py +20 -2
  28. {visidata-3.2 → visidata-3.3}/visidata/loaders/archive.py +27 -3
  29. {visidata-3.2 → visidata-3.3}/visidata/loaders/csv.py +7 -0
  30. {visidata-3.2 → visidata-3.3}/visidata/macros.py +1 -1
  31. {visidata-3.2 → visidata-3.3}/visidata/main.py +11 -7
  32. {visidata-3.2 → visidata-3.3}/visidata/mainloop.py +1 -1
  33. {visidata-3.2 → visidata-3.3}/visidata/man/vd.1 +13 -4
  34. {visidata-3.2 → visidata-3.3}/visidata/man/vd.txt +23 -4
  35. {visidata-3.2 → visidata-3.3}/visidata/man/visidata.1 +13 -4
  36. {visidata-3.2 → visidata-3.3}/visidata/menu.py +1 -1
  37. {visidata-3.2 → visidata-3.3}/visidata/mouse.py +2 -0
  38. {visidata-3.2 → visidata-3.3}/visidata/movement.py +6 -3
  39. {visidata-3.2 → visidata-3.3}/visidata/save.py +5 -1
  40. {visidata-3.2 → visidata-3.3}/visidata/settings.py +7 -3
  41. {visidata-3.2 → visidata-3.3}/visidata/sheets.py +79 -31
  42. {visidata-3.2 → visidata-3.3}/visidata/sidebar.py +7 -6
  43. {visidata-3.2 → visidata-3.3}/visidata/tests/test_cliptext.py +13 -0
  44. {visidata-3.2 → visidata-3.3}/visidata/tests/test_commands.py +1 -0
  45. {visidata-3.2 → visidata-3.3}/visidata/threads.py +22 -0
  46. {visidata-3.2 → visidata-3.3}/visidata/undo.py +1 -1
  47. {visidata-3.2 → visidata-3.3}/visidata/utils.py +15 -1
  48. {visidata-3.2 → visidata-3.3/visidata.egg-info}/PKG-INFO +3 -3
  49. {visidata-3.2 → visidata-3.3}/visidata.egg-info/SOURCES.txt +5 -0
  50. {visidata-3.2 → visidata-3.3}/LICENSE.gpl3 +0 -0
  51. {visidata-3.2 → visidata-3.3}/bin/vd +0 -0
  52. {visidata-3.2 → visidata-3.3}/bin/vd2to3.vdx +0 -0
  53. {visidata-3.2 → visidata-3.3}/setup.cfg +0 -0
  54. {visidata-3.2 → visidata-3.3}/visidata/__main__.py +0 -0
  55. {visidata-3.2 → visidata-3.3}/visidata/_types.py +0 -0
  56. {visidata-3.2 → visidata-3.3}/visidata/_urlcache.py +0 -0
  57. {visidata-3.2 → visidata-3.3}/visidata/aggregators.py +0 -0
  58. {visidata-3.2 → visidata-3.3}/visidata/apps/__init__.py +0 -0
  59. {visidata-3.2 → visidata-3.3}/visidata/apps/vdsql/__about__.py +0 -0
  60. {visidata-3.2 → visidata-3.3}/visidata/apps/vdsql/__init__.py +0 -0
  61. {visidata-3.2 → visidata-3.3}/visidata/apps/vdsql/__main__.py +0 -0
  62. {visidata-3.2 → visidata-3.3}/visidata/apps/vdsql/_ibis.py +0 -0
  63. {visidata-3.2 → visidata-3.3}/visidata/apps/vdsql/bigquery.py +0 -0
  64. {visidata-3.2 → visidata-3.3}/visidata/apps/vdsql/clickhouse.py +0 -0
  65. {visidata-3.2 → visidata-3.3}/visidata/apps/vdsql/setup.py +0 -0
  66. {visidata-3.2 → visidata-3.3}/visidata/apps/vdsql/snowflake.py +0 -0
  67. {visidata-3.2 → visidata-3.3}/visidata/apps/vgit/__init__.py +0 -0
  68. {visidata-3.2 → visidata-3.3}/visidata/apps/vgit/__main__.py +0 -0
  69. {visidata-3.2 → visidata-3.3}/visidata/apps/vgit/abort.py +0 -0
  70. {visidata-3.2 → visidata-3.3}/visidata/apps/vgit/blame.py +0 -0
  71. {visidata-3.2 → visidata-3.3}/visidata/apps/vgit/branch.py +0 -0
  72. {visidata-3.2 → visidata-3.3}/visidata/apps/vgit/config.py +0 -0
  73. {visidata-3.2 → visidata-3.3}/visidata/apps/vgit/diff.py +0 -0
  74. {visidata-3.2 → visidata-3.3}/visidata/apps/vgit/gitsheet.py +0 -0
  75. {visidata-3.2 → visidata-3.3}/visidata/apps/vgit/grep.py +0 -0
  76. {visidata-3.2 → visidata-3.3}/visidata/apps/vgit/log.py +0 -0
  77. {visidata-3.2 → visidata-3.3}/visidata/apps/vgit/main.py +0 -0
  78. {visidata-3.2 → visidata-3.3}/visidata/apps/vgit/remote.py +0 -0
  79. {visidata-3.2 → visidata-3.3}/visidata/apps/vgit/repos.py +0 -0
  80. {visidata-3.2 → visidata-3.3}/visidata/apps/vgit/setup.py +0 -0
  81. {visidata-3.2 → visidata-3.3}/visidata/apps/vgit/stash.py +0 -0
  82. {visidata-3.2 → visidata-3.3}/visidata/apps/vgit/status.py +0 -0
  83. {visidata-3.2 → visidata-3.3}/visidata/apps/vgit/statusbar.py +0 -0
  84. {visidata-3.2 → visidata-3.3}/visidata/bezier.py +0 -0
  85. {visidata-3.2 → visidata-3.3}/visidata/canvas.py +0 -0
  86. {visidata-3.2 → visidata-3.3}/visidata/canvas_text.py +0 -0
  87. {visidata-3.2 → visidata-3.3}/visidata/choose.py +0 -0
  88. {visidata-3.2 → visidata-3.3}/visidata/clean_names.py +0 -0
  89. {visidata-3.2 → visidata-3.3}/visidata/clipboard.py +0 -0
  90. {visidata-3.2 → visidata-3.3}/visidata/cmdlog.py +0 -0
  91. {visidata-3.2 → visidata-3.3}/visidata/color.py +0 -0
  92. {visidata-3.2 → visidata-3.3}/visidata/ddw/input.ddw +0 -0
  93. {visidata-3.2 → visidata-3.3}/visidata/ddw/regex.ddw +0 -0
  94. {visidata-3.2 → visidata-3.3}/visidata/ddwplay.py +0 -0
  95. {visidata-3.2 → visidata-3.3}/visidata/desktop/visidata.desktop +0 -0
  96. {visidata-3.2 → visidata-3.3}/visidata/editor.py +0 -0
  97. {visidata-3.2 → visidata-3.3}/visidata/errors.py +0 -0
  98. {visidata-3.2 → visidata-3.3}/visidata/experimental/__init__.py +0 -0
  99. {visidata-3.2 → visidata-3.3}/visidata/experimental/diff_sheet.py +0 -0
  100. {visidata-3.2 → visidata-3.3}/visidata/experimental/digit_autoedit.py +0 -0
  101. {visidata-3.2 → visidata-3.3}/visidata/experimental/gdrive.py +0 -0
  102. {visidata-3.2 → visidata-3.3}/visidata/experimental/google.py +0 -0
  103. {visidata-3.2 → visidata-3.3}/visidata/experimental/gsheets.py +0 -0
  104. {visidata-3.2 → visidata-3.3}/visidata/experimental/helloworld.py +0 -0
  105. {visidata-3.2 → visidata-3.3}/visidata/experimental/live_search.py +0 -0
  106. {visidata-3.2 → visidata-3.3}/visidata/experimental/mark.py +0 -0
  107. {visidata-3.2 → visidata-3.3}/visidata/experimental/noahs_tapestry/__init__.py +0 -0
  108. {visidata-3.2 → visidata-3.3}/visidata/experimental/noahs_tapestry/clues.json +0 -0
  109. {visidata-3.2 → visidata-3.3}/visidata/experimental/noahs_tapestry/flame.ddw +0 -0
  110. {visidata-3.2 → visidata-3.3}/visidata/experimental/noahs_tapestry/menorah.ddw +0 -0
  111. {visidata-3.2 → visidata-3.3}/visidata/experimental/noahs_tapestry/noahs.sqlite +0 -0
  112. {visidata-3.2 → visidata-3.3}/visidata/experimental/noahs_tapestry/puzzle0.md +0 -0
  113. {visidata-3.2 → visidata-3.3}/visidata/experimental/noahs_tapestry/puzzle1.md +0 -0
  114. {visidata-3.2 → visidata-3.3}/visidata/experimental/noahs_tapestry/puzzle2.md +0 -0
  115. {visidata-3.2 → visidata-3.3}/visidata/experimental/noahs_tapestry/puzzle3.md +0 -0
  116. {visidata-3.2 → visidata-3.3}/visidata/experimental/noahs_tapestry/puzzle4.md +0 -0
  117. {visidata-3.2 → visidata-3.3}/visidata/experimental/noahs_tapestry/puzzle5.md +0 -0
  118. {visidata-3.2 → visidata-3.3}/visidata/experimental/noahs_tapestry/puzzle6.md +0 -0
  119. {visidata-3.2 → visidata-3.3}/visidata/experimental/noahs_tapestry/puzzle7.md +0 -0
  120. {visidata-3.2 → visidata-3.3}/visidata/experimental/noahs_tapestry/puzzle8.md +0 -0
  121. {visidata-3.2 → visidata-3.3}/visidata/experimental/noahs_tapestry/solutions.json +0 -0
  122. {visidata-3.2 → visidata-3.3}/visidata/experimental/noahs_tapestry/tapestry.ddw +0 -0
  123. {visidata-3.2 → visidata-3.3}/visidata/experimental/noahs_tapestry/tapestry.py +0 -0
  124. {visidata-3.2 → visidata-3.3}/visidata/experimental/rownum.py +0 -0
  125. {visidata-3.2 → visidata-3.3}/visidata/experimental/slide_cells.py +0 -0
  126. {visidata-3.2 → visidata-3.3}/visidata/experimental/sort_selected.py +0 -0
  127. {visidata-3.2 → visidata-3.3}/visidata/expr.py +0 -0
  128. {visidata-3.2 → visidata-3.3}/visidata/extensible.py +0 -0
  129. {visidata-3.2 → visidata-3.3}/visidata/features/__init__.py +0 -0
  130. {visidata-3.2 → visidata-3.3}/visidata/features/addcol_audiometadata.py +0 -0
  131. {visidata-3.2 → visidata-3.3}/visidata/features/addcol_histogram.py +0 -0
  132. {visidata-3.2 → visidata-3.3}/visidata/features/canvas_save_svg.py +0 -0
  133. {visidata-3.2 → visidata-3.3}/visidata/features/change_precision.py +0 -0
  134. {visidata-3.2 → visidata-3.3}/visidata/features/colorbrewer.py +0 -0
  135. {visidata-3.2 → visidata-3.3}/visidata/features/colorsheet.py +0 -0
  136. {visidata-3.2 → visidata-3.3}/visidata/features/command_server.py +0 -0
  137. {visidata-3.2 → visidata-3.3}/visidata/features/currency_to_usd.py +0 -0
  138. {visidata-3.2 → visidata-3.3}/visidata/features/customdate.py +0 -0
  139. {visidata-3.2 → visidata-3.3}/visidata/features/dedupe.py +0 -0
  140. {visidata-3.2 → visidata-3.3}/visidata/features/describe.py +0 -0
  141. {visidata-3.2 → visidata-3.3}/visidata/features/fill.py +0 -0
  142. {visidata-3.2 → visidata-3.3}/visidata/features/freeze.py +0 -0
  143. {visidata-3.2 → visidata-3.3}/visidata/features/graph_seaborn.py +0 -0
  144. {visidata-3.2 → visidata-3.3}/visidata/features/graph_zoom_y.py +0 -0
  145. {visidata-3.2 → visidata-3.3}/visidata/features/hint_types.py +0 -0
  146. {visidata-3.2 → visidata-3.3}/visidata/features/incr.py +0 -0
  147. {visidata-3.2 → visidata-3.3}/visidata/features/join.py +0 -0
  148. {visidata-3.2 → visidata-3.3}/visidata/features/known_cols.py +0 -0
  149. {visidata-3.2 → visidata-3.3}/visidata/features/melt.py +0 -0
  150. {visidata-3.2 → visidata-3.3}/visidata/features/normcol.py +0 -0
  151. {visidata-3.2 → visidata-3.3}/visidata/features/open_config.py +0 -0
  152. {visidata-3.2 → visidata-3.3}/visidata/features/open_syspaste.py +0 -0
  153. {visidata-3.2 → visidata-3.3}/visidata/features/ping.py +0 -0
  154. {visidata-3.2 → visidata-3.3}/visidata/features/procmgr.py +0 -0
  155. {visidata-3.2 → visidata-3.3}/visidata/features/random_sample.py +0 -0
  156. {visidata-3.2 → visidata-3.3}/visidata/features/rank.py +0 -0
  157. {visidata-3.2 → visidata-3.3}/visidata/features/regex.py +0 -0
  158. {visidata-3.2 → visidata-3.3}/visidata/features/rename_col_cascade.py +0 -0
  159. {visidata-3.2 → visidata-3.3}/visidata/features/repeat.py +0 -0
  160. {visidata-3.2 → visidata-3.3}/visidata/features/scroll_context.py +0 -0
  161. {visidata-3.2 → visidata-3.3}/visidata/features/select_equal_selected.py +0 -0
  162. {visidata-3.2 → visidata-3.3}/visidata/features/setcol_fake.py +0 -0
  163. {visidata-3.2 → visidata-3.3}/visidata/features/slide.py +0 -0
  164. {visidata-3.2 → visidata-3.3}/visidata/features/sparkline.py +0 -0
  165. {visidata-3.2 → visidata-3.3}/visidata/features/status_source.py +0 -0
  166. {visidata-3.2 → visidata-3.3}/visidata/features/sysedit.py +0 -0
  167. {visidata-3.2 → visidata-3.3}/visidata/features/sysopen_mailcap.py +0 -0
  168. {visidata-3.2 → visidata-3.3}/visidata/features/term_extras.py +0 -0
  169. {visidata-3.2 → visidata-3.3}/visidata/features/transpose.py +0 -0
  170. {visidata-3.2 → visidata-3.3}/visidata/features/type_ipaddr.py +0 -0
  171. {visidata-3.2 → visidata-3.3}/visidata/features/type_url.py +0 -0
  172. {visidata-3.2 → visidata-3.3}/visidata/features/unfurl.py +0 -0
  173. {visidata-3.2 → visidata-3.3}/visidata/features/window.py +0 -0
  174. {visidata-3.2 → visidata-3.3}/visidata/graph.py +0 -0
  175. {visidata-3.2 → visidata-3.3}/visidata/guide.py +0 -0
  176. {visidata-3.2 → visidata-3.3}/visidata/guides/AggregatorsSheet.md +0 -0
  177. {visidata-3.2 → visidata-3.3}/visidata/guides/ClipboardGuide.md +0 -0
  178. {visidata-3.2 → visidata-3.3}/visidata/guides/ColumnsGuide.md +0 -0
  179. {visidata-3.2 → visidata-3.3}/visidata/guides/DirSheet.md +0 -0
  180. {visidata-3.2 → visidata-3.3}/visidata/guides/ErrorsSheet.md +0 -0
  181. {visidata-3.2 → visidata-3.3}/visidata/guides/FrequencyTable.md +0 -0
  182. {visidata-3.2 → visidata-3.3}/visidata/guides/GrepSheet.md +0 -0
  183. {visidata-3.2 → visidata-3.3}/visidata/guides/JsonSheet.md +0 -0
  184. {visidata-3.2 → visidata-3.3}/visidata/guides/MacrosSheet.md +0 -0
  185. {visidata-3.2 → visidata-3.3}/visidata/guides/MeltGuide.md +0 -0
  186. {visidata-3.2 → visidata-3.3}/visidata/guides/MemorySheet.md +0 -0
  187. {visidata-3.2 → visidata-3.3}/visidata/guides/MenuGuide.md +0 -0
  188. {visidata-3.2 → visidata-3.3}/visidata/guides/ModifyGuide.md +0 -0
  189. {visidata-3.2 → visidata-3.3}/visidata/guides/PivotGuide.md +0 -0
  190. {visidata-3.2 → visidata-3.3}/visidata/guides/RankGuide.md +0 -0
  191. {visidata-3.2 → visidata-3.3}/visidata/guides/RegexGuide.md +0 -0
  192. {visidata-3.2 → visidata-3.3}/visidata/guides/SelectionGuide.md +0 -0
  193. {visidata-3.2 → visidata-3.3}/visidata/guides/SlideGuide.md +0 -0
  194. {visidata-3.2 → visidata-3.3}/visidata/guides/SplitpaneGuide.md +0 -0
  195. {visidata-3.2 → visidata-3.3}/visidata/guides/TypesSheet.md +0 -0
  196. {visidata-3.2 → visidata-3.3}/visidata/guides/WindowFunctionGuide.md +0 -0
  197. {visidata-3.2 → visidata-3.3}/visidata/guides/XsvGuide.md +0 -0
  198. {visidata-3.2 → visidata-3.3}/visidata/hint.py +0 -0
  199. {visidata-3.2 → visidata-3.3}/visidata/indexsheet.py +0 -0
  200. {visidata-3.2 → visidata-3.3}/visidata/input_history.py +0 -0
  201. {visidata-3.2 → visidata-3.3}/visidata/interface.py +0 -0
  202. {visidata-3.2 → visidata-3.3}/visidata/keys.py +0 -0
  203. {visidata-3.2 → visidata-3.3}/visidata/loaders/__init__.py +0 -0
  204. {visidata-3.2 → visidata-3.3}/visidata/loaders/_pandas.py +0 -0
  205. {visidata-3.2 → visidata-3.3}/visidata/loaders/api_airtable.py +0 -0
  206. {visidata-3.2 → visidata-3.3}/visidata/loaders/api_matrix.py +0 -0
  207. {visidata-3.2 → visidata-3.3}/visidata/loaders/api_reddit.py +0 -0
  208. {visidata-3.2 → visidata-3.3}/visidata/loaders/api_zulip.py +0 -0
  209. {visidata-3.2 → visidata-3.3}/visidata/loaders/arrow.py +0 -0
  210. {visidata-3.2 → visidata-3.3}/visidata/loaders/conll.py +0 -0
  211. {visidata-3.2 → visidata-3.3}/visidata/loaders/eml.py +0 -0
  212. {visidata-3.2 → visidata-3.3}/visidata/loaders/f5log.py +0 -0
  213. {visidata-3.2 → visidata-3.3}/visidata/loaders/fec.py +0 -0
  214. {visidata-3.2 → visidata-3.3}/visidata/loaders/fixed_width.py +0 -0
  215. {visidata-3.2 → visidata-3.3}/visidata/loaders/frictionless.py +0 -0
  216. {visidata-3.2 → visidata-3.3}/visidata/loaders/geojson.py +0 -0
  217. {visidata-3.2 → visidata-3.3}/visidata/loaders/google.py +0 -0
  218. {visidata-3.2 → visidata-3.3}/visidata/loaders/graphviz.py +0 -0
  219. {visidata-3.2 → visidata-3.3}/visidata/loaders/grep.py +0 -0
  220. {visidata-3.2 → visidata-3.3}/visidata/loaders/hdf5.py +0 -0
  221. {visidata-3.2 → visidata-3.3}/visidata/loaders/html.py +0 -0
  222. {visidata-3.2 → visidata-3.3}/visidata/loaders/http.py +0 -0
  223. {visidata-3.2 → visidata-3.3}/visidata/loaders/imap.py +0 -0
  224. {visidata-3.2 → visidata-3.3}/visidata/loaders/jrnl.py +0 -0
  225. {visidata-3.2 → visidata-3.3}/visidata/loaders/json.py +0 -0
  226. {visidata-3.2 → visidata-3.3}/visidata/loaders/jsonla.py +0 -0
  227. {visidata-3.2 → visidata-3.3}/visidata/loaders/lsv.py +0 -0
  228. {visidata-3.2 → visidata-3.3}/visidata/loaders/mailbox.py +0 -0
  229. {visidata-3.2 → visidata-3.3}/visidata/loaders/markdown.py +0 -0
  230. {visidata-3.2 → visidata-3.3}/visidata/loaders/mbtiles.py +0 -0
  231. {visidata-3.2 → visidata-3.3}/visidata/loaders/msgpack.py +0 -0
  232. {visidata-3.2 → visidata-3.3}/visidata/loaders/mysql.py +0 -0
  233. {visidata-3.2 → visidata-3.3}/visidata/loaders/npy.py +0 -0
  234. {visidata-3.2 → visidata-3.3}/visidata/loaders/odf.py +0 -0
  235. {visidata-3.2 → visidata-3.3}/visidata/loaders/orgmode.py +0 -0
  236. {visidata-3.2 → visidata-3.3}/visidata/loaders/pandas_freqtbl.py +0 -0
  237. {visidata-3.2 → visidata-3.3}/visidata/loaders/parquet.py +0 -0
  238. {visidata-3.2 → visidata-3.3}/visidata/loaders/pcap.py +0 -0
  239. {visidata-3.2 → visidata-3.3}/visidata/loaders/pdf.py +0 -0
  240. {visidata-3.2 → visidata-3.3}/visidata/loaders/png.py +0 -0
  241. {visidata-3.2 → visidata-3.3}/visidata/loaders/postgres.py +0 -0
  242. {visidata-3.2 → visidata-3.3}/visidata/loaders/psv.py +0 -0
  243. {visidata-3.2 → visidata-3.3}/visidata/loaders/rec.py +0 -0
  244. {visidata-3.2 → visidata-3.3}/visidata/loaders/s3.py +0 -0
  245. {visidata-3.2 → visidata-3.3}/visidata/loaders/sas.py +0 -0
  246. {visidata-3.2 → visidata-3.3}/visidata/loaders/scrape.py +0 -0
  247. {visidata-3.2 → visidata-3.3}/visidata/loaders/shp.py +0 -0
  248. {visidata-3.2 → visidata-3.3}/visidata/loaders/spss.py +0 -0
  249. {visidata-3.2 → visidata-3.3}/visidata/loaders/sqlite.py +0 -0
  250. {visidata-3.2 → visidata-3.3}/visidata/loaders/texttables.py +0 -0
  251. {visidata-3.2 → visidata-3.3}/visidata/loaders/toml.py +0 -0
  252. {visidata-3.2 → visidata-3.3}/visidata/loaders/tsv.py +0 -0
  253. {visidata-3.2 → visidata-3.3}/visidata/loaders/ttf.py +0 -0
  254. {visidata-3.2 → visidata-3.3}/visidata/loaders/unzip_http.py +0 -0
  255. {visidata-3.2 → visidata-3.3}/visidata/loaders/usv.py +0 -0
  256. {visidata-3.2 → visidata-3.3}/visidata/loaders/vcf.py +0 -0
  257. {visidata-3.2 → visidata-3.3}/visidata/loaders/vds.py +0 -0
  258. {visidata-3.2 → visidata-3.3}/visidata/loaders/vdx.py +0 -0
  259. {visidata-3.2 → visidata-3.3}/visidata/loaders/xlsb.py +0 -0
  260. {visidata-3.2 → visidata-3.3}/visidata/loaders/xlsx.py +0 -0
  261. {visidata-3.2 → visidata-3.3}/visidata/loaders/xml.py +0 -0
  262. {visidata-3.2 → visidata-3.3}/visidata/loaders/xword.py +0 -0
  263. {visidata-3.2 → visidata-3.3}/visidata/loaders/yaml.py +0 -0
  264. {visidata-3.2 → visidata-3.3}/visidata/macos.py +0 -0
  265. {visidata-3.2 → visidata-3.3}/visidata/man/parse_options.py +0 -0
  266. {visidata-3.2 → visidata-3.3}/visidata/memory.py +0 -0
  267. {visidata-3.2 → visidata-3.3}/visidata/metasheets.py +0 -0
  268. {visidata-3.2 → visidata-3.3}/visidata/modify.py +0 -0
  269. {visidata-3.2 → visidata-3.3}/visidata/motd.py +0 -0
  270. {visidata-3.2 → visidata-3.3}/visidata/optionssheet.py +0 -0
  271. {visidata-3.2 → visidata-3.3}/visidata/path.py +0 -0
  272. {visidata-3.2 → visidata-3.3}/visidata/pivot.py +0 -0
  273. {visidata-3.2 → visidata-3.3}/visidata/plugins.py +0 -0
  274. {visidata-3.2 → visidata-3.3}/visidata/pyobj.py +0 -0
  275. {visidata-3.2 → visidata-3.3}/visidata/rename_col.py +0 -0
  276. {visidata-3.2 → visidata-3.3}/visidata/search.py +0 -0
  277. {visidata-3.2 → visidata-3.3}/visidata/selection.py +0 -0
  278. {visidata-3.2 → visidata-3.3}/visidata/shell.py +0 -0
  279. {visidata-3.2 → visidata-3.3}/visidata/sort.py +0 -0
  280. {visidata-3.2 → visidata-3.3}/visidata/statusbar.py +0 -0
  281. {visidata-3.2 → visidata-3.3}/visidata/stored_list.py +0 -0
  282. {visidata-3.2 → visidata-3.3}/visidata/tests/__init__.py +0 -0
  283. {visidata-3.2 → visidata-3.3}/visidata/tests/benchmark.csv +0 -0
  284. {visidata-3.2 → visidata-3.3}/visidata/tests/conftest.py +0 -0
  285. {visidata-3.2 → visidata-3.3}/visidata/tests/sample.tsv +0 -0
  286. {visidata-3.2 → visidata-3.3}/visidata/tests/test_completer.py +0 -0
  287. {visidata-3.2 → visidata-3.3}/visidata/tests/test_date.py +0 -0
  288. {visidata-3.2 → visidata-3.3}/visidata/tests/test_edittext.py +0 -0
  289. {visidata-3.2 → visidata-3.3}/visidata/tests/test_features.py +0 -0
  290. {visidata-3.2 → visidata-3.3}/visidata/tests/test_menu.py +0 -0
  291. {visidata-3.2 → visidata-3.3}/visidata/tests/test_path.py +0 -0
  292. {visidata-3.2 → visidata-3.3}/visidata/text_source.py +0 -0
  293. {visidata-3.2 → visidata-3.3}/visidata/textsheet.py +0 -0
  294. {visidata-3.2 → visidata-3.3}/visidata/theme.py +0 -0
  295. {visidata-3.2 → visidata-3.3}/visidata/themes/__init__.py +0 -0
  296. {visidata-3.2 → visidata-3.3}/visidata/themes/ascii8.py +0 -0
  297. {visidata-3.2 → visidata-3.3}/visidata/themes/asciimono.py +0 -0
  298. {visidata-3.2 → visidata-3.3}/visidata/themes/light.py +0 -0
  299. {visidata-3.2 → visidata-3.3}/visidata/tuiwin.py +0 -0
  300. {visidata-3.2 → visidata-3.3}/visidata/type_currency.py +0 -0
  301. {visidata-3.2 → visidata-3.3}/visidata/type_date.py +0 -0
  302. {visidata-3.2 → visidata-3.3}/visidata/type_floatsi.py +0 -0
  303. {visidata-3.2 → visidata-3.3}/visidata/vdobj.py +0 -0
  304. {visidata-3.2 → visidata-3.3}/visidata/vendor/__init__.py +0 -0
  305. {visidata-3.2 → visidata-3.3}/visidata/vendor/appdirs.py +0 -0
  306. {visidata-3.2 → visidata-3.3}/visidata/windows.py +0 -0
  307. {visidata-3.2 → visidata-3.3}/visidata/wrappers.py +0 -0
  308. {visidata-3.2 → visidata-3.3}/visidata.egg-info/dependency_links.txt +0 -0
  309. {visidata-3.2 → visidata-3.3}/visidata.egg-info/entry_points.txt +0 -0
  310. {visidata-3.2 → visidata-3.3}/visidata.egg-info/requires.txt +0 -0
  311. {visidata-3.2 → visidata-3.3}/visidata.egg-info/top_level.txt +0 -0
@@ -0,0 +1,2979 @@
1
+ # VisiData version history
2
+
3
+ # v3.3 (2025-09-07)
4
+
5
+ - added options.disp_help_flags; deprecated options.disp_expert
6
+ - these feature flags are supported: cmdpalette hints nometacols guides inputkeys inputfield all
7
+ - see helpstr for more details
8
+ - set option to '' to turn off all help overlays
9
+
10
+ - fix: include missing files in MANIFEST.in @chenrui333
11
+
12
+ Thanks to @midichef for most of the other bugfixes and improvements.
13
+
14
+ ## Improvements
15
+
16
+ - [csv] auto-detect CSV format when csv_delimiter is specified @dennisangemi
17
+ - [basesheet-] start new column names fresh for each sheet
18
+
19
+ - [form-] after confirm, Esc/^C/^Q/q show disconfirm msg
20
+
21
+ - [cmdpalette-] add instruction to use Esc to cancel
22
+ - [cmdpalette-] keep case of results, allow case-sensitive search
23
+ - [cmdpalette-] scroll choices with PageUp/PageDown
24
+ - [cmdpalette-] hide choices that do not match input
25
+
26
+ - [save-] suggest 'stdin' as filename base instead of '-'
27
+ - [sheets-] on reload, fetch fresh data for URLs
28
+ - [tar-] add cols for ext and file type desc, use name as keycol
29
+ - performance improvements
30
+ - display improvements
31
+
32
+ ## Bugfixes
33
+
34
+ - [archive-] fix extracting to a chosen path
35
+ - [archive-] fix error extracting to overwrite existing file
36
+ - [archive-] fix loading zip files from inside archive files
37
+
38
+ - [cliptext-] fix display of empty markup as several blank lines
39
+ - [cliptext-] restore display translation of unprintable chars
40
+ - [sheets-] remove calcSingleColLayout use of inaccurate visibleRows
41
+
42
+ - [plugins liveupdate-] fix broken addcol-new
43
+
44
+ - [curses-] fix crash on startup on NetBSD (and probably other \*BSD) wscons tty consoles, which do not expose "mousemask" in their system curses implementations. @rsmirnov90
45
+ - [input-] fix editText for files on command line with -b -i -p (#2840)
46
+ - [plugin-] fix autoload for Python versions < 3.10
47
+
48
+ - [macro-] fix corruption when saving macros after deletion #2787
49
+ - [reload-] wait for any previous reload_rows to finish #2808
50
+ - [resize-] fix resize-col-half for new columns with no rows #2795
51
+ - [sheet-] fix reload on sheets without col layout #2790
52
+ - [status] fix error when no help_sidebars
53
+
54
+ ## Cosmetic
55
+
56
+ - [freqtbl-] stop printing status for selection on source sheet
57
+ - [input-] handle screen resize during inputMultiple(), editCell(), input()
58
+
59
+ # API
60
+
61
+ - [threads-] add asyncsingle_queue decorator
62
+
63
+ # v3.2 (2025-06-15)
64
+
65
+ Thanks to @midichef for many bugfixes and improvements.
66
+
67
+ ## Improvements
68
+
69
+ * [config] XDG for default visidata_dir #2716 (#2755)
70
+ - [dev] add Python 3.13 test coverage
71
+
72
+ - [windows] install vd.cmd #2619 @ptyork
73
+ * [windows] Enable Windows clipboard in WSL #1920 @daviewales
74
+ - [windows] update windows-curses version to 2.4.1 #2119
75
+ * [windows] fix mouse support #2676 @ptyork
76
+
77
+ - [sort] allow z[ and z] to reverse col sort dir or ignore col
78
+ - [sort] replay sort-add/-change ordering from cmdlog input arg
79
+ - [sort] add sort order to ColumnsSheet #2649
80
+
81
+ * [loaders psv] add simple .psv loader based on Tsv sheet #2727
82
+ * [loaders numpy] support 2d matrices (#2724) @maxfl
83
+
84
+ ### Commands
85
+
86
+ * [aggr] addcol-aggregate and addcol-rank-sheet
87
+ - [edit] add sysedit-cell command, using external editor
88
+ - [errors] add sysopen-error command to view vd source code in editor
89
+ - [freeze] add setcol-freeze, bind to z' #2260
90
+ - [graph] add zoom-all-y #2751
91
+ - [join] add per-jointype commands #2603
92
+ - [layout] bind g- to hide-uniform-cols #2577 #2735
93
+ - [syscopy] add syscol-colname #2760
94
+
95
+ ### Options
96
+
97
+ - [draw] add options.color_multiline_bottom #2715
98
+ - [graph] add options.color_graph_refline
99
+ - [disp] Rename options.disp_pixel_random to options.disp_graph_pixel_random @cool-RR
100
+
101
+ ### Tweaks
102
+
103
+ * [cmdpalette-] fix scoring of space-separated search terms
104
+ * [cmdpalette-] make fuzzy match case-insensitive
105
+ * [docs] Add WindowFunctionGuide and AggregatorSheet guides #2558 @thejud
106
+ * [theme] update light theme #2729
107
+ * [status] remove non-precious sheets from sheetlist #2573
108
+ - [input-] fix word locator for Ctrl+Right motion
109
+ - [input-] allow edit of cell in hidden column #2749
110
+ - [errors-] make ErrorSheet/ErrorsSheet into singletons
111
+ - [threads-] make threads-all show a singleton sheet
112
+ - [threads-] allow repeated toggling of profiling
113
+ - [IndexSheet] move gC and gI to IndexSheet #2603
114
+ - [main-] enable cell editing for interactive batch mode #2639
115
+ - [loaders hdf5] guess types(hdf5), understand unsigned int type @maxfl
116
+ - [loaders archive,sqlite-] guess sqlite/tar/zip filetypes confidently
117
+ - [loaders vds-] save/restore column-specific properties via getstate/setstate #2699
118
+
119
+ ## Bugfixes
120
+
121
+ - [aggr-] allow undo for aggregate-col/cols
122
+ - [aggr-] cap runtime when formatting memo status
123
+ - [canvas-] stop infinite refresh for graphs with many points
124
+ - [cmdlog-] save prev replay when starting new replay #2531
125
+ - [deprecated-] show warning when using deprecated commands #2215
126
+ - [features-] reload_every: wait for reload before looping
127
+ - [features-] sysedit: modify cell only if editor changes value (#2656)
128
+ * [freqtbl-] fix excessive memory usage for undo of selections #2759
129
+ - [incr-] addcol-incr-step as expected #2769
130
+ - [input-] preserve None cells on external editor quit
131
+ - [join-] fix putValue for merge rows absent in any source sheet
132
+ - [layout-] change resize-cols-max into a toggle #2782
133
+ - [macro-] only record commands that are replayable
134
+ - [mailcap] install dead battery for mailcap in python 3.13 #2576
135
+ - [main-] prevent hang when vd -p - reads from terminal
136
+ - [npy-] fix bug truncating cols wider than window #2783
137
+ - [open-] fix open-file for - in cmdlogs #2582
138
+ - [open-] fix opening a dir with an filetype extension
139
+ - [reload-] have reload-modified check for earlier changes #2551
140
+ - [save-] fix error string
141
+ - [sheets-] record key-col toggle for replay as key-col-on/-off
142
+ - [sort-] fix undo when sheet has a previous ordering
143
+ - [undo-] fix undo editing cells in ValueColumn, ExpandedColumn, ColumnSourceAttr #2765
144
+ - [vdsql-] ensure each thread in vdsql tracks its single connection
145
+
146
+ ## Cosmetic
147
+
148
+ - [cliptext-] truncate sheet names handling full-width chars
149
+ - [column-] do not rjustify non-numeric values #2750
150
+ - [csv-] warn when guessed option differs from default #2690
151
+ - [dir-] sort by filename, after sorting by modtime
152
+ - [errors-] fix error-recent always showing "no error"
153
+ - [fixed loader] use empty str for null_value in fixed width sheet
154
+ - [form-] fix underlining of substrings by FormCanvas
155
+ - [help- sidebar-] prevent sidebar flicker #2630
156
+ - [help] fix duplicate help descriptions #2762
157
+ - [input-] fix editline() for characters having screen width > 1
158
+ - [input-] speed up pasting long strings into line editor
159
+ - [input-] fix off-by-1 when drawing at right edge of screen
160
+ - [main-] format vd_cli exceptions to be caretless
161
+ - [menu-] remove duplicate Help entry #2714
162
+ - [menu] replace hint with motd
163
+ - [reload-] tolerate stale columns in drawcache during allAggregators #2607 #2763
164
+ - [save-] warn if no save destination given #2580
165
+ - [status] use sheet.icon on sheetlist #2772
166
+ - [threads-] catch error trying to start a second profiler
167
+
168
+ # v3.1 (2024-10-14)
169
+
170
+ - drop support for Python 3.7 #2231
171
+ - [vdsql] bump ibis dep to v8
172
+ - [test] fix minimum pandas version to 1.5.3
173
+
174
+ ## Improvements
175
+
176
+ - [sidebar] Ctrl+G to cycle sidebar (including off) in both main and input modes #2202
177
+ - [sidebar help] rightmost statusline ({vd.sidebarStatus}) shows number of help sidebars (clickable to toggle sidebar)
178
+ - [sheet tabs] left statusline sheet tabs (clickable to jump to sheet) #2030
179
+ - [aggregators] immediate async summary of column aggregators on bottom rows #2209
180
+ - [graph] reflines at user-defined x or y #2487
181
+ - [guides] add several guides (thanks to @thejud @reagle @ajkerrigan @anjakefala)
182
+ - [expressions] much cleanup
183
+ - `row["colname"]` to refer to a specific column by name, without needing to be a valid identifier #2539
184
+ - `_row` is underlying row object
185
+ - support curcol in g= and select and search expressions #2524
186
+ - $curcol for addcol-sh
187
+ - globals include most symbols from math by default; also datetime and date both as the vd.date subclass
188
+ - [input] memory variables included as autocomplete keys #2509
189
+
190
+ ## Tweaks
191
+
192
+ - [history] create visidata_dir (default ~/.visidata/) if not exists to enable input history by default #2298
193
+ - [cli] "-p -" replays stdin as a .vdj file
194
+ - [guide] allow front matter in guide .md files; "sheettype" metadata to associate with a sheet
195
+ - [cmdpalette] do not fuzzymatch keys that start with _
196
+ - [interface] hidden columns minutely visible past right of sheet; `_` to re-expand #2394
197
+ - [interface] record all commands in macro (even replay=False); add status indicator when recording #2435
198
+ - [interface] clickable cell error symbol
199
+ - [interface] default theme color improvements, including a slight bg glow for cursor column
200
+ - [aggregators] add keymin; handle corner cases #2308
201
+ - many small interface improvements: error messages, clarifications, edge cases, guardrails. (thanks to @midichef for many of these)
202
+
203
+ ## Options
204
+
205
+ - max_rows to stop loading early #2356
206
+ - [xlsx] add xlsx_color_cells (default: True); set to False to disable xlsx cell colorizers
207
+ - regex_skip is now replayable
208
+ - disp_multiline_focus to only expand cursor row when multiline enabled #2205
209
+ - disp_expert (int); set to 1 to enable advanced interface elements and unhide advanced columns by default; set to 5 (or greater) to disable input palette and help sidebars
210
+ - pass disp_wrap_* to textwrap for multiline display #2506
211
+ - rename note_* to disp_note_* #2381
212
+ - separate color_longname into color_longname_status and color_longname_guide
213
+
214
+ ## Commands
215
+
216
+ - addcol-histogram to make histogram from any numeric column #2208
217
+ - exec-longname-simple for single-line (non-palette) input
218
+ - go-col-name to go to a column by name
219
+ - [dir] open-row-filetype to open row using the given filetype
220
+ - [graph] plot-source-selected on ColumnsSheet #2424
221
+ - [experimental] sort-selected-asc/desc #2295
222
+ - deprecate view-cell #2381
223
+ - unfurl finishes with column cursor on unfurled column
224
+
225
+ ## API
226
+
227
+ - [command] addCommand(..., replay=False) to not add to cmdlog
228
+ - [sort] add Sheet.ordering property as list[tuple[Column,bool]] #2295
229
+ - [path] note nonstandard behavior of RepeatFile.read()
230
+ - [input] allow different record kwarg for different fields in inputMultiple
231
+
232
+ ## Loaders
233
+
234
+ - [msgpack] new loader #2419
235
+ - [grep] new loader for output of grep/ripgrep #2443
236
+ - [csv] display loading/saving progress
237
+ - [csv] handle more dialect parameters from Sniffer
238
+ - [csv tsv] remove default regex_skip of hash lines #2458
239
+ - [eml] save email parts without filenames #2376
240
+ - [fixed] skip separating space in fixed_width loader #2255
241
+ - [json] remove column type inference #2475 #2131
242
+ - [json] warn if some cols/sheets were not saved #2199
243
+ - [markdown] use col_href as link for col
244
+ - [ods] strip empty cells/rows from end #2440
245
+ - [rec] roundtrippable
246
+ - [sas] allow edits to source sheet
247
+ - [save] derived null in text formats should be empty string #2476
248
+ - [save] handle empty delimiter when options.safety_first
249
+ - [text] do not strip lines of whitespace #2328
250
+ - [tsv] allow empty regex_skip
251
+ - [tsv] allow saving with NUL delimiters
252
+ - [tsv] if field or row delimiter is NUL, disable regex skipping
253
+ - [vds] allow sheets with no rows #2342
254
+ - [xml] save XML as utf-8 instead of utf-8-sig #2520
255
+
256
+ ## Bugfixes
257
+
258
+ - [command] addcol-sh: ensure arguments are properly quoted #2415
259
+ - [selection] make toggle thread-safe for FreqTableSheet #1671
260
+ - [undo] prevent undo of command that created sheet #2244
261
+ - [undo] cmdlog always use rowidx, not rowkey #2246
262
+ - [cliptext] fix onclick url #2466
263
+ - [mouse] fix mouse-disable #2379
264
+ - [sort] do not modify Sheet._ordering #2254
265
+ - [bindings] do not re-prettykeys; call prettykeys for all bindkey() too #2247
266
+ - [terminal] add no-op for ANSI focus-in and focus-in #2247
267
+ - [sort] add _ordering to Sheet class instead of __init__ #2190
268
+ - [transpose] allow to set values #2548
269
+ - [sheet] make 20 tabs clickable #2030
270
+ - [macro] do not record macro inner steps #2531
271
+ - [filetype] use correct case for file extension determination #2263
272
+ - [replay] stop stderr batch progress when interactive #2251
273
+ - [replay] wait for replay to start before stderr progress #2251
274
+ - [replay] fix rare duplication of replay cmds #2392
275
+ - and many more
276
+
277
+ # v3.0.2 (2024-01-15)
278
+
279
+ ### Fixes and minor improvements
280
+
281
+ - [cli] add `--guides` to open the guide index
282
+ - [cmdpalette] only first 10 suggestions should have shortcut keys #2242
283
+ - [draw] use default bg on col hdr sep
284
+ - [input] draw help sidebar on top of sheet/updater #2241
285
+ - [graph] sort by x and y columns when diving (PR by @midichef #2226)
286
+ - [guides] improve formatting of command and options in sidebar + guides
287
+ - [replay] stop stderr batch progress when entering interactive mode #2251
288
+ - [shell] clean up DirSheet sidebar
289
+ - [sidebar] grab user's keystroke of sidebar-toggle for helpstring #2250
290
+ - [sort] a better fix for maintaining sort ordering on sheet copies #2190 #2254
291
+ - [tests] add "test" extras for installing PyPI packages needed to run tests
292
+
293
+ # v3.0.1 (2024-01-07)
294
+
295
+ ### Fixes and minor improvements
296
+
297
+ - [color] add `color_longname` to use instead of `color_keystrokes` #2219
298
+ - [columns] add `displayer` attribute to saved column state
299
+ - [cmdpalette] Enter executes first row, if partially typed out #2219
300
+ - [cmdpalette] add sidebar for longname and aggregator palette #2219
301
+ - [guide] add `show-command-info` to display command info for a keystroke #2228
302
+ - [keys] add `*BtnUp` pretty keys for `BUTTON#_RELEASED` #2219
303
+ - [dup-selected] dup-selected should unselect all rows in copied sheet #2225
304
+ - [expr] fix KeyError crash with invalid inputs in `expr` for Python 3.12 #2179
305
+ - [help] fix columns sheet sidebar
306
+ - [loaders html] ignore parsing exceptions on invalid urls #2227
307
+ - [sheets] limit end separators to rightmost visible column of sheet (PR by @midichef #2237)
308
+ - [sidebar] fix fmtstr for case where source is BaseSheet #2239
309
+ - [sort] maintain ordering on sheet copies #2190
310
+ - [test] update unit tests to use packaged sample.tsv and benchmark.csv #2218
311
+ - [threads] do not try to cancel already finished thread #2235
312
+ - [tests] add `assert-expr` and `assert-expr-row` to evaluate Python expressions, and assert result is truthy
313
+ - [tests] parametrize feature tests (PR by @ajkerrigan #2230)
314
+
315
+ # v3.0 (2023-12-30)
316
+
317
+ - [reorg] move independent modules into visidata/{features|experimental|themes}
318
+ - [sidebar] add sidebar #2064
319
+ - #1733 for full description/discussion
320
+ - will contain a stack list of status messages
321
+ - color syntax is [:bold]footext[/]
322
+ - supports `[:code]`, `[:bold]`, `[:italic]`, `[:underline]`, `[:onclick]` (makes a clickable link), `[heading]`
323
+ - [:] at terminal clears; [/] at terminal pops
324
+ - supports basic markdown for colouring
325
+ - toggle with `sidebar-toggle` (bound to `b`)
326
+ - make bottom msg entirely clickable
327
+ - make dedent and header parsing standard
328
+ - add `options.disp_sidebar`
329
+ - make sheet name clickable to open **Sheets Stack**
330
+ - make options clickable
331
+ - add `open-sidebar` (bound to `gb`) to open sidebar in new sheet
332
+ - display sheet and feature help documentation in sidebar
333
+ - added bundles of Guide Sheets
334
+ - open Guide Sheets into a full VisiData sheet with `Enter`
335
+ - added `options.disp_help` (default: 2), an integer and to set novice/expert mode. (#1961)
336
+ When `disp_help` is:
337
+ - -1: status messages aren't shown
338
+ - 0: no help is shown
339
+ - 1: sidebar sheet help is shown
340
+ - 2: help is shown for the input widget on the sidebar (this was condensed and moved from the former input help panel) #2085 #1961
341
+ - put input help on sidebar; `disp_help` from -1 to 3
342
+ - mark options to be excluded if `disp_help` greater than `option.max_help`
343
+ - add contextual help while editing options in **OptionsSheet**
344
+ - `Ctrl+G` cycles input help sidebar
345
+ - [guide] add GuideIndex toc and open-guide-index
346
+ - add guides for macros, selection, errors
347
+ - [filetype] add guesser to sniff filetype from data #130 #1759 #1881 #1880 #1883 #1978
348
+ - add support for Python 3.12 #1934
349
+ - migrate pkg_resources to importlib_resources (PR by @zormit and @anjakefala #1968 #1911)
350
+ - [threads] no new threads while prev cmd still running #1148
351
+ - [batch] add progress every half second to batch mode #1182
352
+ - [replay] implemented a single-thread replay mechanism #1575 #2102
353
+ - much simpler architecturally, but loses the ability to pause/resume, and show 1/N progress (now just shows number of queued commands remaining).
354
+ - replay in general should be more stable and possibly faster.
355
+ - Ctrl+N is now no-op for similar functionality to replay-advance
356
+ - replay-advance command itself is removed
357
+ - removed options.replay_movement and its functionality
358
+ - options.replay_wait (-w on CLI) now works by setting the curses timeout, which will affect the display update frequency for all async commands. previously was hard-coded. try -w 0.001 while loading a big file to see a very rapid update.
359
+ - add options.overwrite='n' mode #1805
360
+ - replace `options.confirm_overwrite` with `options.overwrite`, which can be
361
+ 'n' (no/never), 'y' (yes/always), 'c' (confirm)
362
+ - add vd.confirmOverwrite()
363
+ - inputPath/inputFilename will not suggest the existing value or complete filenames if overwrite not y or c
364
+ - add --ro/--readonly cli flag (opposite of existing -y)
365
+ - add [RO] readonly marker on right status after [M] modified
366
+ - add command palette (PR by @moritz #2059 #247)
367
+ - press Space to exec command by longname and bring up command palette
368
+ - type to match by longname and/or description
369
+ - uses fzf's fuzzymatch algo
370
+ - press Tab/Shift+Tab to cycle through commands #2154
371
+ - Enter to execute highlighted command
372
+ - 0-9 to execute numbered command
373
+ - `options.disp_cmdpal_max` for number of suggestions
374
+ - `options.color_cmdpalette` for base color
375
+ - `chooseAggregators` and `jointype` also use palette #1027 #2195
376
+ - chooseAggregators still allows selection of multiple aggregators
377
+ - `options.color_match` is color for matching chars in palette chooser
378
+ - convert input history to use StoredList #2142
379
+ - rename lastInputs.jsonl to input_history.jsonl #2142
380
+ - remove `options.input_history`
381
+ - will automatically record if `options.visidata_dir` exists
382
+ - convert macros to use StoredList #2142
383
+ - cannot save macros if `options.visidata_dir` does not exist
384
+ - rename `options.visidata_dir`/macros.tsv' to `options.visidata_dir`/macros.jsonl'
385
+ - add vd2to3.vdx script to port from 2.x macros to 3.x macros
386
+ - [aggregators] sum uses start value from type of first value for Python 3.8+ #1996 #1999 #2009
387
+ - [build] add a .desktop for VisiData #1738
388
+ - [choose] add type for join/aggregators history #2075
389
+ - [cli] add `-i` to run interactive mode after batch #1714
390
+ - [clipboard] implement a more universal paste that uses positional columns #1377
391
+ - [columns] add `setcol-precision-more` and `-less` #1609 #1650
392
+ - works on float, floatsi, currency, date columns
393
+ - [commands] allow space-seperated keystrokes #2067
394
+ - [confirm] make yes/no buttons clickable #1740 #2075
395
+ - [cosmetic] standardize `__repr__` for sheets and columns (PR by cool-RR #2091 #1757)
396
+ - [describe] default width=10 for describe columns
397
+ - [dir] set name of '.' to current dir name #1775
398
+ - [dir] set name relative to previously loaded directory #1775
399
+ - [dir] get default save name from sheet name #1775
400
+ - [dir] rename `options.dir_recurse:bool` to `options.dir_depth:int` #1715
401
+ - [display] add `resize-height-input` (`zv`) and `resize-height-max` (`gzv`) #1307
402
+ - [encoding] use `options.save_encoding` for lsv, geojson, texttable savers
403
+ - [encoding] change default options.encoding to utf-8-sig to detect/remove BOM #200 #908 #909 #1711
404
+ - [expand] change default depth of expand-col(s)-depth to 0 (PR by @cool-RR #1809)
405
+ - [expand] change sampling warning to aside #1054 #2066
406
+ - [expand] ignore non-cursor types in mixed-type columns
407
+ - [features] procmgr to view/manage processes, memory/cpu stats
408
+ - [features] ping to traceroute a hostip
409
+ - [features] add `addcol-histogram` #2052
410
+ - display a histogram-like column for any column of ints
411
+ - [features] add `contract-cols-depth` etc (bound to `g)`, `z)`, `gz)` #1695
412
+ - [features] add contract-source-cols bound to ) #1702
413
+ - [features] reload-modified calls `reload_rows`, adding support for tail #1686
414
+ - [features] add `addcol-audiometadata` from vmutagen plugin
415
+ - adds metadata column for audio files
416
+ - [features] to **DirSheet** add `sysopen-mailcap`
417
+ - opens using mailcap entry for current row, guessing mimetype
418
+ - [features] add `addcol-source` to add current column to source sheet #988
419
+ - [features] incorporate dedupe plugin by @jsvine
420
+ - `select-duplicate-rows` selects each row in current sheet that is a duplicate of a prior row
421
+ - `dedupe-rows` pushes a new sheet with only non-duplicate rows of current sheet
422
+ - [features] incorporate normcol (by @jsvine)
423
+ - `normalize-col-names` normalizes the names of all *non-hidden* columns
424
+ - [features] add server to listen for commands on `options.server_addr` and `options.server_port` (if set)
425
+ - [features] add Sheet.knownCols to preconfigure of columns by name #1488
426
+ ```
427
+ Sheet.knownCols.timestamp.type = date
428
+ DirSheet.knownCols.directory.width = 0
429
+ ```
430
+ - [freq] add select-first command
431
+ - [freq] base histogram width on column width #1807
432
+ - [freq] set default disp_histogram to U+25A0 BLACK SQUARE (■)) (PR by @daviewales #1949 #1807)
433
+ - [themes] ascii8 disp_histogram to *
434
+ - [freq] add `open-preview` for split pane of source rows at cursor #1086
435
+ - [graph] colorbrewer palette chooser (thanks @er1kb)
436
+ - [graph] add commands to open external graph with matplotlib #1056
437
+ - [help] remove `Enter` binding for **HelpSheet** to `exec-command`
438
+ - [history] remove cmdlog_histfile
439
+ - [input] change `Ctrl+G` to toggle `options.disp_help`
440
+ - [input] add `Ctrl+N` to insert prettykeys of literal keystroke
441
+ - [input] allow percentage of starting value for input into commands
442
+ - [input] `inputMultiple` saves/remembers dict input
443
+ - [input] `Tab`/`Shift+Tab` move left/right in edit-mode like excel #2169
444
+ - [join] allow selecting of join columns from all columns sheet #1224
445
+ - unbind `&` for **ColumnsSheet** `join-cols`
446
+ - [join] join now works with typed values, not display values #2015
447
+ - [join] improve warning for typing source key columns before joining #2117
448
+ - [join] clarify ensureLoaded status message #2137
449
+ - [keys] add shifted function prettykeys (Ctrl+Shift+F1 etc)
450
+ - [layout] stop errors: hide-col on empty sheet, inputMultiple (PR by @midichef #1963)
451
+ - [linux] change default system clipboard cmd to wl-copy if the user is using wayland (PR by @rj1 #1763)
452
+ - [loaders] add `options.regex_skip` for text formats to allow e.g. comment skipping #1559
453
+ - Added default values for `regex_skip` to existing source sheets like tsv/csv/lsv/json/jsonla.
454
+ - Use --regex-skip='' (or otherwise set the option to '') to disable this behavior.
455
+ - [loaders] add mailbox formats mbox/maildir/mmdf/babyl/mh loader (as supported by Python mailbox stdlib)
456
+ - [loaders] .jrnl format (jrnl.sh) loader+saver
457
+ - [loaders] add reddit API loader
458
+ - [loaders] add matrix API loader
459
+ - [loaders] add orgmode loader
460
+ - [loaders] add scraper
461
+ - table of HTML elements as parsed by `beautifulsoup4`
462
+ - [loaders] add Parquet writer (PR by @mr-majkel #2053 #2044)
463
+ - [loaders] add s3 loader (built by @ajkerrigan)
464
+ - open Amazon S3 paths and objects
465
+ - [loaders] add support for jsonla (JSONL arrays) format (PR by @daviewales #1730) #1726
466
+ - [loaders] add zulip API loader
467
+ - [loaders] add airtable API loader
468
+ - [loaders] add .fec loader by @jsvine
469
+ - [loaders] add f5log loader by @bitwisecook
470
+ - [loaders] add a toml loader (PR by @ajkerrigan #1894 #1580 #1587)
471
+ - [loaders] add .conll loader by @polm
472
+ - [loaders html] display title/aria-label/caption/summary (PR by @midichef #2146)
473
+ - [loaders http] replace requests with urllib #1808 #1704
474
+ - [loaders http] guess filetype based on magic bytes #1760
475
+ - [loaders jsonl] allow slash comments (PR by @geekscrapy #2025)
476
+ - [loaders jsonl] deduce numeric column as float, not int #2131 #1698
477
+ - [loaders png] use 2x2 unicode blocks instead of braille
478
+ - [loaders shell] allow deleting of directories unless `options.safety_first=True` #1965
479
+ - [loaders sqlite] save list/dict as json #1589
480
+ - [loaders sqlite] add `exec-sql` command to input query #1719
481
+ - [loaders xlsx] add cell colorizers from source #1718
482
+ - [loaders xlsx] add `column_letter` to meta columns
483
+ - [loaders xml] ignore comments
484
+ - [macros] allow deleting of macro with commit on **MacrosSheet** #1569
485
+ - [macros] add longname/keystrokes to **MacrosSheet** #1569 #1741
486
+ - [macros] add help sidebar to end macro input #1569 #1741
487
+ - [menu] move Edit>Add-rows to Row>Add
488
+ - [menu] add `go-row-number` to menu #1766
489
+ - [menu] move commit-sheet under File>Save
490
+ - [menu] add resize-cols-input to Columns -> Resize (PR by @njthomas #1887)
491
+ - [modules] include module name in Option/Command sheets
492
+ - [motd] default motd is "Support VisiData" instead of blank
493
+ - [mouse] onclick with url launches $BROWSER with url; add `displayer_url` #2031
494
+ - [open] try using options.filetype for path #1710
495
+ - useful for configuring default filetype when reading from stdin
496
+ - [open] add `reopen-last-closed` which reopens the most recently closed sheet (PR by @cool-RR #1813) #1811
497
+ - [open-syspaste] create new table from system clipboard #1680
498
+ - [open-syspaste] enable filetype selection (PR by @daviewales #1717)
499
+ - [options] add `option.json_ensure_ascii` (default: True) (PR by @joaosousa1 #1776) #1772
500
+ - option for non-ASCII characters to be saved to JSON, on False will encode to utf-8
501
+ - [path] change most uses of Path.name to Path.base_stem #2188
502
+ - Path.name is the same as .base_stem for now
503
+ - [plugins] remove external Plugins Sheet; only show installed plugins
504
+ - [profile] dump profile to cwd when profiling enabled
505
+ - [forms] provide help text for color, encoding, encoding errors, and regex #1961
506
+ - [reload] support tail with `reload-modified` #1686
507
+ - [reload] add `reload-rows` which preserves existing columns + cursor position #1655 #1683 #1663
508
+ - [melt] refactor to support `reload-rows` #2101
509
+ - [regex] use inputMultiple to allow changing regex_flags #1925
510
+ - [regex] use `inputRegex` (which has regex help) for all regex commands
511
+ - [rename-col] add `options.rename_cascade` #2088
512
+ - if True, columns renames are cascaded into expressions
513
+ - [replay] has been refactored to be sync, instead of a separate async process #1773 #1714
514
+ - [save] add `options.save_encoding (default: 'utf-8') to differentiate from `options.encoding` when saving a file #1708
515
+ - [save] add saver for STATA files (PR by @raffaem #1563)
516
+ - [save] keep headers in txt as tsv if only one sheet and more than a single column #2173
517
+ - [save] add status when save finished #2157
518
+ - [selected] add `onclick` to "selection status" to quickly `dup-selected`
519
+ - [sheet] add `select-equal-selected` (unbound) to select rows with values in current column in already selected rows #1327
520
+ - [sheet] add `clean-names` (unbound) to set options.clean_names on sheet and clean visible column names
521
+ - [sheet] remove left-click for sheets-stack #2030 #1656
522
+ - [sheet] add `open-source` (bound to backtick) to open source sheet
523
+ - [setcol-fake] add `setcol-fake` (unbound) adds a column of Faker generated 'faketypes'
524
+ - [sparkline] add `addcol-sparkline` (unbound): adds a sparkline of all numeric columns
525
+ - [status] downgrade sheet "finished loading" to debug
526
+ - [tests] call all test_func(vd) defined in modules during pytest
527
+ - [tests] run all unit tests in CI
528
+ - [tests] add test for loading a directory #1798
529
+ - [themes] add options.theme and visidata/themes directory of additional themes (light, ascii8, asciimono) #1682 #1691
530
+ - [themes] keystrokes/code now with gray bg
531
+ - [types] add `ipaddr` and `ipnet` types`. add `type-ipaddr` and `type-ipnet` commands (unbound) (PR by @ajkerrigan #1946 #1782 #1910)
532
+ - also add `select-supernets` (unbound) which selects rows where the CIDR block value includes the input address space
533
+ - [types] add `type-url` and `open-url` #2031
534
+ - [types] add `type-datetime` #1572 #1380 #397
535
+ - [ui] change menu, status, and other colors to be more visible
536
+ - [ui] add `options.disp_scroll_context` to keep *n* more lines above/below cursor on screen
537
+ - [ui] add version to menu status
538
+ - [undo] options.undo can only be set globally
539
+ - [usd] provide USD(s) function to convert string like '£300' or '205 AUD' to equivalent US$ as float
540
+ - [windows] change default system clipboard command to clip.exe
541
+ - [zip] add `sysopen-row` (`Ctrl+O`) to open file in `$EDITOR` #1708
542
+
543
+ ## experimental features (must be imported manually)
544
+
545
+ - [diff] got moved to experimental
546
+ - [inplace] optional replacement commands which update the new Column live as you write the expression
547
+ - [livesearch] add `dup-search` and `dup-search-cols` which search for regex forwards, creating a duplicate sheet with matching rows live
548
+ - [mark] mark rows to more easily move cursor to them
549
+ - [noahs] add basic structure for Noah's Tapestry data game
550
+ - [rownum] addcol-rownum and addcol-delta
551
+ - [slide-cells] shift cells in cursor row to the right
552
+ - add loaders gdrive and gsheets
553
+
554
+ # deprecated
555
+
556
+ - [dev] deprecate `col.setValueSafe` and `sheet.checkCursorNoExceptions`
557
+ - [regex] deprecate `addcol-subst` and `setcol-subst`
558
+ - `addcol-regex-subst` and `setcol-regex-subst` use inputMultiple, instead of more fragile search/replace one-line input
559
+ - [regex] deprecate `split-col` and `capture-col`
560
+ - [keys] change ScrollWheelUp to ScrollUp etc
561
+ - [multiline] rename `visibility-sheet` to `toggle-multiline`
562
+ - [utils] deprecate `onExit` context manager
563
+
564
+ ## bugfixes
565
+
566
+ - [aggregators] use statistics.median for more correct median #1914
567
+ - [aggregators] fix cancelling of long-running aggregators #1036
568
+ - [canvas] fix clicks on labels and unplotted canvs (PR by @midichef #1984)
569
+ - [canvas] put a max limit on y-axis label width (PR by @midichef #2177)
570
+ - [chooser] choose only exactly matching strings (PR by @daviewales #1902)
571
+ - [cli] support `options.encoding_errors` for stdin #2047
572
+ - [clipboard] warn when pasting before copying (PR by @midichef #1793)
573
+ - [clipboard] improve error when deleting row on empty sheet (PR by @midichef #2006)
574
+ - [clipboard] save to tempfile, do not confirm
575
+ - [clipboard] save as given filetype
576
+ - [cliptext] fix double-width char display #1918
577
+ - [cliptext] do not crash with x<0 #2138
578
+ - [cliptext] do not crash with miniscule widths #2138
579
+ - [cmdlog] check for empty cursor column when adding a column (PR by @midichef #1783)
580
+ - [cmdlog] ensure record of global options in all cmdlogs
581
+ - [cmdlog] do not log undos for non-loggable commands #1827
582
+ - [colorizers] fix custom colorizers showing in sheet context #1225
583
+ - [columns] speed up getMaxWidth for wide columns (PR by @midichef #1747) #1728
584
+ - [columns] fix allColumnsSheet to ignore non-TableSheet
585
+ - [confirm] remove flicker in alacritty #2040
586
+ - [confirm] commit on sheet without source should always confirm
587
+ - [currency] fix currency_neg option
588
+ - [curses] ignore early keys pressed before curses is initialised if Esc present #1993
589
+ - [cursor] cursorColIndex now returns None if empty #1803
590
+ - [deps] add requests-cache submodule to root visidata #1748
591
+ - [dir] support '..' and resolve dirname relative to CWD #1801
592
+ - if user uses `open-dir-parent` outside of the CWD, switch to absolute paths
593
+ - [display] fix visibility with col.height>1
594
+ - [expr] more informative 'column not modifiable' error message #1764
595
+ - [extensible] do not copy over existing attribute #2190
596
+ - [fill] allow filling with values that are logically false (PR by @midichef #1794)
597
+ - [freq] fix names for openRow #1777
598
+ - [freq] correctly group null/error values for `options.numeric_binning` #1410
599
+ - [graph] fix graph ranges for xmax, ymax < 1 (PR by @midichef #1752) #1673 #1697
600
+ - [graph] fix data on edges being drawn offscreen (PR by @midichef #1850)
601
+ - [graph] fix graph legend drawn too early (PR by @midichef #1980)
602
+ - [graph] fixes to various graphing edge cases (PR by @midichef #1896)
603
+ - [graph] fix top margin location and simplify y-coordinate calculation (PR by @midichef #1915)
604
+ - [graph] labels: add tick symbol, int precision, right margin (PR by @midichef #1931)
605
+ - [graph] fix legend display of full-width characters (PR by @midichef #1958)
606
+ - [graph] widen left margin to hold y-axis labels (PR by @midichef #1998)
607
+ - [graph] update fixPoint() to use inverted-y coordinates (PR by @midichef #2139 #2111)
608
+ - [index] add longname for g< and g> #2011
609
+ - [input] fix Ctrl+T swap on empty string #1684
610
+ - [input] fix Ctrl+V with special keystrokes #1799
611
+ - [input] erase status bar after prompt #1947
612
+ - [input] fix toggle input help #1971 #1994
613
+ - [input] include history for unfocused items #1947
614
+ - [inputsingle-] loop until keystroke (do not timeout)
615
+ - [join] fail if differing number of keycols #1678
616
+ - [join] fix join-merge (PR by @yphillip #1923 #1843)
617
+ - [jsonl] include all columns in first row, even if null
618
+ - [keystrokes] only check duplicate prefixes from allPrefixes #1829
619
+ - [keys] add `Shift+Tab`
620
+ - [layout] fail if `hide-col` on empty sheet
621
+ - [loaders fixed] use maxWidth for saving if larger than column width #1849
622
+ - [loaders fixed] don't truncate wide columns with fixed width saver (PR by @daviewales #1890)
623
+ - [loaders http] add `options.http_ssl_verify` to replace `options.http_req_verify` #1939
624
+ - [loaders http] fix parsing link header (PR by @Midichef #1924 #1898)
625
+ - [loaders html] fix failure from colspan with only td tags (PR by @midichef #2002)
626
+ - [loaders html] prevent error when parsing an empty table (PR by @midichef #2140)
627
+ - [loaders imap] enable imap and fix folder name extraction (PR by @justin2004 #1917)
628
+ - [loaders json] include null columns in first row, in more cases (PR by @midichef #2109)
629
+ - [loaders jsonl] save None as null #2183
630
+ - [loaders mysql] unquote password before sending to client (PR by @dufferzafar #1933)
631
+ - [loaders pandas] handle read methods that produce a list of dataframes (PR by @ajkerrigan #1990 #1986)
632
+ - [loaders parquet] stringify source to handle both URLs and local paths (PR by @ajkerrigan #1913)
633
+ - [loaders parquet] show string value for Parquet `large_string` (PR by @daviewales #2018 #2003)
634
+ - [loaders parquet] fix parquet reading from zip or s3 (PR by @takacsd #2133)
635
+ - [loaders parquet] handle parquet directories (PR by @mr-majkel #2160 #2159)
636
+ - [loaders pivot] fix missing anytype import
637
+ - [loaders postgres] quote schema and table name (PR by @isosphere #2129)
638
+ - [loaders pyobj] similar sheet names for dive-/open- and pyobj- #1988
639
+ - [loaders pyobj] do not skip properties that raise
640
+ - [loaders png] fix `rgb_to_attr` to return str colornum
641
+ - [loaders rec] support %sort; continue loading on exception #2022
642
+ - [loaders sav] use fork of `savReaderWriter` for the sake of Python 3.10+ support #1867
643
+ - [loaders sqlite] prevent creation of ./- file when reading from stdin (PR by @midichef #1945)
644
+ - [loaders sqlite] explicitly fail when file is not on disk
645
+ - [loaders tsv] use options.encoding for reading files
646
+ - [loaders ttf] implement `closePath()` to draw missing lines (PR by @midichef #1979)
647
+ - [loaders vds] save hidden columns also (PR by @pacien #2093 #2089)
648
+ - [loaders vds] fix 'keyerror: exprcolumn' for .vds (PR by @pacien #2036 #2045)
649
+ - [loaders vds] fix .csv to .vds conversion #2037
650
+ - [loaders xlsx] saver now replaces illegal characters instead of aborting #1402
651
+ - [loaders xml] silence FutureWarning from lxml (PR by @midichef #2149)
652
+ - [loaders xml] fix file loading (PR by @midichef #2148)
653
+ - [loaders yaml] support tuples in YAML files (PR by @cool-RR #1824) #1822
654
+ - [loaders zip] fix loading and extracting files locally + remotely #2127
655
+ - [macos] do not bind empty string to anything
656
+ - [macros] add prompt for cancelling macro #1810 #1812
657
+ - [macros] specify a clearer message #1810
658
+ - [macros] append newline to macros.tsv if necessary #1569
659
+ - [macros] save file as longname/keystroke #2084
660
+ - [main] print version string once, not twice (PR by @midichef #1837)
661
+ - [main] remove forced unload before interactive mode #1943
662
+ - [menu] use "Alt+x" keybinding instead of "^[x"
663
+ - [metasheets] do not use options.encoding for internal sheet saving
664
+ - [misc] remove trailing commas from addCommand (PR by @midichef #1962)
665
+ - [modify] do not call saveSheets on commit
666
+ - [modify] commitMods do not call putValue for changes to added/deleted rows
667
+ - also fix ItemColumn.putValue and AttrColumn.putValue to call parent
668
+ Column.putValue before setting the value on the row
669
+ - [modify] confirm() overwrite on root sheet source path
670
+ - [modify] always set col.defer
671
+ - [modify] do not fail on Column.putValue if no setter
672
+ - [mouse] fix mouse-click on bottom pane
673
+ - [open] silence ResourceWarnings for unclosed files (PR by @midichef #2152)
674
+ - [options] disable adding rows (PR by @midichef #1944)
675
+ - [options] fix option editing
676
+ - [options] fix helpstr display when editing
677
+ - [paste] add new rows to sheet if necessary
678
+ - [path] set name to '.' for givenpath of '.' #1768
679
+ - [path] fix progress bar for compression formats #1175 #1255
680
+ - [path] fix open() using both binary and text mode (PR by @midichef #1955)
681
+ - [path] binary mode does not take newline argument
682
+ - [pyobj] fix pyobj-cell #2001
683
+ - [regex] issue warning when no columns to add #1778
684
+ - [regex] check for regex capture group #1778
685
+ - [rename-col] skip gratuitous rewrites when undoing (PR by @pacien #2092)
686
+ - [replay] turn off confirm dialogs during replay
687
+ - [replay] clearCaches before moving cursor #1773
688
+ - [replay] enable confirm in interactive batch mode (PR by @midichef #1751)
689
+ - [replay] do not push sheet if not already pushed #1681
690
+ - [save] handle saving 0 sheets #1720
691
+ - [save] fix confirm message on commit #2090
692
+ - [scroll-cells] do not error scrolling offscreen column #1908
693
+ - [search] handle no rows and invalid regex (PR by @midichef #2125)
694
+ - [settings] clear cache correctly before set
695
+ - [sheets] fix NameError for mincolidx #1672
696
+ - [sheets] add confirm for `quit-sheet-free` (PR by @midichef #1755)
697
+ - [sheets] make sure addColumn called on all columns
698
+ - not just dynamically-created columns
699
+ - addColumn is needed to set .sheet and .defer, among other things
700
+ - [sheets] fix reload() for tsv sheets with key columns (PR by @midichef #1997)
701
+ - [sheets] fix recursion crash of Python >= 3.8, <3.9.10 (PR by #midichef
702
+ #1722) #1696
703
+ - [sheets] pop columns kwarg so raw list not set via final update() in
704
+ constructor
705
+ - [sheets] fix slowness from adding rows during getMaxWidth (PR by @midichef
706
+ #1982)
707
+ - [sheets] no longer insert column in draw() in debug mode (PR by @midichef
708
+ #1995)
709
+ - [sheets] fix errors on sheets with no columns (PR by @midichef #2124)
710
+ - [sheets] fix splitcell to handle attribute/text pairs (PR by @ajkerrigan #2020)
711
+ - [sheets] recreate sort columns for copied sheet (PR by @midichef #2192 #2190)
712
+ - [shell] fix copying of a directory #1970
713
+ - [status] fix Alt+Shift+Shift+X #1828
714
+ - [status] update right status before exec #996
715
+ - [status] add caller/module to statuses, and print on --debug #2037
716
+ - [status] catch all exceptions during drawing #2174
717
+ - [sort] show sort arrow for sort columns described by name (PR by @midichef #1876)
718
+ - [syscopy] always copy as utf-8
719
+ - [term] allow non-color term like vt102
720
+ - [threads] allow @AsyncThread funcs to have status kwarg
721
+ - [threads] remove non-sheet threads from unfinishedThreads (do not sync on them)
722
+ - [quit-sheet-free] re-entering a subsheet left using quit-sheet-free should reload the subsheet #1679
723
+ - [ui] integrate scrollfix from @geekscrapy #1441
724
+ - [undo] ensure undo is sheet-specific for duped/copied sheets #1780
725
+ - [undo] fix undo for first modification on a sheet-specific HelpSheet #1820
726
+ - [undo] fix the removal of [M] (modified mark) after undo #1800
727
+ - [undo] remove last matching cmdlog row, instead of first (PR by @midichef #2010)
728
+ - [unzip-http] fix recursion error when fetching remote zipfile (PR by @midichef #2116 #2110)
729
+ - [vdx] fix save error
730
+ - [windows] add Alt+ keybindings for powershell #1630
731
+ - [windows] limit windows-curses version to 2.3.0 (PR by @bartbroere #1901 #1841)
732
+ - asottile noticed this was a regression in the last windows-curses release
733
+ in this issue: zephyrproject-rtos/windows-curses#41
734
+ - [windows] update windows-curses version to support Python 3.11 #2062
735
+ - [windows] fix syspaste (PR by @midichef #1921 #1920)
736
+ - [windows] fallback to `scr.getch` if no `scr.get_wch` #192
737
+ - handles `AttributeError: '_curses.curses window' object has no attribute 'get_wch'`
738
+ - [windows] tempfiles must be closed before reopening #2118
739
+ - [zsh] fix zsh completion (PR by @dbaynard #1960 #1959)
740
+
741
+ ## performance
742
+
743
+ - [startup] delay import of `urllib.request`, `pkg_resources`, and
744
+ `dateutil`
745
+ - [startup] remove `unittest.mock`
746
+ - [draw] `drawcache` make_formatter
747
+ - [test] use lambda instead of Mock for addstr
748
+ - [] `Column.formatValue` inline fmtstr
749
+ - [settings] `@lru_cache` sheet obj in `SettingsMgr._mappings`
750
+ - fastpath getitemdeep
751
+ - fallback to getattrdeep if len(row) < index
752
+ - [sort] move `addProgress` outside of sortkey
753
+ - [parquet] cache large strings and cap at 1MB #2003 #1068
754
+ - [modify] check col/row before isChanged
755
+ - [status] move getStatusSource into features to improve startup perf
756
+
757
+
758
+ ## api
759
+
760
+ - [cli] printout gone; use `builtins.print`
761
+ - [color] use `ColorAttr` throughout #2061 #2017
762
+ - separate out fg/bg
763
+ - allow bg and fg to take precedence independently
764
+ - fixes issues with forced bg=black on sidebar for warning, and statusbar for working
765
+ - [guides] add API for getting and adding guides
766
+ - add vd,getGuide and vd.addGuide
767
+ - add Helpers for formatting commands and options
768
+ - [help] add HelpSheet to globals
769
+ - [hint] add hint mechanism to find best `Sheet.hint_function`
770
+ - add hints for types
771
+ - [input] add vd.injectInput and vd.getCommandInput
772
+ - [keys] use prettykeys for allPrefixes #1592
773
+ - [menu] vd.addMenuItems with convenient string syntax
774
+ - [modify] Sheet.commitAddRow and Sheet.commitDeleteRow
775
+ - [modules] vd.importModule, vd.importSubmodules, vd.importExternal, vd.setPersistentOptions
776
+ - add importExternal for most loaders and features #1739 #1765
777
+ - [path] filesize can taken any Path-like
778
+ - [pivot freq] re-add FreqTableSheet and PivotSheet to globals #1731
779
+ - [sheet] add vd.addCommand as alias for BaseSheet.addCommand
780
+ - [tests] add vd.resetVisiData
781
+ - [vdx] runvdx() to execute vdx strings
782
+ - rename vd.draw_sheet to vd.drawSheet
783
+ - change order of parameters for vd.subwindow to (x,y,w,h)
784
+ - change order of args to onMouse to x,y
785
+ - add vd.aside for a silent status message
786
+ - add GlobalsSheetsSheet to globals
787
+ - vd.queueCommand can take input,sheet,row,col kwargs #1681
788
+ - add `@visidata.stored_property` to persist property
789
+
790
+
791
+ # v2.11.1 (2023-07-16)
792
+
793
+ - [tests] fix tests for Python >=3.11
794
+ - [path] update for Python 3.12 API (reported by @QuLogic #1934)
795
+
796
+ ## Improvements and bugfixes
797
+
798
+ - [chooser] choose only exactly matching strings in chooser (PR by @daviewales #1902)
799
+ - [columns] speed up `getMaxWidth()` for wide columns, and correct some edge cases (PR by @midichef #1747)
800
+ - [freqtbl] Default `disp_histogram` to U+25A0 BLACK SQUARE (■)) (PR by @daviewales #1949)
801
+ - [loaders fixed] do not truncate wide columns with fixed-width saver (PR by @daviewales #1890)
802
+ - add missing import `copy`
803
+ - [graph] fix graph ranges for xmax, ymax < 1 (PR by @midichef #1752)
804
+ - [graph] fix data on edges being drawn offscreen (PR by @midichef #1850)
805
+ - [input] fix `Ctrl+T` swap on empty input (reported by @gfrmin #1684)
806
+ - [inputsingle] loop until keystroke (do not timeout)
807
+ - [fill] allow filling with values that are logically false (PR by @midichef #1794)
808
+ - [macos] do not bind empty string to any keybinding
809
+ - [paste] add new rows to sheet if insufficient rows
810
+ - [path Dirsheet] set name to '.' for givenpath of '.' (reported by @geekscrapy #1768)
811
+ - [path] fix progress for compressed files (reported by @bitwisecook #1255 #1175)
812
+ - [replay] clearCaches before moving cursor (reported by @mokalan #1773)
813
+ - [save] handle saving 0 sheets (reported by @reagle #1266 #1720)
814
+ - [settings] clear cache correctly before set
815
+ - [undo] fix so that undo is Sheet-specific on copied sheets (reported by @geekscrapy #1780)
816
+ - [undo] undoing `zd` now removes `[M]` (modification mark) (reported by @Freed-Wu #1800)
817
+
818
+ # v2.11 (2023-01-15)
819
+
820
+ - [ci] drop support for Python 3.6 (related to https://github.com/actions/setup-python/issues/543)
821
+ - [ci] add support for Python 3.11 (#1585)
822
+
823
+ - [dirsheet] add `open-dir-parent` (bound to backtick)
824
+ - [join] add new "concat" jointype to behave similar to "append" but keeps first sheet type and columns (requested by @frosencrantz #1598)
825
+ - [zip] add multisave for `.zip` (save each sheet in options.save_filetype format into given .zip file)
826
+ - [sysedit] add `sysedit-selected` (bound to `g Ctrl+O`) (requested by @Delapouite #1596)
827
+ - edit cells in multiple rows in `$EDITOR`
828
+ - only handles cell modifications, not added or deleted rows
829
+
830
+
831
+ ## Improvements
832
+
833
+ - [aggregators] add 95 and 99 percentile (p95 and p99)
834
+ - [fill-col] speed up `fill-col` for sheets with many empty cells (PR by @midichef #1657)
835
+ - [loaders hdf5] add support for arrays of scalars (requested by @linwaytin #1602)
836
+ - [graph] fail if no numeric xcols are given
837
+ - [open-cell-file] warn when file or url in cell does not exist (requested by @geekscrapy #1540)
838
+ - [sqlite] add passthrough options (reported by @cwarden #1622)
839
+ - [sqlite] add options.sqlite_onconnect to be executed before running any statement (requested by @cwarden #1622)
840
+ - [xml] add passthrough options for xml_parser; default xml_parser_huge_tree=True (PR by @midichef #1668)
841
+
842
+ ## Bugfixes
843
+
844
+ - [columns] `dup-sheet` now carries over attributes of columns added by `add-column`
845
+ - [columns] **SettableColumn** should not be deferred (reported by @frosencrantz #1568)
846
+ - [customdate] recognise type-customdate as numeric (requested by @tdussa #1613)
847
+ - [describe] fix custom describe aggregators (reported by @edupont #1574)
848
+ - [dirsheet] fix incorrect filename with multiple extensions (reported by @kunliugithub #1571)
849
+ - [display] show `disp_oddspace` for surrogate escapes (reported by @geekscrapy #1544)
850
+ - [graph] fix div-by-zero with only one y-value (reported by @midichef #1673)
851
+ - [install] ensure setuptools files have appropriate permissions (reported by @icp1994 #1591)
852
+ - [install] update data files in setup.py based on PEP 420 (reported by @Oblomov #1675)
853
+ - [keystrokes] add `kDN` and `kUP` to translation table (reported by @djpohly #1336)
854
+ - [loaders html] fix loading of relative links in html table (reported by @frosencrantz #1599)
855
+ - [loaders xlsx] store `None` as empty string in `save_xlsx` (reported and PR by @dbaynard #1626 #1629)
856
+ - [macros] override CLI parsing options for MacrosSheet (reported by @frosencrantz #1607)
857
+ - [macros] query again for keystroke if used by existing macro (#1658)
858
+ - [macros] do not include `nonLogged` commands in macro (reported by @geekscrapy #1569)
859
+ - [macros] add reload for **MacroSheet** (reported by @geekscrapy #1569)
860
+ - [menu] 2x ESC should exit menu
861
+ - [mouse] fix mouse-clicks on statusbar when splitpane is off (reported by @frosencrantz #1625)
862
+ - [numpy] fix loader
863
+ - [open_txt] fix Exception with `open-config` when no `~/.visidatarc` (reported by @gunchev #1611)
864
+ - [pdb] fix entering of pdb breakpoints for Python 3.9+ (reported by @jasonwirth #1317)
865
+ - [sheets] sort all sheets on global **Sheets Sheet** (reported by @franzhuang #1620)
866
+ - [types] format int/vlen as true int (reported by @xlucn #1674)
867
+ - [unzip-http] fix file extraction (`x`) on remote zip file
868
+ - [unzip-http] handle files smaller than 64K (reported by @frosencrantz #1567)
869
+ - [zsh-completion] fixed (reported by @pigmonkey #1583; PR by @Freed-Wu #1646)
870
+
871
+ ## API
872
+
873
+ - raise Exception from causes in utils.py (PR by @cool-RR #1633)
874
+ - add `HistogramColumn` to allow overrides (requested by @andycraig #1621)
875
+ - easier external numeric types with `@vd.numericType()` decorator (inspired by @s1291 #1394)
876
+
877
+ - [frequency table] `dive-rows` renamed to `dive-selected`
878
+
879
+ # v2.10.2 (2022-10-08)
880
+
881
+ - add .vdx, a simplified new cmdlog format
882
+ - add `-N`/`--nothing` command to disable loading .visidatarc and plugin addons
883
+ - add `addcol-aggr` to add an aggregator column to the **FreqTable** without needing to
884
+ regenerate it (requested by @geekscrapy #1541)
885
+
886
+ ## Improvements
887
+
888
+ - [cli] load commandline file arguments from the start (requested by @reagle #1471)
889
+ - [cli] `--config=''` now does not try to load any config
890
+ - [open] rename `zo` `open-cell` command to `open-cell-file`
891
+ - [loaders whl] load python .whl (reported by @frosencrantz #1539)
892
+
893
+ ## Bugfixes
894
+
895
+ - [cli] fix for empty arg
896
+ - [DirSheet] fix bug where `Enter` no longer opened a file from the **DirSheet** (reported by @frosencrantz #1527)
897
+ - [input paste] fix pasting via a Path via `Ctrl+Y` into input (reported by @frosencrantz #1546)
898
+ - [menu] allow VisiData to run without menu
899
+ - [mouse] catch any curses.getmouse() errors (reported by @geekscrapy #1553)
900
+ - [performance] allow vd to be truly idle (reported by WizzardUU #1532)
901
+ - [plugins_autoload] catch error for environment having invalid package metadata (reported by @jsdealy #1529)
902
+ - [plugins_autoload] catch exception if plugin fails to load
903
+ - [plugins-autoload] fix check for if plugins_autoload is set in args
904
+ - [plugins-autoload] update for importlib-metadata 5.0 API (reported by @jkerhin #1550)
905
+ - [pyobj] undo rename of `open-row`/`open-cell` (were renamed to `open-X-pyobj`) (revert of eff9833e6A)
906
+ - [sheets] ensure IndexSheets are precious, and that **SheetsSheet** is not (reported by @frosencrantz #1547)
907
+ - [unzip-http] extracting a file now checks for overwrite (reported by @frosencrantz #1452)
908
+ - [windows clipboard] fix piping to clip command through stdin (thanks @daviewales for the fix; reported by @pshangov #1431)
909
+
910
+ ## API
911
+
912
+ - expose `CommandLogBase` (was `_CommandLog`)
913
+ - [options] allow FooSheet.options instead of .class_options
914
+ - add separate non-async `select_row`, `toggle_row`, and `unselect_row` for selection of single rows
915
+ - the before/after decorators now do not fail if api functions they are decorating do not already exist
916
+
917
+ # v2.10.1 (2022-09-14)
918
+
919
+ ## Improvements
920
+
921
+ - [docs] document `-d` option (thanks @abitrolly for PR #1515)
922
+ - [freq] disable histogram if `disp_histlen` or `disp_histogram` set to 0 or empty string
923
+ - [guard] add `guard-sheet-off` which unsets `options.quitguard` on current sheet (thanks @hanfried for PR #1517)
924
+ - [menu] add `BUTTON1_CLICKED` (same as `BUTTON1_PRESSED`)
925
+ - [open] add `zo` to open file or url from path in current cell
926
+
927
+ ## Bugfixes
928
+
929
+ - fix Guix build problems (reported by @ryanprior #1499)
930
+ - add support for sheet names with multiple `.` (periods) in the name (requested by @geekscrapy #1494)
931
+ - [cmdlog] add more portable shebang in vdj
932
+ - [date] fix custom date greater than or equal to comparison
933
+ - [macros] fix `macro-record` (#1513)
934
+ - [macros] refresh `macro-sheet` upon macro addition
935
+ - [macros] ensure macros are set upon startup
936
+ - [plugins] update usd plugin api (thanks @hanfried for PR #1510)
937
+ - [repeat] fix `repeat-` (#1513)
938
+ - [status] reduce priority of active colouring (reported by @geekscrapy #804)
939
+
940
+ ## API
941
+
942
+ - add `ExpandedColumn` to globals
943
+ - add `Extensible.before` and `Extensible.after`
944
+ - `def foo` decorated with `@VisiData.before` will run it before `vd.foo()`
945
+ - `def foo` decorated with `@VisiData.after` will run it immediately after
946
+
947
+
948
+
949
+ # v2.10 (2022-08-28)
950
+
951
+ - [plugins] load all entry points in `visidata.plugins` group before config load
952
+ - add entry_points={'visidata.plugins': 'foo=foo'} to plugin load plugin automatically when launching VisiData
953
+
954
+ - [deps] require `importlib_metadata` >= 3.6
955
+ - following https://github.com/pypa/twine/pull/732
956
+
957
+ ## Improvements
958
+
959
+ - [draw] redraw only every 100 ms if any keys pending (requested by @ansoncg #1459)
960
+ - [IndexSheet] shown name is only final name component
961
+ - [loaders html] add table of all links on page (requested by @dufferzafar #1424)
962
+ - [loaders html] `open-row` on **LinksSheet** to open url (requested by @dufferzafar #1424)
963
+ - [options] add `options.http_req_*` to send headers/etc to requests (requested by @daviewales #1446)
964
+ - [options pyobj] add `options.fmt_expand_dict` and `options.fmt_expand_list` for formatting expanded
965
+ list and dict column names (requested by @joe-opensrc #1457)
966
+ - [threads-sheet] add `z Ctrl+T` (`threads-sheet`) to open **ThreadsSheet** for current sheet
967
+ - [threads-sheet] add `g Ctrl+C` (`cancel-all`) to **ThreadsSheet**
968
+ - [zsh] add scripts for zsh completion (PR by @Freed-Wu #1455)
969
+ - tutorial: https://visidata.org/docs/shell/
970
+
971
+ ## Bugfixes
972
+
973
+ - [addcol-] set cursor at added column for `addcol-new`/`addcol-bulk` (reported by @jsvine #1445)
974
+ - [cmdlog] `Ctrl+S` from a **CommandLog** now defaults to `.vdj` (reported by @jsvine #1443)
975
+ - [display] format entire string for undetermined width (reported by and fixed by @jsvine #1442)
976
+ - [formatter] fix len format strings
977
+ - [LastInputsSheet] catch other exceptions during reload
978
+ - [loader npz] fix .npz loader (reported by @Shahin-rmz #1440)
979
+ - [loader geojson] fix plotting and saving geojson files (fixed by @mwayne #1477)
980
+ - [loader geojson] improve feature property manipulation (fixed by @mwayne #1477)
981
+ - [menu] upon menu item keypress, move to item (reported by @reagle #1470)
982
+ - [menu] fix `ALT+<keystroke>` navigation while within menu (reported by @reagle #1470)
983
+ - now requires two `ESC` to exit
984
+ - [open] allow binary files from archives (reported by @frosencrantz #1430)
985
+ - [save] do not save unknown filetype as `save_filetype`
986
+ - [save visidatarc] only save rows on **OptionsSheet** to visidatarc
987
+ - [sheets] fix name reconstruction for files with multiple and no suffixes (#1450)
988
+ - [sheets] do not include empty name parts in sheet name
989
+ - [unzip-http] **FreqTableSheet** `open-row` now loads links (reported by @frosencrantz #1458)
990
+ - [zip] use correct rowdef in extract (reported by @frosencrantz #1430)
991
+ - [zip] do not create directory for extract
992
+
993
+ ## snippets
994
+
995
+ - add snippets/scrolloff.py which mimics vim's scrollof context lines (requested by @gennaro-tedesco #1441)
996
+
997
+ ## vdplus
998
+
999
+ - `open-memusage` was moved to vdplus
1000
+
1001
+ ## API
1002
+
1003
+ - add InferColumnsSheet
1004
+ - it infers the columns and their types from the rows it gets which are dicts
1005
+ - used by json, npy loader
1006
+ - add vd.printout and vd.printerr for builtins.print to stdout and stderr
1007
+ - add `vd.view()`
1008
+ - fix Extensible.init() to work with classes with no `__init__`
1009
+ - add `Sheet.sidebar` and `Sheet.sidebar_title` properties
1010
+
1011
+ ## Deprecated
1012
+
1013
+ - remove VisiDataSheet
1014
+ - remove vdmenu
1015
+
1016
+ # v2.9.1 (2022-07-21)
1017
+
1018
+ - [unzip-http] move urllib3 to optional dependencies
1019
+
1020
+ # 2.9 (2022-07-20)
1021
+
1022
+ - [ux] add confirming modal dialog
1023
+ - only "y" required to confirm
1024
+ - add XDG support (thanks @jck for the PR #1420)
1025
+ - `options.config` default is now `"$XDG_CONFIG_HOME"/visidata/config.py` if `$XDG_CONFIG_HOME` is set and `config.py` exists. If not, falls back to the standard `$HOME/.visidatarc`.
1026
+ - vendor [appdirs.py](https://github.com/ActiveState/appdirs/blob/master/appdirs.py)
1027
+ - [cmdlog] support variables in .vdj (requested by @jungle-boogie #1364)
1028
+ - in the .vdj, write variables like so: `${variableName}`
1029
+ - then on the CLI: `vd -p foo.vdj variableName=bar`
1030
+ - [loaders arrow] new Apache Arrow IPC loader/saver (requested by @d-miketa #1369) (requires `pyarrow`)
1031
+ - add `.arrow` (file) and .arrows (streaming) formats
1032
+ - add more native `parquet` loader via `pyarrow`
1033
+ - preliminary "windowing" for referencing x rows before and y rows after in an expression (requested by @maxigit #1399, @MMesch #1129, @samuelludwig #1210)
1034
+ - press `w` (longname: `addcol-window`) followed by two numbers: the number of rows to aggregate *before* and *after* the current row.
1035
+ - there will be a new column, `foo_window`, where each row contains a list of aggregated rows. after that, e.g. `=` `sum(foo_window)` to get a running total for each row
1036
+ - add `setcol-format-enum` which takes e.g. `A=apple B=banana` and uses that as a mapping when formatting a column.
1037
+ - vendor `https://github.com/saulpw/unzip-http`; allows the downloading of individual files from a .zip file over http without downloading the entire archive (requires `urllib3` package)
1038
+ - add `save-source` to save a root sheet directly to its source
1039
+ - add `setcol-formatter` to specify formatting function used for Column (default: `generic` formats based on type and fmtstr). Can be `json` or `python` or a custom formatter
1040
+
1041
+
1042
+ ## Improvements
1043
+
1044
+ - [cli] when `-v` or `-h` VisiData now does not read config or do anything else (requested by @geekscrapy #1340)
1045
+ - [cmdlog] set `.vdj` to be the default cmdlog format
1046
+ - [replay] allow column names to be numbers (reported by @frosencrantz #1309)
1047
+ - if wishing to reference a column index, required to be an int in a .vdj cmdlog
1048
+ - [cmdlog] when saving cmdlogs, type column indices as integers, and column names as strings
1049
+ - If replaying, and *col* is an `int`, the CmdLog will index by position.
1050
+ - If *col* is a `str` it will index by column name.
1051
+ - [display] preview first n elements of a list/dict cell
1052
+ - [regex] add unbound `addcol-<regex>` commands
1053
+ - [rtl] improvements to right-to-left text display (requested by @dotancohen #1392)
1054
+ - [man] have `vd --help` open the .txt manpage by default (requested by @halloleo #1332)
1055
+ - [mouse] invert scroll wheel direction (requested by @marcobra #1351)
1056
+ - [performance] improvements to plotting of empty canvas, multiline display, and draw-ing functions
1057
+ - [plugins] notify when plugin update available (thanks @geekscrapy for PR #1355)
1058
+
1059
+ ## Bugfixes
1060
+
1061
+ - [aggregators] fail on setting an unknown aggregator in **Columns Sheet** (reported by @geekscrapy #1299)
1062
+ - [aggregators] handle `delete-cell` case for aggregators column in **Columns Sheet** (reported by @geekscrapy #1299)
1063
+ - [aggregators] fix quartile aggregators (reported by @pnfnp #1312)
1064
+ - [aggregators] fix copying of aggregators when duplicating a sheet (reported by @frosencrantz #1373)
1065
+ - [canvas] do not use "other" label when there are exactly 9 columns being plotted (reported by @tdussa #1198)
1066
+ - [cli] fix `+:subsheet:col:row:` when `load_lazy` is False
1067
+ - [delete-row] clear deleted rows from `selectedRows` (reported by @geekscrapy #1284)
1068
+ - [exec-longname] output warning, if longname does not exist
1069
+ - [expr] prefer visible columns over hidden columns (reported by @frosencrantz #1360)
1070
+ - [freeze-sheet] carry over column attributes for freeze-sheet (reported by @frosencrantz #1373)
1071
+ - [import-python] use command-specific history (reported by @frosencrantz #1243)
1072
+ - [IndexSheet] fix renaming of sheet names from an IndexSheet (reported by @aborruso #1339)
1073
+ - [input] handle history for non-string input values (reported by @frosencrantz #1371)
1074
+ - [loaders pandas] fix (`dup-selected`) `"`of selected rows for **Pandas Sheet** (reported and fixed by @jasonwrith #1315 #1316)
1075
+ - [loaders usv] swap delimiters (reported by @frosencrantz #1383)
1076
+ - [loaders usv] save delimiter override options (reported by @frosencrantz #1383)
1077
+ - [loaders usv] fix saving header with usv row delimiter (reported by @frosencrantz #1383)
1078
+ - [loaders xlsx] fix clipboard on XlsxSheets (reported by @jungle-boogie #1348)
1079
+ - [macros] fix macro-record keystroke setting (reported by @fatherofinvention #1280)
1080
+ - [mouse] stay disabled after input (reported by @holderbp #1401)
1081
+ - [mouse] fix for pypy3 (thanks @LaPingvino for PR
1082
+ - [quitguard] refinement of quit-sheet protection (reported by @geekscrapy #1037, #1381)
1083
+ - [save-selected] get sheet names for saving from selected rows (reported by @aborruso #1339)
1084
+ - [shell] strip trailing whitespace in `z;` output (reported by @justin2004 #1370)
1085
+ - [tty] fix bug where piping async output into stdin broke visidata keyboard input (reported by @ovikk13 #1347)
1086
+ - [undo] fix issue where undoing a reload blanks the current sheet; do not set undos for reload sheet (#1302)
1087
+ - [unset-option] fix issue where Exception is raised on the next undo-able command run after `unset-option` (reported by @ajkerrigan #1267)
1088
+ - [windows] require `windows-curses` installation on Windows (thanks @ajkerrigan for PR #1407; reported by @schiltz3 #1268, @aagha #1406)
1089
+
1090
+ ## API
1091
+
1092
+ - add Column.formatter (generic, json, python)
1093
+ - add SqliteQuerySheet to globals
1094
+ - `vd.loadConfigFile()` no longer needs a filename argument, and will use `options.config` by default (#211)
1095
+ - use `newline="` for csv.writer (thanks @daviewales for PR #1368)
1096
+ - make `ItemColumn` a proper class for inheritance
1097
+ - add `openJoin` and `openMelt` to allow overriding by plugin sheetsS
1098
+ - addColumn takes `*cols` (reported by @pyglot #1414)
1099
+
1100
+ ## Deprecated
1101
+
1102
+ - deprecate old vdmenu system
1103
+ - remove `Shift+V` command
1104
+
1105
+ # 2.8 (2021-12-15)
1106
+
1107
+ ## Improvements
1108
+
1109
+ - [plugins] include pip stderr in warning
1110
+ - [plugins] use returncode to determine if pip install failed, before adding to imports (thanks @geekscrapy for PR #1215)
1111
+ - [cmdlog] add sheet creation command to cmdlog (requested by @aborruso #1209)
1112
+ - [open] strip whitespace from the beginning and end of inputted filenames
1113
+ - [options] `options.input_history` and `options.cmdlog_histfile` can now be an absolute paths (requested by @geekscrapy #1200)
1114
+ - relative paths are relative to `options.visidata_dir`
1115
+ - [splitwin] automatically switch to pane where sheet is pushed to
1116
+
1117
+ ## Bugfixes
1118
+
1119
+ - [curses] suppress invalid color errors in Python 3.10 (thanks @ajkerrigan for reporting #1227 and for PR #1231)
1120
+ - Adapt to [Python 3.10 curses changes](https://docs.python.org/3/whatsnew/3.10.html#curses) which can raise a `ValueError` on invalid color numbers.
1121
+ - [curses cosmetic] simplify error message, if curses fails to initialise
1122
+ - [loaders json] skip blank lines in json files, instead of stopping at them (thanks @geekscrapy for PR #1216)
1123
+ - [loaders jsonl] fix duplicate columns when loading fixed columns sheets in jsonl format (report by @0ceanlight)
1124
+ - example of formats with fixed columns is darkdraw's `DrawingSheet`
1125
+ - [loaders fixed] fix saver (thanks @geekscrapy for PR #1238)
1126
+ - [loaders postgres] fix recognition of postgres loader (reported by @ryanmjacobs #1229)
1127
+ - [loaders sqlite] fix the loading of sqlite VIEWs for sqlite version 3.36.0+ (reported by @frosencrantz #1222)
1128
+ - [help-commands] now lists commands only for the current sheet (reported by @geekscrapy #1217)
1129
+ - [textcanvas] ENTER on canvas should push copied source sheet for points within cursor
1130
+ - [pivot freq] use `options.histogram_bins` from source sheet
1131
+ - [curses cosmetic] fix issue where if a curses initialisation Exception is called, a second Exception follows
1132
+ - [quit-sheet-free] fix bug where quit-sheet-free, when multiple sheets opened in CLI, was not working (reported by @geekscrapy #1236)
1133
+ - [options] fix instance where local options sheet was called, instead of global options sheet (thanks @geekscrapy for PR #1241)
1134
+
1135
+ ## API
1136
+
1137
+ - add standard Python `breakpoint()` to drop into the pdb debugger
1138
+ - export `run()` to global api
1139
+ - add CsvSheet, ZipSheet, TarSheet to global api (thanks @geekscrapy for PR #1235)
1140
+
1141
+ # 2.7.1 (2021-11-15)
1142
+
1143
+ - Bugfix: fix Enter on helpmenu (reported by @geekscrapy #1196)
1144
+
1145
+ # 2.7 (2021-11-14)
1146
+
1147
+ ## Improvements
1148
+
1149
+ - [movement] bind Home/End to go-top/go-bottom (thanks @geekscrapy #1161)
1150
+ - [api] add vd.urlcache as alias for urlcache global (thanks @geekscrapy for PR #1164)
1151
+ - [plugins] do not continue installation if main package fails pip install (thanks @geekscrapy for PR #1194)
1152
+ - [plugins] allow for plugin records without SHA256; warn if absent (thanks @geekscrapy for PR #1183)
1153
+ - [load_lazy] do not load subsheets, if `sheet.options.load_lazy` is True (thanks @geekscrapy for PR #1193)
1154
+ - [save] confirm when `save_foo` function does not exist and saver fallsback to `options.save_filetype` (reported by @geekscrapy #1180)
1155
+ - [save] `options.save_filetype` default now 'tsv'
1156
+ - several cosmetic improvements
1157
+
1158
+ ## Loaders
1159
+
1160
+ - [lsv] add `lsv` filetype for simple awk-like records (requested by @fourjay #1179)
1161
+ - [ods] add `odf` filetype for Open Document Format spreadsheets
1162
+ - [xlsx] add extra columns (`cellobject`, `fontcolor`, `fillcolor`) if `options.xlsx_meta_columns` (default False) (thanks @hoclun-rigsep for PR #1098)
1163
+ - [sqlite] allow query/insert (no modify/delete yet) for `WITHOUT ROWID` tables (requested by @stephancb #1111)
1164
+
1165
+ ## Bugfixes
1166
+
1167
+ - [savers compression formats] fix corruption when saving to compression formats (#1159)
1168
+ - fix "ModuleNotFoundError: no module named 'plugins'" error on startup (#1131 #1152)
1169
+ - [windows] fix issue with Enter key on Windows (reported by @hossam-houssien #1154)
1170
+ - [draw] fix multiline rows by making height fixed for all rows (reported by @geekscrapy #916)
1171
+ - [DirSheet] fix bug where fix key column sheets (e.g. DirSheet, SqliteIndexSheet) keycols were not being saved in batchmode (reported by @geekscrapy #1181)
1172
+ - [async] make sure all threads started on sheet are cancelable (reported by @geekscrapy #1136)
1173
+ - [AttrDict] fix bug with setting value on nested AttrDict
1174
+ - [dup-X-deep] fix error with async_deepcopy (thanks @pstuifzand for fix)
1175
+ - [join] fix 'inconsistent-keys' issue when joining between XlsxSheet with typed columns and CsvSheet with untyped columns (reported by @davidwales #1124)
1176
+ - [sqlite] handle sqlite column names with spaces (thanks @davidskeck for PR #1157)
1177
+ - [sqlite] use `options.encoding` and `options.encoding_errors` for decoding of sqlite db text (reported by @WesleyAC #1156)
1178
+ - [xlsx] add handling for EmptyCell instances (thanks @hoclun-rigsep for PR #1121)
1179
+ - [xlsx] gate sheet name cleaning on `options.clean_names` (reported by @davidwales #1122)
1180
+ - [macos] fix bindings for `Option`+key
1181
+ - [random-rows] fix import (reported by @geekscrapy #1162)
1182
+ - [save-selected] better default save filename (reported by @geekscrapy #1180)
1183
+ - [save] fix bug where saving multiple sheets to a single non-embeddable format did not result in fail (reported by @geekscrapy #1180)
1184
+ - [slide] fix Shift slide-down and Shift slide-up with arrow keys (reported by @a-y-u-s-h #1137)
1185
+ - [replay] fix replay where `join-sheets` operation hangs (reported by @agjohnson #1141)
1186
+ - [undo] no more KeyError when Undoing modifications (reported by @geekscrapy #1133)
1187
+ - [unfurl-col] fix unfurl-col on cells containing exceptions (reported by @jsvine #1171)
1188
+
1189
+ # 2.6.1 (2021-09-28)
1190
+
1191
+ ## Bugfixes
1192
+
1193
+ - [editor] fix sysopen-row (thanks @frosencrantz #1116)
1194
+ - [loaders fixed] fix saver (#1123)
1195
+ - [loaders shell] fix copy-files
1196
+ - [loaders sqlite] fix import error on exception (thanks @jsvine #1125)
1197
+
1198
+ # 2.6 (2021-09-19)
1199
+
1200
+ ## Major feature
1201
+
1202
+ - [menu] new hierarchical menu system
1203
+ - `Alt+F`, `Alt+E`, etc to open submenus (`Alt+` underlined capital letter in toplevel menu)
1204
+ - `Ctrl+H` to activate Help menu (manpage now at `gCtrl+H`)
1205
+ - `q` or `Esc` to exit menu
1206
+ - Enter to expand submenu item or execute command
1207
+ - or left mouse click to activate and navigate menu
1208
+ - only show commands available on current sheet
1209
+ - sheet-specific commands highlighted with `options.color_menu_spec`
1210
+ - new options:
1211
+ - `disp_menu`: display menu if inactive (default True). Can still activate menu with Ctrl+H/Alt+F
1212
+ - `disp_menu_keys`: whether to display shortcuts inline (default True)
1213
+ - `disp_menu_fmt`: upper right display on menu bar (like `disp_status_fmt`/`disp_rstatus_fmt`)
1214
+ - theme colors: `color_menu` `color_menu_active` `color_menu_spec` `color_menu_help`
1215
+ - theme chars: `disp_menu_boxchars` `disp_menu_more` `disp_menu_push` `disp_menu_input` `disp_menu_fmt`
1216
+
1217
+ ## Interface changes
1218
+
1219
+ - [expand-col] only expand to one level
1220
+ - [slide] remove slide row/col with mouse
1221
+ - [macos] add bindings for Option+key to Alt+key
1222
+ - [modified] limit use of sheet protection (thanks @geekscrapy #1037)
1223
+ - [python] rebind g^X to new import-python command (what exec-python was mostly used for)
1224
+ - [npy] add `npy_allow_pickle` option (default False)
1225
+ - [join] rename join-sheets on IndexSheet to join-selected; bind both g& and & to join-selected
1226
+ - [loaders pandas] add error message for unpickling non-dataframes
1227
+ - [join] fail if no key columns on any sheet (thanks @geekscrapy #1061)
1228
+ - [loaders xlsx] enable access to cell metadata (thanks @hoclun-rigsep #1088)
1229
+ - many performance, progress bar, and UI responsiveness improvements
1230
+
1231
+ ## Bugfixes
1232
+
1233
+ - [cli] issue warning if +sheet-position not found (thanks @geekscrapy #1046)
1234
+ - [clipboard] do not copy newline for syscopy-cell (thanks @geekscrapy #1064)
1235
+ - [column] detect existing column by row key instead of column name (thanks @geekscrapy #1058)
1236
+ - [color] set `color_current_row` to the same precedence as `color_current_column` (thanks @frosenrantz #1100)
1237
+ - [command] do not fail/abort on unknown command
1238
+ - [draw] Sort indicator on top of More indicator (thanks @geekscrapy #1071)
1239
+ - [join] fix multiple extend (thanks @cwarden)
1240
+ - [join] allow extended columns to be modified (thanks @cwarden)
1241
+ - [join] fix for rowdefs without bool (like pandas)
1242
+ - [loaders dirsheet] continue after exception in copyfile
1243
+ - [loaders fixed] fix fixed-format saver
1244
+ - [loaders fixed] save uses `global options.encoding` (thanks @geekscrapy #1060)
1245
+ - [loaders mysql] do not stop loading on first error (thanks @SuRaMoN #1085)
1246
+ - [loaders pandas] fix column rename
1247
+ - [loaders sqlite] save based on column names, not position
1248
+ - [loaders sqlite] allow changing value of cells that were NULL (thanks @mattenklicker #1052)
1249
+ - [loaders sqlite] add message on not currently supporting WITHOUT ROWID (thanks @stephancb #1111)
1250
+ - [multisave] fix breaking typo
1251
+ - [open_txt] load new blank sheet for 0 byte files (thanks @geekscrapy #1047)
1252
+ - [save] do not set a default for `options.save_filetype` (thanks @frosencrantz #1072)
1253
+ - [split-pane mouse] activate pane on click (thanks @frosencrantz #954)
1254
+ - [unfurl] handle unfurling exceptions (close #1053)
1255
+ - [quitguard] confirm quit when set on a specific sheet even if not precious or modified
1256
+ - [yaml] Fix yaml loader traces on no attribute `_colnames` (thanks @frosencrantz #1104)
1257
+ - [visidatarc] catch all visidatarc exceptions upon load
1258
+
1259
+ # v2.5 (2021-07-08)
1260
+
1261
+ - [social] #visidata has moved off of freenode to libera.chat
1262
+ - [deps] required pandas version for the pandas loader has been bumped to at least 1.0.5
1263
+ - [caa] new PR submitters required to sign CAA
1264
+
1265
+ ## Features
1266
+
1267
+ - [cli] when no arguments on commandline, open currentDirSheet (previously vdmenu); -f opens empty sheet of that filetype
1268
+ - [clipboard] bind `x` family to `cut-*` (thanks @geekscrapy #895)
1269
+ - [date] add specialized comparators for `datetime.date` (thanks @aborruso #975)
1270
+ - visidata.date now compares to datetime.date (previously raised exception)
1271
+ - identical dates compare equal even if intra-day times are different
1272
+ - this does not work for incompletely specified visidata.date; e.g.
1273
+ `visidata.date(2016, 10, 29, 4, 0, 0) != visidata.date(2016, 10, 29)`
1274
+ - [DirSheet] add y/gy to copy file(s) to given directory
1275
+ - [loaders vds] save non-jsonable cells as string (thanks @pacien #1011)
1276
+ - [loaders zstd] support loading zstd-compressed files (thanks @lxcode #971)
1277
+ - [movement] bind `Ctrl+Left/Right` to `go-left`/`right-page` (thanks @davidwales #1002)
1278
+ - [options] save to foo.visidatarc from OptionsSheet (thanks @njthomas #958)
1279
+ - [sqlite] RENAME and DROP tables from SqliteIndexSheet
1280
+ - [unfurl] add `options.unfurl_empty` to include row for empty list/dict (thanks @frosencrantz #898)
1281
+ - [quitguard] confirm quit/reload only if sheet modified (references #955, #844, #483; thanks @jvns, @frosencrantz)
1282
+
1283
+ ## Improvements
1284
+
1285
+ - [addRow] advance cursor if row inserted before cursor
1286
+ - [archive] add .lzma as alias for .xz
1287
+ - [clipboard] gzp pastes None if nothing on clipboard
1288
+ - [clipboard] make syspaste async
1289
+ - [clipboard] bind `zP` to syspaste-cells and gzP to syspaste-cells-selected (thanks @jvns and frosencrantz #983, #990)
1290
+ - [cliptext] better support for combining and variant chars (thanks @lxcode #758 #1034)
1291
+ - [colors] reduce color swatch size to remove flashing (thanks @frosencrantz #946)
1292
+ - [encoding] specify encoding explicitly for all Path.open_text (thanks @pacien #1016)
1293
+ - [error] exceptionCaught(status=False) to add to status history, but not post to status (thanks @frosencrantz #982)
1294
+ - [freqtbl] copy fmtstr from source col to aggcol (thanks @geekscrapy #1003)
1295
+ - [help] ENTER/exec-command to execute command on undersheet (thanks @geekscrapy #1011)
1296
+ - [help] add `all_bindings` hidden column (thanks @frosencrantz #896)
1297
+ - [inputs] put reused input at end of lastInputs (thanks @geekscrapy #1033)
1298
+ - [loaders json] streamify save to .json
1299
+ - [loaders npy] add `npy_allow_pickle` option, default False
1300
+ - [loaders tsv] increase bufsize to improve loader performance by 10%
1301
+ - [path] all Path.open track Progress via read/filesize (thanks @jspatz #987)
1302
+ - [path] add Progress for opening compressed files
1303
+ - [path] implement line-seek operations (thanks @pacien #1010)
1304
+ - [regex expand] deprecate `options.expand_col_scanrows`; standardize on `options.default_sample_size` (thanks @jsvine)
1305
+ - [regex] "match regex" to "capture regex" (thanks @geekscrapy #1032)
1306
+ - [shell] `addcol-shell` pass command to $SHELL (thanks @juston2004 #1023)
1307
+ - [shortcut] allow shortcut for jump-sheet to be settable
1308
+ - [splitwin] push sheet in empty pane iff splitwin
1309
+ - [stdin] use cli --encoding option for piped data (thanks @pacien #1018)
1310
+ - [undo] remove undo for reload (replaced with quitguard+confirm)
1311
+ - [quit] add Shift+Q/quit-sheet-free to quit and free associated memory (thanks @cwarden)
1312
+
1313
+ ## Display
1314
+ - [canvas] add `options.disp_canvas_charset` to change displayed chars (thanks @albert-ying #963)
1315
+ - [canvas] use sheet specific options for draw
1316
+ - [disp] format list/dict as [n]/{n} only for anytype
1317
+ - [save] iterdispvals(format=True) convert None to empty string
1318
+
1319
+ ## Bugfixes
1320
+
1321
+ - [batch] ensure quitguard is off during batch mode
1322
+ - [canvas[ fix error on dive into cursor including y-axis
1323
+ - [cli] have an actual error if there is a missing argument for final option
1324
+ - [cli] do nothing (no error) if no sources given
1325
+ - [clipboard] fix zy/gzp regression (thanks @sfranky #961)
1326
+ - [clipboard] syscopy-cell do not include column name
1327
+ - [cmdlog] fix bug where customising replayable options in Options Sheet led to issues opening metasheets (thanks @jsvine #952)
1328
+ - [cmdlog] fix bug where cmdlog records new sheet name, instead of old sheet name for `rename-sheet` (thanks @aborruso #979)
1329
+ - [color] track precedence so colorizers apply over `color_current_row`
1330
+ - [color] determine color availability with `init_pair`
1331
+ - [color] do not break on nonsense color
1332
+ - [column] getitemdeep/setitemdeep get/set dotted item key if exists (thanks @frosencrantz #991)
1333
+ - [column] fix bug where hard crash occurs when cursor on cell of SheetsSheet is on cursorDisplay (thanks @frosencrantz #1029)
1334
+ - [curses] add default `vd.tstp_signal` for non-cli users
1335
+ - [execCommand] warn gracefully if bound command longname does not exist
1336
+ - [expr] setValuesFromExpr do not stop processing on exception
1337
+ - [join] fix when keys have different names (thanks @aborruso #964)
1338
+ - [join] fix for rowdefs without bool (like pandas)
1339
+ - [join] fix multiple extend (thanks @cwarden for reporting)
1340
+ - [loaders fixed] fix editing in final column for fixed-width load (thanks @mwayne #974)
1341
+ - [loaders geojson] do not abort plot if rows have errors
1342
+ - [loaders html] add columns even if not in first row
1343
+ - [loaders pandas] fix column rename
1344
+ - [loaders rec json] fix adding new columns for json and rec loaders (thanks @ajkerrigan #959)
1345
+ - [loaders postgresql] add postgresql scheme (fixes #966) (thanks @zormit #967)
1346
+ - [loaders sqlite] fix saving deleted cells (thanks @mattenklicker #969)
1347
+ - [loaders vds] save SettableColumn as Column (thanks @pacien #1012)
1348
+ - [loaders zip] fix extract-selected-to
1349
+ - [open] fix regression where opening blank sheets of type tsv, csv, txt, etc was not working
1350
+ - [plugins] fix stdout/error from plugins installation message (was in bytes, changed to str)
1351
+ - [quit] remove sheets from **Sheets Sheet** upon quit
1352
+ - [save-col] fix inputPath error (thanks @savulchik #962)
1353
+ - [shell] fix `options.dir_hidden`; also apply to dirs when `dir_recurse`
1354
+ - [textsheet] fix reload after `^O` sysopen
1355
+
1356
+ ## vdplus
1357
+
1358
+ - moved clickhouse, vsh, vgit, windows to vdplus
1359
+
1360
+
1361
+ # v2.4 (2021-04-11)
1362
+
1363
+ - [splitwindow] stabilize sheet stack associations
1364
+ - `Shift+Z` pushes 'under sheet' (if any) onto other stack
1365
+ - `Shift+Z` does not swap panes anymore
1366
+ - `g Tab` swaps panes
1367
+ - `options.disp_splitwin_pct` is always not sheet-specific
1368
+
1369
+ - [status] show nSelectedRows on rstatus
1370
+
1371
+ - [color] remove `options.use_default_colors` (thanks @lxcode #939)
1372
+ - `options.color_default` can now have both fg and bg
1373
+ - other color options which do not specify fg or bg will use the missing component from `color_default`
1374
+ - to use terminal default colors, set `options.color_default=""`
1375
+
1376
+ ## Bugfixes
1377
+
1378
+ - [loaders gzip] fix progress bar when opening gzip (thanks @geekscrapy #925)
1379
+ - [loaders http] fix loading files from url without specifying filetype
1380
+ - [loaders sqlite] use `TABLE_XINFO` for hidden/virtual columns (thanks @dotcs #945)
1381
+ - [loaders sqlite] perf improvement: do not pre-count rows (required full table scan)
1382
+ - [loaders vds] save typed values instead of formatted display values (thanks @frosencrantz #885)
1383
+ - [loaders xlsx] stringify "header" row values for column names (thanks @davidwales #921)
1384
+ - [pyobj-show-hidden] grab visibility lvl from sheet specific option (thanks @frosencrantz #947)
1385
+ - [splitwin] prevent flickering-on-full-window
1386
+ - [splitwin] if top sheet quit, keep bottom sheet in bottom pane
1387
+ - [splitwin] full-screen/splitwin close all sheets should be part of the same stack
1388
+
1389
+ # v2.3 (2021-04-03)
1390
+
1391
+ ## Features
1392
+ - [colors] allow background colors (thanks @frosencrantz #435)
1393
+ - use "*fg* on *bg*" e.g. "212 yellow on 14 red"
1394
+ - "bg *bg* fg *fg*" (or reversed)
1395
+ - attributes always apply to foreground regardless of position in colorstr
1396
+ - as before, only the first valid color in a category (fg/bg) is used; subsequent color names (even unknown ones) are ignored
1397
+ - allocate colors on demand, instead of "all" 256 colors as fg
1398
+ - **Colors Sheet** now only includes colors actually allocated
1399
+ - [colors] set `use_default_colors` default to `True` (was `False`)
1400
+ - [delete] do not move deleted values to clipboard (thanks @geekscrapy #895)
1401
+ - `delete-*` commands are changed to not alter the clipboard
1402
+ - the previous `delete-*` commands are renamed to `cut-*` (unbound)
1403
+ - this affects: `delete-row`, `delete-selected`, `delete-cell`, `delete-cells`
1404
+ - [jump-first] bound `g^^` to cycle through sheets
1405
+ - [null] `zd` / `gzd` `delete-cells` set to `options.null_value` instead of `None`
1406
+ - [memories] add MemorySheet on `Alt+M`, `Alt+m` adds current cell to sheet (thanks @UrDub and @geekscrapy #912)
1407
+ - useful for storing values to reference later
1408
+ - both names and values can be edited on MemorySheet
1409
+ - [aggregator] `memo-aggregator`(z+; formerly called `show-aggregate`) adds value to memory sheet
1410
+ - [clipboard] clipboard stored on memory sheet; zy/zp use vd.memory.clipval;
1411
+ - [plugins] allow install from github url to local pip repo
1412
+ - [plugins] add darkdraw to plugins.jsonl
1413
+ - [png] save image as RGBA
1414
+ - [pyobj-expr] `Ctrl+X` within `Ctrl+X` input suspends directly into python REPL
1415
+ - [splitwin] now involves two different sheetstacks that build and quit independently (thanks @lamchau #894)
1416
+ - [splitwin] allows stickier panes for push/quit
1417
+ - [splitwin] splitwin-half (`Z`) swaps panes if already active
1418
+ - [splitwin] only re-split (with `zZ`) if sheets are not already split, otherwise adjust split percent
1419
+ - [save_filetype] if `save_ext` does not exist, or if `options.save_filetype` is different from default, use `options.save_filetype`
1420
+ - [vdplus] auto-import, ignore if not available
1421
+
1422
+ ## Bugfixes
1423
+ - [aggregator] fix typo in deciles description (thanks @cwarden #922)
1424
+ - [copy] copying BasicRow (new sheets), now does not error (still blank)
1425
+ - [cmdlog] for `open-file` source logging in cmdlog, we want paths to physical files, so if src is a **Sheet** grabs its source
1426
+ - [defer] fix pasting in deferred sheets
1427
+ - [eval] fix **ExprColumns** on empty rows
1428
+ - [help] move signal config earlier in runcycle, to accommodate --help (thanks @frosencrantz #926)
1429
+ - [open] create blank sheet of appropriate type when path does not exist
1430
+ - [pandas] fix conflict between dropped index and existing column (thanks thomanq #937)
1431
+ - [plugins] only check for plugins.jsonl once daily (previously: every start-up)
1432
+ - [pivot] fix `openRow`
1433
+ - [pivot] fix bug with sheet name
1434
+ - [png] fix saving directly from canvas
1435
+ - [sort] fix sorting of visidata.Path objects (thanks @frosencrantz #897)
1436
+ - [splitwin] fix cursor behaviour on both panes when active
1437
+ - cursor movement on inactive panes is blocked
1438
+ - [SuspendCurses] workaround for bug in curses.wrapper (thanks @frosencrantz #899)
1439
+ - [undo] do not set undo for a `commit-sheet`
1440
+
1441
+ ## Api
1442
+ - [addRows] addRows(rows, index, undo) adds rows at index, sets undo if True
1443
+ - set undo to False, if using addRows within an addUndo function
1444
+ - [deleteBy] add an undo flag to deleteBy
1445
+ - [clipboard] change `cliprows` to be a simple list of rows
1446
+ - new **DrawablePane** super-base class
1447
+ - [json] rowdef now **AttrDict** for massive convenience
1448
+
1449
+ # v2.2.1 (2021-02-07)
1450
+
1451
+ ## Bugfixes
1452
+ - [setcol-fill] use row identity to identify selected rows (thanks @frosencrantz, #884)
1453
+ - for jsonl, empty rows are identical ({}), and if ones is selected, previously it would result in all of them being filled.
1454
+ - also, fill with most recent *non-null* value
1455
+
1456
+ ## man
1457
+ - add a manpage visidata.1
1458
+ - fix typo
1459
+
1460
+ # v2.2 (2021-01-30)
1461
+
1462
+ ## Options
1463
+
1464
+ - [cli options] now global by default; use `-n` to set option as sheet-specific instead
1465
+ - add `-n`/`--nonglobal` to make subsequent CLI options "sheet-specific" (applying only to paths specified directly on the CLI)
1466
+ - keep `-g`/`--global` to make subsequent CLI options "global" (applying to all sheets by default unless overridden)
1467
+ - invert the default: now CLI options are global by default (thus `-g` is a no-op unless preceded by `-n` on the CLI)
1468
+ - `-g` no longer acts as a toggle
1469
+
1470
+ - [input] add `options.input_history` (thanks @tsibley and @ajkerrigan #468)
1471
+ - basename of file to store persistent input history (default of `''` means disabled)
1472
+ - caveat: persistent file only read if option given before first input
1473
+
1474
+ - [options.fancy_chooser] now disabled by default--use `Ctrl+X` to open from a choose() prompt
1475
+
1476
+ ## Types
1477
+
1478
+ - [types] add `floatlocale` type (thanks @Guiriguanche #863)
1479
+ - add commands `type-floatlocale` and `type-floatlocale-selected` (unbound by default)
1480
+ - `floatlocale` parses based on `LC_NUMERIC` envvar (must be set before launching)
1481
+ - parsing is 20x slower than with standard float column
1482
+ - will parse commas as decimals (e.g. '1,1') if LC_NUMERIC is set to a locale like 'en_DK.UTF-8'
1483
+
1484
+ ## Loaders
1485
+
1486
+ - [loaders geojson] add loading and saving support for geojson files (thanks @draco #876)
1487
+ - [loaders vds] add loader/saver for custom .vds format (VisiData Sheet) to save column properties and data for multiple sheets in one file
1488
+ - [ux] autoload all subsheets by default; set `options.load_lazy` to disable
1489
+ - removes a minor friction with unloaded subsheets
1490
+
1491
+ - [loaders http] add `options.http_max_next` to limit api pagination (default 0 - no pagination) (thanks @aborruso #830)
1492
+
1493
+ ## Bugfixes and Adjustments
1494
+
1495
+ - [cli] fail properly if path cannot be opened
1496
+ - [defer] only mention number of deleted rows, if some were deleted
1497
+ - [go-pageup go-pagedown] ensure cursor stays in the same relative positions
1498
+ - [loaders mysql] fix mysql loader duplicating tables for each database (thanks @SuRaMoN #868)
1499
+ - [loaders mysql] perform asynchronous data fetch for mysql loader (thanks @SuRaMoN #869)
1500
+ - [loaders pandas] fix empty subsets for dup-selected and frequency table `open-row` (thanks @ajkerrigan #881 #878)
1501
+ - [loaders shp] fix display (thanks @dracos #874)
1502
+ - [loaders shp] fix saving to geojson (thanks @dracos #876)
1503
+ - [replay] fix replaying of .vd with `set-option`
1504
+ - [slide] fix bug when sliding key columns to the left, after sliding them to the right
1505
+ - [types] add command `type-floatsi-selected` on **Columns Sheet**
1506
+
1507
+ - [expand] errors and nulls can now be expanded with `expand-cols` (thanks @geekscrapy #865)
1508
+
1509
+ - [open] openSource now uses **'global'** `options.filetype` instead of sheet-specific as previous
1510
+ - to set the filetype for a file locally, set through cli: `vd -f tsv sample.foo`
1511
+ - to set in the **CommandLog**, use sheet="global" with longname="set-option"
1512
+
1513
+ - [loaders http] raise exception if http status is not 20x (thanks @geekscrapy #848)
1514
+ - [loaders shp] support more Shapefile types (thanks @dracos #875)
1515
+
1516
+ ## API
1517
+ - add `create` kwarg to `openSource()`, to create the file if it does not exist already
1518
+ - [settings] 'global' is now 'default', and 'override' is 'global'
1519
+ - 'default' is the default setting within VisiData
1520
+ - 'global' is a user override on that default that applies globally
1521
+ - sheet-specific overrides global and default, for the sheet it is specific to
1522
+ - options set through visidatarc and cli are 'global' unless otherwise specified
1523
+ - [save] grab `save_foo` from **SheetType** first
1524
+ - allows overrides of sheet-specific saving
1525
+
1526
+ # v2.1.1 (2021-01-03)
1527
+
1528
+ - [macros] allow macro interfaces to be longnames (thanks @frosencrantz #787)
1529
+ - [save] better default save filename for url sheets (thanks @geekscrapy #824)
1530
+
1531
+ ## Bugfixes
1532
+ - [cmdlog] record column, sheet, and row info for open-cell
1533
+ - [cmdlog] catch case of 'override' sheet for set-option
1534
+ - [expr-col] `curcol` now works for multiple invocations (thanks @geekscrapy #659)
1535
+ - [loaders postgres] account for postgres_schema when rendering Postgres tables (thanks @jdormit for PR #852)
1536
+ - [loaders url] fail unknown URL scheme (thanks @geekscrapy for PR #84)
1537
+ - [pyobj] fix Pyobj Sheets for lists (thanks @brookskindle #843)
1538
+ - [pipe] handle broken pipes gracefully (thanks @robdmc #851)
1539
+ - [scroll] fix issue with jagged scrolling down (thanks @uoee #832)
1540
+ - [sort] fix bug where total progress in sorting is (100 * # of columns to sort) (thanks @cwarden)
1541
+
1542
+ ## api
1543
+ - format_field formats int(0) and float(0.0) as "0" (thanks @geekscrapy for PR #821)
1544
+ - add TypedWrapper.__len__ (thanks @geekscrapy)
1545
+
1546
+ # v2.1 (2020-12-06)
1547
+
1548
+ - [add] add bulk rows and cols leave cursor on first added (like add singles)
1549
+ - [add] add colname input to `addcol-new`
1550
+ - [aggregators] add mode and stdev to aggregator options (thanks @jsvine for PR #754)
1551
+ - [api] add options.unset()
1552
+ - [columns] add hidden 'keycol' to **ColumnsSheet** (thanks @geekscrapy for feature request #768)
1553
+ - [cli] support running as `python -m visidata` (thanks @abitrolly for PR #785)
1554
+ - [cli] add `#!vd -p` as first line of `.vdj` for executable vd script
1555
+ - [cli] allow `=` in `.vd` replay parameters
1556
+ - [clipboard] clipboard commands now require some selected rows #681
1557
+ - [commands] add unset-option command bound to `d` on OptionsSheet #733
1558
+ - [config] `--config=''` now ignores visidatarc (thanks @rswgnu for feature request #777)
1559
+ - [defer] commit changes, even if no deferred changes
1560
+ - [deprecated] add traceback warnings for deprecated calls (thanks @ajkerrigan for PR #724)
1561
+ - [display] add sort indication #582
1562
+ - [display] show ellipsis on left side with non-zero hoffset (thanks @frosencrantz for feature request #751)
1563
+ - [expr] allow column attributes as variables (thanks @frosencrantz for feature request #659)
1564
+ - [freq] change `numeric_binning` back to False by default
1565
+ - [input] Shift+Arrow within `edit-cell` to move cursor and re-enter edit mode
1566
+ - [loaders http] have automatic API pagination (thanks @geekscrapy for feature request #480)
1567
+ - [loaders json] improve loading speedup 50% (thanks @lxcode for investigating and pointing this out #765)
1568
+ - this makes JSON saving non-deterministic in Python 3.6, as the order of fields output is dependent on the order within the dict
1569
+ - (this is the default behaviour for dicts in Python 3.7+)
1570
+ - [loaders json] try loading as jsonl before json (inverted)
1571
+ - jsonl is a streamable format, so this way it doesn't have to wait for the entire contents to be loaded before failing to parse as json and then trying to parse as jsonl
1572
+ - fixes api loading with http so that contents of each response are added as they happen
1573
+ - unfurl toplevel lists
1574
+ - functionally now jsonl and json are identical
1575
+ - [loaders json] try parsing `options.json_indent` as int (thanks @frosencrantz for the bug report #753)
1576
+ this means json output can't be indented with a number. this seems like an uncommon use case
1577
+ - [loaders json] skip lines starting with `#`
1578
+ - [loaders pdf] `options.pdf_tables` to parse tables from pdf with tabular
1579
+ - [loaders sqlite] use rowid to update and delete rows
1580
+ - note that this will not work with WITHOUT ROWID sqlite tables
1581
+ - [loaders xlsx] add active column (thanks @kbd for feature request #726)
1582
+ - [loaders zip] add extract-file, extract-selected, extract-file-to, extract-selected-to commands
1583
+ - [macros] add improved macro system (thanks @bob-u for feature request #755)
1584
+ - `m` (`macro-record`) begins recording macro; `m` prompts for keystroke, and completes recording
1585
+ - macro can then be executed every time provided keystroke is used, will override existing keybinding
1586
+ - `gm` opens an index of all existing macros, can be directly viewed with `Enter` and then modified with `Ctrl+S`
1587
+ - macros will run command on current row, column sheet
1588
+ - remove deprecated `z Ctrl+D` older iteration of macro system
1589
+ - [regex] use capture names for column names, if available, in `capture-col` (thanks @tsibley for PR #808)
1590
+ - allows for pre-determining friendlier column names, saving a renaming step later
1591
+ - [save] `g Ctrl+S` is `save-sheets-selected` on **IndexSheet**
1592
+ - new command allows some or all sheets on an **IndexSheet** to be saved (and not the sheets on the sheet stack)
1593
+ - [saver] add fixed-width saver (uses col.width)
1594
+ - [saver sqlite] ensureLoaded when saving sheets to sqlite db
1595
+ - [search] `search-next` and `searchr-next` are now bound to n and N (was `next-search` and `search-prev`)
1596
+ - [select] differentiate select-equal- and select-exact- (thanks @geekscrapy for feature request #734)
1597
+ - previous select-equal- matched type value
1598
+ - now select-equal- matches display value
1599
+ - add `z,` and `gz,` bindings for select-exact-cell/-row
1600
+ - [sheets] sorting on **SheetsSheet** now does not sort **SheetsSheet** itself. (thanks @klartext and @geekscrapy for bug reports #761 #518)
1601
+ - [status] use `color_working` for progress indicator (thanks @geekscrapy for feature request #804)
1602
+ - [types] add floatsi parser (sponsored feature by @anjakefala #661)
1603
+ - floatsi type now parses SI strings (like 2.3M)
1604
+ - use `z%` to set column type to floatsi
1605
+
1606
+ ## Bugfixes
1607
+
1608
+ - [api] expose visidata.view (thanks @alekibango for bug report #732)
1609
+ - [color] use `color_column_sep` for sep chars (thanks @geekscrapy for bug report)
1610
+ - [defer] frozen columns should not be deferred (thanks @frosencrantz for bug report #786)
1611
+ - [dir] fix commit-sheet and delete-row on DirSheet
1612
+ - [draw] fix display for off-screen cursor with multiline rows
1613
+ - [expr] remove duplicate tabbing suggestions (thanks @geekscrapy for bug report #747)
1614
+ - [expr] never include computing column (thanks @geekscrapy for bug report #756)
1615
+ - only checks for self-reference; 2+ cycles still raises RecursionException
1616
+ - caches are now for each cell, instead of for each row
1617
+ - [freeze] freeze-sheet with errors should replace with null
1618
+ - [loaders frictionless] assume JSON if no format (thanks scls19fr for bug report #803)
1619
+ - from https://specs.frictionlessdata.io/data-resource/#data-location):
1620
+ - a consumer of resource object MAY assume if no format or mediatype property is provided that the data is JSON and attempt to process it as such.
1621
+
1622
+ - [loaders hdf5] misc bugfixes to hdf5 dataset loading (thanks @amotl for PR #728)
1623
+ - [loaders jsonl] fix copy-rows
1624
+ - [loaders pandas] support loading Python objects directly (thanks @ajkerrigan for PR #816 and scls19fr for bug report #798)
1625
+ - [loaders pandas] ensure all column names are strings (thanks @ajkerrigan for PR #816 and scls19fr for bug report #800)
1626
+ - [loaders pandas] build frequency table using a copy of the source (thanks @ajkerrigan for PR #816 and scls19fr for bug report #802)
1627
+ - [loaders sqlite] fix commit-sheet
1628
+ - [loaders sqlite] fix commit deletes
1629
+ - [loaders xlsx] only reload Workbook sheets to avoid error (thanks @aborruso for bug report #797)
1630
+ - [loaders vdj] fix add-row
1631
+ - [man] fix warnings with manpage (thanks @jsvine for the bug report #718)
1632
+ - [movement] fix scroll-cells (thanks @jsvine for bug report #762)
1633
+ - [numeric binning] perform degenerate binning when number of bins greater than number of values
1634
+ - (instead of when greater than width of bins)
1635
+ - [numeric binning] if width of bins is 1, fallback to degenerate binning
1636
+ - [numeric binning] degenerate binning should resemble non-numeric binning (thanks @setop for bug report #791)
1637
+ - [options] fix `confirm_overwrite` in batch mode
1638
+ - fix `-y` to set `confirm_overwrite` to False (means, no confirmation necessary for overwrite)
1639
+ - make `confirm()` always fail in batch mode
1640
+ - make `confirm_overwrite` a sheet-specific option
1641
+ - [plugins] only reload **Plugins Sheet** if not already loaded
1642
+ - [replay] move to replay context after getting sheet (thanks @rswgnu for bug report #796)
1643
+ - [replay] do not push replaying .vd on sheet stack (thanks @rswgnu for bug report #795)
1644
+ - [scroll] zj/zk do nothing in single-line mode (thanks @jsvine for suggestion)
1645
+ - [shell] empty stdin to avoid hanging process (thanks @frosencrantz for bug report #752)
1646
+ - [status] handle missing attributes in `disp_rstatus_fmt` (thanks @geekscrapy for bug report #764)
1647
+ - [tabulate] fix savers to save in their own format (thanks @frosencrantz for bug report #723)
1648
+ - [typing] fix indefinite hang for typing (thanks @lxcode for issue #794)
1649
+ - [windows] add Ctrl+M as alias for Ctrl+J #741 (thanks @bob-u for bug report #741)
1650
+ - [windows man] package man/vd.txt as a fallback for when man is not available on os (thanks @bob-u for bug report #745)
1651
+
1652
+ ## Plugins
1653
+ - add conll loader to **PluginsSheet** (thanks @polm)
1654
+ - remove livesearch
1655
+ - add clickhouse loader
1656
+
1657
+ ## Commands
1658
+ - if `options.some_selected_rows` is True, `setcol-expr`, `setcol-iter`, `setcol-subst`, `setcol-subst`, `setcol-subst-all` will return all rows, if none selected
1659
+
1660
+ ## API
1661
+ - [columns] add Column.visibleWidth
1662
+ - [open] additionally search for `open_filetype` within the vd scope
1663
+ - [select] rename `someSelectedRows` to `onlySelectedRows`
1664
+ - [select] add new `someSelectedRows` and `options.some_selected_rows` (thanks maufdez for feature request #767)
1665
+ - if options is True, and no rows are selected, `someSelectedRows` will return all rows
1666
+ - [status] allow non-hashable status msgs by deduping based on stringified contents
1667
+ - [isNumeric] isNumeric is part of vdobj
1668
+
1669
+ # v2.0.1 (2020-10-13)
1670
+
1671
+ ## Bugfixes
1672
+ - Fix printing of motd to status
1673
+
1674
+ # v2.0 (2020-10-12)
1675
+
1676
+ ## Additions and Improvements
1677
+ - [aggregators] allow custom aggregators in plugins/visidatarc (thanks @geekscrapy for the feature request #651)
1678
+ - [loaders xlsx] automatically clean sheet name when saving; warn if sheet name changes (thanks @geekscrapy for the request #594)
1679
+ - [columns] unhide height attribute by default (thanks @frosencrantz for feature request #660)
1680
+ - add .vcf (VCard) loader
1681
+ - [sqlite] remove name of db from an **SqliteSheet**'s name, only tablename
1682
+ - [syspaste] make `syspaste-` replayable and undoable (note that `syspaste-` value will be recorded in **CommandLog**)
1683
+ - [savers] many text saver filetypes via tabulate library (thanks @jsvine for original vdtabulate plugin)
1684
+ - [calc] ExprColumn no longer cached by default
1685
+ - [loaders rec] add new .rec file loader and multisheet saver (recutils)
1686
+ - [savers] implemented multisheet saver for both json and jsonl
1687
+ - [loaders eml] add new .eml file loader for email files with attachments
1688
+
1689
+ ## Options
1690
+ - add `options.incr_base` (thanks @chocolateboy for the suggestion #647)
1691
+ - (former) `options.force_valid_colnames` renamed to `options.clean_names`
1692
+ - applies to **Sheets** and **Columns** now (thanks @geekscrapy for the request #594)
1693
+ - for --X=Y, do not replace - with _ in Y (thanks @forensicdave for bug report #657)
1694
+ - add `options.default_height` for visibility toggle (thanks @frosencrantz for feature request #660)
1695
+ - add support for `--` option-ending option on CLI.
1696
+ - [input] default now `fancy_chooser` = True
1697
+ - when fancy_chooser enabled, aggregators and jointype are chosen with a ChoiceSheet.
1698
+ - `s` to select, `Enter` to choose current row, `g Enter` to choose selected rows, `q` to not choose any
1699
+ - numeric_binning is now True by default (enables numeric binning on **PivotSheet** and **FreqTable** for numeric columns
1700
+
1701
+ ## Command changes and additions
1702
+ - (former) setcol-range (`gz=`) renamed to `setcol-iter`
1703
+ - (former) `addcol-range-step` (`i`) renamed to `addcol-incr-step`
1704
+ - (former) `setcol-range` (`gi`) renamed to `setcol-incr`
1705
+ - (former) `addcol-range-step` (`zi`) renamed to `addcol-incr-step`
1706
+ - (former) `setcol-range-step` (`gzi`) renamed to `setcol-incr-step`
1707
+ - add `scroll-cells-*` to scroll display of cells while remaining in a Column; bind to [g]z{hjkl}
1708
+ - (former) unbind z{hjkl} from `scroll-col` (thanks @geekscrapy for feature request #662)
1709
+ - add `type-floatsi` bound to `z%` (#661)
1710
+ - `reload-selected` now reloads all **Sheets** if none selected (thanks @geekscrapy for PR #685)
1711
+ - add customdate with fixed fmtstr for parsing (use `z@` and input a fmtstr compatible with strptime (thanks @suntzuisafterU for feature request #677)
1712
+
1713
+ ## Bugfixes
1714
+ - [DirSheet] use changed ext as filetype when loading files (thanks @frosencrantz for bug report #645)
1715
+ - [slide] several major improvements to column sliding; key column sliding now works (thanks much to @geekscrapy for bug hunting #640)
1716
+ - [open-row] **Sheets Sheet** should be removed from stack upon `open-row` (thanks @cwarden for the bug report)
1717
+ - [cli] re-add --version (thanks @mlawren for bug report #674)
1718
+ - [open-config] fix `gO` (thanks @geekscrapy for bug report #676)
1719
+ - [splitwin] handle swap case for single sheet (thanks @geekscrapy for bug report #679)
1720
+ - [loaders xlsx] handle `None` column names for all **Sequence Sheet** loaders (thanks @jsvine for bug report #680)
1721
+ - [settings] retrieve from cache for top sheet if obj is None (thanks @aborruso for the bug report #675)
1722
+ - [settings] check if option is set on specific sheet before falling back to override
1723
+ - [describe] have **DescribeSheet** use source column's sheet's `options.null_value` to calculate its null column (thanks @aborruso for the bug report #675)
1724
+ - [undo] ensure that undos for complex commands (like `expand-cols`) are set more frequently (thanks @frosencrantz for the bug report #668)
1725
+ - it is still possible to find race conditions if the user presses commands fast enough, however they should happen far less frequently
1726
+ - [vlen] fix numeric binning for `vlen()` (thanks @frosencrantz for bug report #690)
1727
+ - [pivot] fix pivot case where no aggregator is set
1728
+ - [pyobj] fix filtering for **PyobjSheet**
1729
+ - [DirSheet] fix sorting for directory column of **DirSheet** (thanks @frosencrantz for bug report #691)
1730
+ - [json] fix bug saving cells with nested date values (thanks @ajkerrigan for PR #709)
1731
+ - [input] fix Ctrl+W bug when erasing word at beginning of line
1732
+ - [plugins] import `.visidata/plugins` by default
1733
+ - [pandas] use a safer `reset_index()` to avoid losing data when updating a pandas index (thanks @ajkerrigan for PR #710)
1734
+ - [threads] disable `add-row` on **ThreadsSheet** (thanks @geekscrapy for bug report #713)
1735
+
1736
+ ## deprecated
1737
+ - complete removal of `status` and `statuses` from deprecated (thanks @frosencrantz for bug report #621)
1738
+ - longnames are now `open-status` and `show-status`
1739
+ - remove `cursorColIndex`
1740
+
1741
+ ## API and Interface
1742
+ - `Sheet(*names, **kwargs)` autojoins list of name parts
1743
+ - `openSource()`, `aggregator()`, and `aggregators` are now part of vdobj
1744
+ - `set_option` is now `setOption`
1745
+ - move `isError` to `Column.isError`
1746
+ - deprecate `load_pyobj`, now **PyobjSheet**
1747
+ - add `.getall('foo_')` which returns all options prefixed with `'foo_'`; deprecated `options('foo_')`
1748
+ - `nSelected` is now `nSelectedRows`
1749
+ - make `Column.width` property, so setting is same as `Column.setWidth`
1750
+ - `evalexpr` is now `evalExpr`
1751
+ - `format` is now `formatValue`
1752
+ - `SettableColumn.cache` is now `._store`
1753
+ - `vdtype()` is now `vd.addType()`
1754
+ - add `addColumnAtCursor` (thanks @geekscrapy for bug report #714)
1755
+
1756
+ ## Plugins
1757
+ - update sparkline (thanks @layertwo #696)
1758
+ - plugin dependencies now install into `plugins-deps` (former plugin-deps)
1759
+
1760
+ ## Dev niceties
1761
+ - Fully automate dev setup with Gitpod.io (thanks @ajkerrigan for PR #673)
1762
+
1763
+
1764
+ # v2.-4 (2020-07-27)
1765
+
1766
+ ## Additions and Improvements
1767
+ - [cmdlog] allow sheet-specific set-option for replay
1768
+ - [columns] add default uppercase names for created columns (like VisiCalc)
1769
+ - these names are global; no default name is ever reused
1770
+ - [cosmetic] a column with a width 1 will now display (thanks @frosencrantz for the bug report #512)
1771
+ - [defer] move defermods and vls back into vdcore
1772
+ - configure sqlite and DirSheet to use it
1773
+ - [dir] allow explicit filetype when loading a directory (thanks @geekscrapy for the bug report #546)
1774
+ - [errors] ErrorsSheet on `g Ctrl+E` lists errors, instead of concatenating
1775
+ - [expand-cols] account for all visible rows when expanding a column (thanks @ajkerrigan for PR #497)
1776
+ - [loaders csv] use `options.safe_error` for cell exceptions on save
1777
+ - [loaders http] use file format in path if loader available (thanks @jsvine for PR #576 and bug report #531)
1778
+ - if not, fail back to MIME type (prev behaviour)
1779
+ - [loaders imap] add loader for imap://
1780
+ - [loaders json] handle non-dict rows in json data (thanks @ajkerrigan for PR #541 and @jsvine for bug report #529)
1781
+ - [loaders jsonl] show parse errors in every column
1782
+ - [loaders MySQL] add support for MySQL loader (thanks @p3k for PR #617)
1783
+ - [loaders pandas] upgrade pandas to 1.0.3 (thanks @ajkerrigan for PR #563)
1784
+ - [loaders pandas] add auto-loaders for feather, gbq, orc, parquet, pickle, sas, stata (thanks @khughitt for bug report #460)
1785
+ - [loaders pdf] add simple pdf loader
1786
+ - [loaders postgres] add support for connecting directly to rds (thanks @danielcynerio for PR #536)
1787
+ - the url has the following format: `rds://db_user@hostname:port/region/dbname`
1788
+ - it assumes that the AWS IAM for the user is configured properly
1789
+ - [loaders xls/xlsx] add save_xls and save_xlsx (thanks @geekscrapy for PR #574)
1790
+ - [loaders yaml] allow diving into YAML rows (thanks @ajkerrigan for PR #533)
1791
+ - [loaders yaml] use the default safe YAML loader (thanks @tsibley for the PR #600 )
1792
+ - the full loader is unsafe because serialized files can be constructed which run arbitrary code during their deserialization
1793
+ - the safe loader supports a very large subset of YAML and supports the most common uses of YAML
1794
+ - [loaders yaml] support files containing multiple documents (thanks @tsibley for PR #601)
1795
+ - [options] set visidata_dir and config from `$VD_DIR` and `$VD_CONFIG` (thanks @tsibley for bug report #448)
1796
+ - [type fmtstr] thousands separator (thanks @dimonf for bug report #575)
1797
+ - default for int/float is string.format for roundtripping accurately in data text files like csv
1798
+ - if fmtstr starts with '%', use locale.format_string (with grouping)
1799
+ - otherwise, use python string.format
1800
+ - currency uses locale, and is grouped.
1801
+ - [quitguard] if set on specific sheet, only confirm quit on that sheet (thanks @jsvine for bug report #538)
1802
+ - [undo] add undo for `rename-col-x` family, mouse slide, and `reload-sheet` (thanks @jsvine for feature request #528)
1803
+
1804
+ ## Command changes
1805
+ - [add-sheet] renamed to open-new; new sheet always has a single column
1806
+ - [config] bind `g Shift+O` back to open-config (#553)
1807
+ - [dive] convert many dive- commands to open- (#557)
1808
+ - add open-row bound to `ENTER` on Sheet itself
1809
+ - add `open-source` unbound on BaseSheet
1810
+ - deprecate `dive-*` longname
1811
+ - [options] options-global now `Shift+O`; options-sheet now `z Shift+O`
1812
+ - [multi-line] have visibility toggle Multi-Line Row on TextSheets (Closes #513)
1813
+ - used to toggle `wrap`
1814
+
1815
+ ## Command additions
1816
+ - [canvas] add resize-x/y-input commands to set x/y axis dimensions (thanks @pigmonkey for feature request #403)
1817
+ - [errors] add select-error-col and select-error (thanks @pigmonkey for feature request #402)
1818
+ - [input] `Ctrl+Y` paste from cell clipboard
1819
+ - [input] Ctrl+Left/Right move cursor to prev/next word
1820
+ - [iota] add `i` family of commands (iota/increment)
1821
+ - (former) setcol-range (`gz=`) renamed to `setcol-iter`
1822
+ - `addcol-range-step` (`i`): add column with incremental value
1823
+ - `secol-range` (`gi`): set current column for selected rows to incremental values
1824
+ - `addcol-range-step` (`zi`): add column with incremental values times given step
1825
+ - `setcol-range` (`gzi`): set current column for selected rows to incremental values times given step
1826
+ - [mouse] add unbound `mouse-enable` and `mouse-disable` commands
1827
+ - [quitguard add unbound `guard-sheet` command to set quitguard on current sheet (thanks jsvine for feature request #538)
1828
+ - [unfurl-col] add command, bound to `zM`, which does row-wise expansion of iterables in a column (thanks @frosencrantz for feature request and jsvine for initial code sample #623)
1829
+ - thanks @jsvine for name and initial implementation
1830
+
1831
+ ## Options
1832
+ - [cli] custom cli option parsing (thanks @tsibley for the behaviour request #573)
1833
+ - `--options` apply as sheet-specific option overrides to the sources following them
1834
+ - the last setting for a given option is the cli-given override setting (applies to all cli sources, unless they have the option already set)
1835
+ - this allows both
1836
+ - `vd -f csv foo.txt`
1837
+ - `vd foo.txt -f csv`
1838
+ - `--help` opens the manpage
1839
+ - `-g` prefix sets option globally for all sheets
1840
+ - [cli] add --imports (default "plugins") (thanks @tsibley for feature request #448)
1841
+ - space-separated list of modules to import into globals before loading .visidatarc
1842
+ - plugins can be installed by VisiData without modifying .visidatarc
1843
+ - [chooser] experimental `options.fancy_chooser`
1844
+ - when fancy_chooser enabled, aggregators and jointype are chosen with a ChoiceSheet.
1845
+ - press `ENTER` on any row to choose a single option, or select some rows, and press `ENTER` to choose the selectedrows
1846
+ - warning: the mechanism to do this effectively launches another instance of visidata, and so it is possible to get into an embedded state (if you jump around sheets, for example, instead of selecting). 'gq' should still work (thought `CTRL+Q` may need to be pressed several times).
1847
+ - [dir] add `-r` alias for `--dir-recurse`
1848
+ - [join-cols] add `options.value_joiner` to combine cell values for join-col (thanks @aborruso for feature request #550)
1849
+ - [join-cols] add `options.name_joiner` to combine column names for join-col, and sheet names for dive-row (thanks @aborruso for feature request #550)
1850
+ - sheet names for join-sheets are still joined with '+' or '&' for the time being
1851
+ - [loaders html] add `options.html_title` to exclude the sheetname when saving sheet as html table (thanks @geekscrapy for PR #566)
1852
+ - [loaders postgres] add support for custom postgres schema (Thanks @p3k for PR #615)
1853
+ - schema defaults to `public` but can be overridden using the `--postgres-schema` flag:
1854
+ - `vd --postgres-schema=foo postgres://user:pw@localhost/foobar`
1855
+ - [loaders zip] -f filetype now applies to inner files
1856
+ - [mouse] add options.mouse_interval to control the max time between press/release for click (ms)
1857
+ - set to 0 to disable completely
1858
+ - [pyobj] add `options.expand_col_scanrows` to set the number of rows to check when expanding columns (0 = all)
1859
+ - [type fmtstr] add fmtstr options for numerical types
1860
+ - add options.disp_currency_fmt
1861
+ - add options.disp_int_fmt
1862
+ - add options.disp_date_fmt
1863
+
1864
+ ## Plugins
1865
+ - [dependencies] install plugin dependencies into vd dir (thanks @tsibley for feature request #448)
1866
+ - [diff] diff is now a plugin
1867
+ - `--diff` is not available as a cmdline argument anymore
1868
+ - [vds3] bumped to 0.4 (@ajkerrigan)
1869
+ - [marks] initial release 0.1; marks selected rows with a keystroke; utils for selecting + viewing marked rows (@saulpw)
1870
+ - [genericSQL] initial release (1.0); basic loader for MySQL (Oracle, MySQL) (@aswanson)
1871
+ - [diff] is now a plugin (@saulpw)
1872
+
1873
+ ## Bugfixes
1874
+ - [cmdlog] fix case where CommandLog `open-` entries would not be replayable
1875
+ - [cmdlog] record keystrokes for command
1876
+ - [cmdlog] global cmdlog behaviour is now consistent with VisiData v1.5.2 cmdlog
1877
+ - [dirsheet] check if directory before grabbing filetype from ext (thanks @frosencrantz for bug report #629)
1878
+ - handles case where `.` in directory name
1879
+ - [helpsheet] do not include deprecated longnames (thanks @frosencrantz for bug report #621)
1880
+ - [input] flush input buffer upon newline in input; prevent pastes with accidental newlines from becoming keystrokes (thanks @geekscrapy for bug report #585)
1881
+ - [loaders csv] PEP 479 fix for csv loader (thanks @ajkerrigan for PR #499)
1882
+ - This avoids the following error when opening CSV files in Python 3.8: `RuntimeError: generator raised StopIteration`, but maintains the behaviour of gracefully handling malformed CSV files.
1883
+ - References:
1884
+ - https://www.python.org/dev/peps/pep-0479/#examples-of-breakage
1885
+ - https://github.com/python/cpython/pull/6381/files
1886
+ - [loaders html] cast to str before writing (thanks @geekscrapy for bug report #501)
1887
+ - [loaders html md] preserve formatting of display values when saving
1888
+ - [loaders html] fix string formatting issue for the html table name when saving (thanks @geekscrapy for PR #566)
1889
+ - [loaders pandas] bugfixes for sort (thanks @ajkerrigan for PR #496)
1890
+ - [loaders pandas] fix row deletion + its undo (thanks @ajkerrigan for PR #496)
1891
+ - [loaders pandas] improve regex select/unselect logic (thanks @ajkerrigan for PR #496)
1892
+ - [loaders pandas] fix row selection/deselection (thanks @ajkerrigan for PR #496)
1893
+ - [loaders postgres] load an estimate of row numbers for improved performance (thanks @danielcynerio for PR #549)
1894
+ - [loaders postgres] fix expand column to work on a json column in postgres (thanks @danielcynerio for PR #552)
1895
+ - [loaders sqlite] save display value if not supported sqlite type (thanks @jtf621 for bug report #570)
1896
+ - [loaders xml] correctly copy columns; fix path (#504)
1897
+ - [numeric-binning] fix numeric-binning bug with currency type column
1898
+ - [dir] fix dup-rows-deep on DirSheet (thanks @geekscrapy for bug report #489)
1899
+ - [rstatus] fix rstatus when repeating a command with no keystrokes (Thanks @ajkerrigan for bug report #577)
1900
+ - [save-sheets] fix saving multi-sheets as individual files to directory
1901
+ - [settings] remove internal option defaults from cmdlog
1902
+ - [sheets_all] make opened .vd/.vdj precious
1903
+ - [transpose] handle case where columns are numeric (thanks @frosencrantz for bug report #631)
1904
+ - [undo] fix undo with duplicate-named sheets (thanks @jsvine for bug report #527)
1905
+ - [utils] Fix namedlist bug with column named after VisiData attrs (particularly 'length') (thanks @tsibley for bug report #543)
1906
+
1907
+
1908
+ ## Infrastructure / API
1909
+ - [asyncsingle] ensure that unfinished threads decorated with @asyncsingle do not block upon sync()
1910
+ - used so that domotd() and PluginsSheet().reload() do not block replay progression
1911
+ - [open-] switch from vd.filetype to open_ext; deprecate vd.filetype
1912
+ - [warnings] output Python warnings to status
1913
+
1914
+ # v2.-3 (2020-03-09)
1915
+
1916
+ ## Major changes
1917
+ - [cosmetic] change default column separators
1918
+ - [json] make json load/save key order same as column order (ensures round-trip #429)
1919
+ - [commands.tsv] remove commands.tsv; move helpstr into code
1920
+
1921
+ ## Major features
1922
+ - add Split Window
1923
+ - options.disp_splitwin_pct (default: 0) controls height of second sheet on screen
1924
+ - add .vdj for cmdlog in jsonl format
1925
+ - add plugins/bazaar.jsonl for PluginsSheet in jsonl format
1926
+
1927
+ ### new commands
1928
+ - `splitwin-half` (`Shift+Z`) -- split screen, show sheet under top sheet
1929
+ - `splitwin-close` (`g Shift+Z`) -- closes split screen, current sheet full screens
1930
+ - `splitwin-swap` (`TAB`) -- swap to other pane
1931
+ - `splitwin-input` (`z Shift+Z`) -- queries for height of split window
1932
+ - `repeat-last` (unbound) -- run the previous cmd longname with any previous input (thanks #visidata for feature request! #441)
1933
+ - `repeat-input` (unbound) -- run the last command longname with empty, queried input (thanks #visidata for feature request! #441)
1934
+ - `resize-cols-input` (`gz_`) -- resize all visible columns to given input width
1935
+ - thanks @sfranky for feature request #414
1936
+ - `save-col-keys` (unbound) -- save current column and key columns
1937
+ - fixes #415; thanks @sfranky for feature request
1938
+
1939
+ ### new options
1940
+ - options.disp_float_fmt; default fmtstr to format for float values (default: %0.2f)
1941
+ - thanks khughitt for PR! #410
1942
+
1943
+ ## Additions and Improvements
1944
+ - add merge jointype (thanks @sfranky for feature request #405)
1945
+ - like "outer" join, except combines columns by name and each cell returns the first non-null/non-error value
1946
+ - use color_diff to merge join diffs
1947
+ - on edit, set values on *all* sheets which have the given row
1948
+ - adjust `save-cmdlog` input message for clarity
1949
+ - all sheets have a name (thanks @ajkerrigan for helping iron out the kinks with PR #472)
1950
+ - add args re-parsing to handle plugin options (helps with #443; thanks tkossak for bug report)
1951
+ - vdmenu should only get pushed outside of replay and batch mode
1952
+ - move cursor to row/col of undone command (thanks @jsvine for request)
1953
+ - move urlcache into async reload (affects PluginsSheet and motd)
1954
+ - add 'type' column to `SheetsSheet`
1955
+
1956
+ ### Command changes
1957
+
1958
+ - `HOME`/`END` now bound to `go-leftmost`/`go-rightmost`
1959
+ - thanks [@gerard_sanroma](https://twitter.com/gerard_sanroma/status/1222128370567327746) for request
1960
+ - `z Ctrl+HOME`/`z Ctrl+END` now bound to `go-top`/`go-bottom`
1961
+ - `Ctrl+N` now bound to `replay-advance`
1962
+
1963
+ ### longname renamings
1964
+ - `search-next` (was `next-search`)
1965
+ - `search-prev` (was `prev-search`)
1966
+ - `jump-prev` (was `prev-sheet`)
1967
+ - `go-prev-value` (was `prev-value`)
1968
+ - `go-next-value` (was `next-value`)
1969
+ - `go-prev-selected` (was `prev-selected`)
1970
+ - `go-next-selected` (was `next-selected`)
1971
+ - `go-prev-null` (was `prev-null`)
1972
+ - `go-next-null` (was `next-null`)
1973
+ - `go-right-page` (was `page-right`)
1974
+ - `go-left-page` (was `page-left`)
1975
+
1976
+ ## Plugins
1977
+ - add usd plugin
1978
+ - provide USD(s) function to convert strings with currencies to equivalent US$ as float
1979
+ - uses data from fixer.io
1980
+ - add vds3 by @ajkerrigan
1981
+ - initial support for browsing S3 paths and read-only access to object
1982
+ - add "provides" column for plugins (helps with #449; thanks @tsibley for feature request)
1983
+ - standardize author in bazaar.jsonl
1984
+ - "Firstname Lastname @githbhandle"
1985
+
1986
+ ## Bugfixes
1987
+ - [cmdlog] fix issue with `append_tsv_row`, that occurred with `options.cmdlog_histfile` set
1988
+ - [replay] fix replaying of rowkeys
1989
+ - [replay] fix race condition which required the `--replay-wait` workaround
1990
+ - [plugins] ensure that `options.confirm_overwrite` applies to plugin installation
1991
+ - [slide] fix slide-leftmost
1992
+ - had inconsistent behaviour when a sheet had key columns
1993
+ - [slide] use visibleCol variants, such that slide works as expected with hidden cols
1994
+ - [options min_memory_mb] disable (set to 0) if "free" command not available
1995
+ - [core] auto-add raw default column only if options.debug (fixes #424; thanks @frosencrantz for bug report)
1996
+ - [cli] fix --config (thanks @osunderdog for bug report! #427)
1997
+ - [draw] fix status flickering that occurred with certain terminals (thanks @vapniks for bug report #412)
1998
+ - [txt save] save all visibleCols instead of only first one
1999
+ - [json] avoid adding columns twice when loading JSON dicts (thanks @ajkerrigan for bug report (#444) and PR (#447)
2000
+ - [fixed] fixed error that occurs when there are no headerlines (thanks @frosencrantz for bug report #439)
2001
+ - [pcap] update loader with modern api
2002
+ - [csv] catch rows with csv.Errors and yield error msg
2003
+ - [curses] keypad(1) needs to be set on all newwin (fixes #458)
2004
+ - [save-sheets] address two bugs with `g Ctrl+S`
2005
+ - [batch api] override editline() in batch mode (addresses #464; thanks @Geoffrey42 for bug report)
2006
+ - [replay] better handling of failed confirm (addresses #464; thanks @Geoffrey42 for bug report)
2007
+ - [asyncthread] with changed decorators, asyncthread should be the closest decorator to the function
2008
+ - if it is not, the act of decorating becomes spawned off, instead of calls to the function being decorated
2009
+ - [canvas] update Canvas delete- commands with current API (fixes #334)
2010
+
2011
+ ## Infrastructure / API
2012
+ - rename `Sheet` to `TableSheet`
2013
+ - deprecate `Sheet` but keep it around as a synonym probably forever
2014
+ - use HTTPS protocol for git submodules (thanks @tombh for PR #419)
2015
+ - this allows installation of VisiData in automated environments such as
2016
+ Dockerfiles where the git user is not logged into Github
2017
+ - unit tests have been migrated to pytest
2018
+ - use counter to keep track of frequency of column names
2019
+ - for joins, we want un-ambiguous sheets of origin when more than one sheet has a c.name
2020
+ - all sheets use addColumn api instead of manually appending columns
2021
+ - set terminal height/width via LINES/COLUMNS via curses.use_env (thanks halloleo for feature request #372)
2022
+ - update pip command to pull development branch of vsh (thanks @khughitt for PR #457)
2023
+ - change longnames *-replay to replay-*
2024
+ - rename vd.run() to vd.mainloop()
2025
+ - `vd.save_foo(p, *sheets)` throughout
2026
+ - standardize on vd.exceptionCaught
2027
+ - Sheet.addRows renamed to Sheet.addNewRows
2028
+ - option overrides can be done with SubSheet.options
2029
+ - options set with Sheet.options
2030
+ - extend status() varargs to error/fail/warning
2031
+ - add @BaseSheet.command decorator
2032
+ - rename tidydata.py to melt.py
2033
+ - deprecate globalCommand; use BaseSheet.addCommand
2034
+ - remove vd.addCommand
2035
+ - deprecate theme(); use option() instead
2036
+ - deprecate global bindkey/unbindkey
2037
+ - move commands, bindkeys, `_options` globals to vd object
2038
+ - DisplayWrapper compares with its value
2039
+ - this allows sensible colorizers like `lambda s,c,r,v: v==3`
2040
+ - Sheet.addColorizer now apply to single sheet itself (fixes #433; thanks @frosencrantz for bug report)
2041
+ - add Sheet.removeColorizer (thanks @frosencrantz for feature request #434)
2042
+
2043
+ # v2.-2 (2019-12-03)
2044
+
2045
+ ## Major changes
2046
+ - [cmdlog] every sheet now has its own cmdlog
2047
+ - change `Shift+D` to `cmdlog-sheet`, with commands from source sheets recursively
2048
+ - `gShift+D` now `cmdlog-all`
2049
+ - `zShift+D` `cmdlog-sheet-only`
2050
+ - [dirsheet] VisiData's DirSheet is readonly; move write-mode for DirSheet to `vls` (see plugins)
2051
+ - [options] `options-global` bound to `gO`and `options-sheet` to `O`
2052
+ - `open-config` is now unbound (previously `gO`)
2053
+ - [defermods] has been moved to an opt-in plugin
2054
+ - [vdmenu] launching `vd` without a source file, opens menu of core sheets
2055
+ - press `Enter` to open sheet described in current row
2056
+
2057
+ ## Major Features
2058
+ - [IndexSheet] index into sub-sheets from command line (thanks @aborruso for suggestion #214)
2059
+ - currently works for html and hdf5 loaders
2060
+ - `+:subsheet:col:row` in cli
2061
+ - `subsheet` the topsheet upon load, with cursor located in cell at `row` and `col`
2062
+ - `+:subsheet::` to ignore row/col
2063
+ - can name toplevel source index if more than one: `+toplevel:subsheet::`
2064
+
2065
+ ## Additions and improvements
2066
+ - [add-rows] now undo-able
2067
+ - [aggregators] show-aggregate with quantiles (thanks @wesleyac for feature request #395)
2068
+ - [cli] `-P <longname>` on commandline executes command <longname> on startup
2069
+ - [cmdlog] jump commands are not logged
2070
+ - [config] set VisiData height/width via LINES/COLUMNS envvars (thanks @halloleo for suggestion #372)
2071
+ - [csv] add `csv_lineterminator` option (default: '\r\n') (thanks @dbandstra for bug report #387)
2072
+ - retain csv writer default DOS line endings
2073
+ - [describe] add `options.describe_aggrs` (thanks @unhammer for suggestion #273)
2074
+ - space-separated list of statistics to calculate for numeric columns
2075
+ - default to existing 'mean stdev'
2076
+ - add this to .visidatarc for e.g. a harmonic mean to be added automatically to the describe sheet:
2077
+ ```
2078
+ from statistics import harmonic_mean
2079
+ options.describe_aggrs += ' harmonic_mean' # note the leading space
2080
+ ```
2081
+ - [describe] add hidden "type" col (thanks aborruso for suggestion #356)
2082
+ - [dirsheet] add `open-dir-current` command to open the DirSheet for the current directory
2083
+ - [help] add `help-commands-all` on `gz^H` (thanks @frosencrantz for suggestion #393)
2084
+ - [help] add `help-search` command (thanks @paulklemm for suggestion #247)
2085
+ - opens a commands sheet filtered by the input regex.
2086
+ - [loaders] add --header and --skip universal handling to all sheets that inherit from `SequenceSheet` (currently tsv/csv/fixed/xlsx/xls)
2087
+ - [menu] if no arguments, open VisiData Main Menu instead of DirSheet
2088
+ - [plugins] update PluginsSheet to add sha256 and vdpluginsdeps
2089
+ - [plugins] PluginsSheet now loads plugins in `~/.visidata/plugins/__init__.py` instead of in `~/.visidatarc`
2090
+ - to use this feature, add `from plugins import *` to `~/.visidatarc`
2091
+ - [pyobj] for security reasons, `.py` loader moved out of VisiData core and into snippets
2092
+ - Note that the PyObj loader auto-imports `.py` modules upon loading them
2093
+ - [ttf] use `Enter` to plot instead of `.`
2094
+
2095
+ ## Plugins
2096
+ - add hello world minimal plugin
2097
+ - update viewtsv example (thanks @suhrig for --skip improvement suggestions #347)
2098
+ - add vmailcap with `^V` to view by mimetype (thanks @cwarden for suggestion)
2099
+ - add basic frictionless loader (thanks @aborruso for suggestion #237)
2100
+ - `-f frictionless` with .json either http[s] or local file
2101
+ - .zip may not work yet
2102
+ - add fdir filetype; opens a DirSheet for a .txt with a list of paths
2103
+ - move trackmod and defermod out of VisiData core and into module defermods.py
2104
+ - defermods defers saving to source until commit-sheet
2105
+ - deleted rows are colored red and visible until commit
2106
+ - trackmods tracks changes in source sheet until save-sheet
2107
+ - deletes are removed upon delete-row(s)
2108
+ - defermods and trackmods are not on by default, `import visidata.defermods` must be added to visidatarc
2109
+ - plugin/loader authors: by default, all sheets that inherit from BaseSheet have .defermods=False and .trackmods set to True when defermods is imported
2110
+ - create package `vsh`; add to it `vls`, `vping`, `vtop`
2111
+ - `vls` contains write-mode for DirSheet
2112
+ - add vmutagen for audio tags on DirSheet
2113
+ - `Alt+m` to add the mutagen columns on the DirSheet
2114
+ - add geocoding using nettoolkit.com API
2115
+ - add `addcol-geocode` command to add lat/long columns from location/address column
2116
+ - new commands in rownum plugin
2117
+ - `addcol-rownum` adds column with original row ordering
2118
+ - `addcol-delta` adds column with delta of current column
2119
+ - vtask is now a discrete plugin
2120
+
2121
+ ## Bugfixes
2122
+ - [bindkey] move global bindkey after BaseSheet bindkey (thanks @sfranky for bug report #379)
2123
+ - [cmdlog] now will check for `confirm-overwrite`
2124
+ - [dirsheet] commit/restat/filesize interactions (thanks @Mikee-3000 for bug report #340)
2125
+ - [dirsheet] pass filetype to openSource
2126
+ - if filetype is not passed, options.filetype would overload file ext
2127
+ - [expr] catch recursive expression columns (columns that calculate their cells using themselves) (thanks @chocolateboy for bug report #350)
2128
+ - [fixed] various improvements to fixed-width sheet loader (thanks @frosencrantz for thorough bughunting #331)
2129
+ - [http] use options.encoding when no encoding is provided by responses headers (thanks @tsibley for the PR #370)
2130
+ - [join] joining columns in the ColumnSheet resulted in exception (thanks @frosencrantz for bug report #336)
2131
+ - [load] fix replay sync bug (required wait previously)
2132
+ - however, look out for `vd *` with lots of big datasets, they will now all load simultaneously
2133
+ - [longname] fix getCommand() error reporting
2134
+ - [mbtiles] now works again
2135
+ - [metasheets] created VisiDataMetaSheet which sets system TsvSheet options
2136
+ - now changes in tsv options for source files will not affect HelpSheet, CmdLog or PluginsSheet
2137
+ - thanks frosencrantz for bug report #323
2138
+ - [options] no error on unset if option not already set
2139
+ - [path] filesize of url is 0
2140
+ - [path] fix piping bug (vd failed to read stdin) (thanks @ajkerrigan for bug report #354)
2141
+ - [plugins] ensure consistent Python exe for plugin installs (thanks @ajkerrigan for fix)
2142
+ - [plugins] make plugin removal more predictable (thanks @ajkerrigan for fix)
2143
+ - [prev-sheet] would stack trace if more than one sheet loaded and no other sheet visited (thanks @frosencrantz for bug report #342)
2144
+ - [regex] will not silently fail if some example rows are not matches
2145
+ - [save] convert savers to use itervalues
2146
+ - itervalues(format=False) now yields OrderedDict of col -> value
2147
+ - value is typed value if format=False, display string if True
2148
+ - options.safety_first will convert newlines and tabs to options.tsv_safe_newline and options.tsv_safe_tab (thanks @mesibov for bug report #76)
2149
+ - [sheets] colorizer exceptions are now caught
2150
+ - [sheets] keycols now keep order they are keyed
2151
+ - [sysedit] trim all trailing newlines from external edits (thanks @sfranky for bug report #378)
2152
+ - [tsv] column name "length" prevented loading (thanks @suhrig for bug report #344)
2153
+ - [undo] redo with cmd on first row did not move cursor (thanks @Mikee-3000 for bug report #339)
2154
+ - now row/col context are set as strings, even when they are numeric indices
2155
+
2156
+ ## Infrastructure / API
2157
+ - [add-row] create a default newRow for Sheet (thanks @for-coursera for bug report #363)
2158
+ - [calc] add INPROGRESS sentinel
2159
+ - sentinel that looks like an exception for calcs that have not completed yet
2160
+ - [extensible] add new cached_property, which caches until clear_all_caches, which clears all cached_property
2161
+ - [Fanout] add Fanout
2162
+ - fan out attribute changes to every element in a list; tracks undo for list
2163
+ - [lazy_property] newSheet and cmdlog are now lazy_property
2164
+ - this enables the overwriting and extending of them by plugins
2165
+ - [loaders] add sheet.iterload()
2166
+ - will use sheet.source to populate and then yield each row
2167
+ - [loaders] vd.filetype(ext, ExtSheet) to register a constructor
2168
+ - [loaders] add Sheet.iterrows() to yield row objects
2169
+ - grouping use iterrows() for streaming input
2170
+ - __iter__() yields LazyComputeRows
2171
+ ```
2172
+ for row in vd.openSource('foo.csv'):
2173
+ print(row.date, row.name)
2174
+ ```
2175
+ - [IndexSheet] refactor SheetsSheet parent to IndexSheet
2176
+ - HtmlTablesSheet now inherits from IndexSheet
2177
+ - excel index changed to standard IndexSheet model
2178
+ - VisiDataSheet changed into IndexSheet
2179
+ - move join-sheets to IndexSheet
2180
+ - [options] add unset() to unset options (thanks @khughitt for suggestion #343)
2181
+ - [path] consolidate PathFd, UrlPath, and HttpPath into Path
2182
+ - [SequenceSheet] refactor tsv, csv, xls(x), fixed_width to inherit from SequenceSheet
2183
+ - [sheets] vd.sheetsSheet is sheetstack, vd.allSheetsSheet is sheetpile
2184
+ - [sheets] rename LazyMap to LazyChainMap and LazyMapRow to LazyComputeRow
2185
+ - [shortcut] BaseSheet.shortcut now property
2186
+ - [status] make right status more configurable (thanks @layertwo #375 and khugitt #343 for filing issues)
2187
+ - BaseSheet.progressPct now returns string instead of int
2188
+ - BaseSheet.rightStatus() now returns string only (not color)
2189
+ - by default uses `options.disp_rstatus_fmt`, configured like `disp_status_fmt`
2190
+ - progress indicator (% and gerund) moved out of rightStatus and into drawRightStatus
2191
+ - [undo] use undofuncs to associate command with its undo
2192
+ - [undo/redo] moved to undo.py
2193
+ - [vd] add sheet properties for errors and statuses
2194
+ - [vd] vd.quit() now takes `*sheets`
2195
+ - [vd] rename main() to main_vd()
2196
+
2197
+ # v2.-1 (2019-08-18)
2198
+
2199
+ ## Major changes
2200
+
2201
+ - Minimum Python requirement bumped to 3.6
2202
+ - Several interface changes (see below)
2203
+
2204
+ ## Major features
2205
+
2206
+ - add Alt/Esc as prefix; Alt+# to go to that sheet
2207
+ - Alt+ layer not otherwise used; bind with `^[x` for Alt+X
2208
+ - undo/redo
2209
+ - [new command] `options.undo` (default: True) to enable infinite linear undo/redo
2210
+ - provisionally bound to `Shift+U` and `Shift+R`
2211
+ - will undo most recent modification on current sheet
2212
+ - `undoEditCells` assumes commands modified only selectedRows
2213
+ - multi-line rows
2214
+ - toggle by pressing `v` on any sheets with truncated values
2215
+ - range binning for numeric columns
2216
+ - `options.numeric_binning` (default: False) is the feature flag
2217
+ - [feature freqtbl] numeric binning for frequency/pivot table
2218
+ - `options.histogram_bins` to set number of bins (0 to choose a reasonable default)
2219
+ - (thanks @paulklemm for the issue #244)
2220
+ - stdout pipe/redirect
2221
+ - `ls|vd|lpr` to interactively select a list of filenames to send to the printer
2222
+ - `q`/`gq` to output nothing
2223
+ - `Ctrl+Q` to output current sheet (like at end of -b)
2224
+ - `vd -o-` to send directly to the terminal (not necessary if already redirected)
2225
+ - plugin framework
2226
+ - plugins are optional Python modules that extend or modify base VisiData's functionality
2227
+ - this release establishes a structure for creating plugins, and provides an interface within VisiData for installing them
2228
+ - `open-plugins` opens the **PluginsSheet**
2229
+ - to download and install a plugin, move the cursor to its row and press `a` (add)
2230
+ - to turn off a plugin, move the cursor to its row and press `d` (delete).
2231
+ - for more information see (https://visidata.org/docs/plugins)
2232
+ - deferred changes
2233
+ - modifications are now highlighted with yellow, until committed to with `^S` (`save-sheet`)
2234
+
2235
+ ## interface changes
2236
+
2237
+ - `setcol-*`, `dive-selected`, `dup-selected-*`, `columns-selected`, `describe-selected` use only selectedRows (do not use all rows if none selected) #265 (thanks @cwarden)
2238
+ - `edit-cells` renamed to `setcol-input`
2239
+ - `fill-nulls` renamed to `setcol-fill`
2240
+ - `paste-cells` renamed to `setcol-clipboard`
2241
+ - `dup-cell`/`dup-row` on SheetFreqTable and DescribeSheet renamed to `dive-cell`/`dive-row`
2242
+ - `next-page`/`prev-page` renamed to `go-pagedown`/`go-pageup`
2243
+ - `save-col` always saves all rows in current column (instead of selectedRows or rows)
2244
+ - `copy-*` use only selectedRows, warning if none selected (cmdlog safe)
2245
+ - `syscopy-*` use only selectedRows, fail if none selected (not cmdlog safe)
2246
+ - all `plot-selected` are now `plot-numerics`; `plot-numerics` uses all rows
2247
+ - Shift+S pushes `sheets-stack`; gS pushes `sheets-all`. removed graveyard sheet.
2248
+ - `random-rows` is no longer bound to any key by default (was Shift+R).
2249
+ - `freq-summary` was `freq-rows`; adds summary for selected rows
2250
+ - cmdlog is now based on longname instead of keystrokes
2251
+ - cmdlog does not log resize commands
2252
+ - exit with error code on error during replay (suggested by @cwarden #240)
2253
+ - split `Ctrl+V` (check-version) into `Ctrl+V` (show-version) and `z Ctrl+V` (require-version)
2254
+ - `show-expr` now unbound from `z=`
2255
+ - add `options.row_delimiter` (default to `\n`)
2256
+
2257
+
2258
+ ## plugins
2259
+
2260
+ - vfake: anonymizes columns
2261
+ - livesearch: filter rows as you search
2262
+ - rownum: add column of original row ordering
2263
+ - sparkline: add a sparkline column to visualise trends of numeric cells in a row (thanks @layertwo #297)
2264
+
2265
+ ## Bugfixes
2266
+
2267
+ - [addcol-new] addcol-new now works in batch mode (thanks @cwarden for the bug report #251)
2268
+ - [canvas] clipstr xname to prevent overlap with 1st element in xaxis
2269
+ - [color] column separator color applies to regular rows (thanks @mightymiff for bug report #321)
2270
+ - [DirSheet] delete-selected now deletes all of the selected files upon save-sheet (thanks @cwarden for the bug report #261)
2271
+ - [display] fix resizing issue with wide chars (thanks @polm for the bug report #279 and for the fix #284 )
2272
+ - [freqtbl] unselect-rows now updates source rows (thanks @cwarden for bug report #318)
2273
+ - [go-col-regex] nextColRegex sheet is implicit parameter
2274
+ - [help] use tab as sep for system sheets (thanks @frosencrantz for bug report #323)
2275
+ - [plot] graphing currency values now works
2276
+ - [pyobj] SheetDict nested editing (thanks @egwynn for the bug report #245)
2277
+ - [txt] TextSheets now save as .txt
2278
+ - [yaml] handle sources that do not load as lists (thanks @frosencrantz for bug report #327)
2279
+ - [vdtui] make Sheet sortable (related to an issue found by @jsvine #241)
2280
+
2281
+
2282
+ ## Additions and improvements
2283
+
2284
+ - [addcol-new] does not ask for column name
2285
+ - [aggr] add `list` aggregator (thanks @chocolateboy #263)
2286
+ - [canvas] add legend width to fit max key (thanks @nicwaller for request)
2287
+ - [chooseMany] error() on invalid choice #169
2288
+ - [command join] add join-sheets-top2 (`&`) / join-sheets-all (`g&`) to Sheet to join top 2/all sheets in sheets-stack
2289
+ - [command sort] `sort-*-add` bound to z[] and gz[] to add additional sort columns
2290
+ - [command syspaste-cells] add `syspaste-cells` to paste into vd from system clipboard (thanks kovasap for PR #258)
2291
+ - [describe] add `sum` (thanks @pigmonkey for suggestion #315)
2292
+ - [DirSheet] include folders and hidden files
2293
+ - [exec-longname] enable history
2294
+ - [freeze-sheet] only freeze visibleCols
2295
+ - [html] add links column where hrefs available (suggested by @am-zed #278)
2296
+ - [license] remove MIT license from vdtui; all code now licensed under GPL3
2297
+ - [loader fixed] provide a way to limit the max number of columns created (thanks @frosencrantz for suggestion #313)
2298
+ - added `options.fixed_maxcols` (default: no limit)
2299
+ - [loader fixed] loaders override putValue, not setValue (thanks @aborruso for bug report #298)
2300
+ - [loader jira] add support for jira filetype, a markdown derivative compatible with Atlassian JIRA (thanks @layertwo #301)
2301
+ - [loader Pyobj] `py` filetype to import and explore a python module: `vd -f py curses`
2302
+ - [loader pyxlsb] add .xlsb loader (suggested by @woutervdijke #246)
2303
+ - [loader ndjson ldjson] add as aliases for jsonl
2304
+ - [loader npy] add .npy loader, including type detection
2305
+ - [loader npz] add support for .npz index
2306
+ - [loader usv] add .usv loader
2307
+ - [macros] is now deprecated
2308
+ - [motd] domotd is asyncsingle and thus not sync-able
2309
+ - [mouse] bind Ctrl+scrollwheel to scroll-left/right; change to move cursor by `options.scroll_incr` (like scroll-up/down)
2310
+ - [mouse] slide columns/rows with left-click and drag
2311
+ - [openSource] create new blank sheet if file does not exist
2312
+ - [option json] add `options.json_sort_keys` (default True) to sort keys when saving to JSON (thanks @chocolateboy for PR #262)
2313
+ - [option regex+] `options.default_sample_size` (default 100) to set number of example rows for regex split/capture (now async). use None for all rows. (thanks @aborruso #219)
2314
+ - [option vd] `--config` option to specify visidatarc file (suggested by @jsvine #236)
2315
+ - [option vdtui] remove `curses_timeout` option (fix to 100ms)
2316
+ - [pandas] support multi-line column names (suggested by @jtrakk #223)
2317
+ - [pandas] implement sort() for pandas DataFrame (suggested by @migueldvb #257)
2318
+ - [pandas] use value_counts() for PandasSheetFreqTable (thanks @azjps for PR #267)
2319
+ - [pandas] selection support for PandasSheet (thanks @azjps for PR #267)
2320
+ - [pandas] reset index (thanks @danlat #277)
2321
+ - [pandas] if the df contains an index column, hide it
2322
+ - [pcap] adds saver for .pcap to json (thanks @layertwo for PR #272)
2323
+ - [perf] expr columns are now set to cache automatically
2324
+ - [perf] drawing performance improvements
2325
+ - [perf] minor improvements to cliptext
2326
+ - [perf] several minor optimisations to color
2327
+ - [precious] describe-sheet is now precious; error-sheet and threads-sheet are not
2328
+ - [replay] show comments as status (suggested by @cwarden)
2329
+ - [save] make all `save_` callers async
2330
+ - [sqlite] add save (CREATE/INSERT only; for wholesale saving, not updates)
2331
+ - [sqlite] `Ctrl+S` to commit add/edit/deletes
2332
+ - [sqlite] add support for .sqlite3 extension
2333
+ - [tar] add support for opening tar files (thanks @layertwo #302)
2334
+ - [vdmenu] `Shift+V` opens menu of core sheets
2335
+ - press `Enter` to open sheet described in current row
2336
+ - [win] several changes made for increased windows-compatibility (thanks @scholer!)
2337
+ - [yaml] bump min required version (thanks @frosencrantz for suggestion #326)
2338
+
2339
+
2340
+ ## API
2341
+ - VisiData, BaseSheet, Column inherit from Extensible base class
2342
+ - internal modules and plugins can be self-contained
2343
+ - `@X.property @X.lazy_property`, `X.init()`, `@X.api`
2344
+ - remove Sheet.vd; 'vd' attrs now available in execstr
2345
+ - remove hooks
2346
+ - add @deprecated(ver) decorator; put deprecations in deprecated.py
2347
+ - `vd.sync(*threads)` waits on specific threads (returned by calls to `@asyncthread` functions)
2348
+ - add Sheet.num for left status prompt
2349
+ - pivot and frequency table have been consolidated for numeric binning
2350
+ - add Sheet.nFooterRows property
2351
+ - Sheet.column() takes colname instead of regex; add Sheet.colsByName cached property
2352
+ - use addRow to rows.append in reload()
2353
+ - Selection API is overloadable for subclasses of Sheet whose rows don't have a stable id() (like pandas)
2354
+ - use locale.format_string and .currency
2355
+ - uses user default locale settings at startup
2356
+ - changes fmtstr back to %fmt (from {:fmt})
2357
+ - vdtui broken apart into separate modules: editline, textsheet, cliptext, color, column, sheet
2358
+ - much code reorganization throughout
2359
+ - convert all `vd()` to `vd`
2360
+ - remove ArrayColumns, NamedArrayColumns
2361
+ - urlcache now takes days=n
2362
+ - Sheet.rowid
2363
+ - add windowWidth and windowHeight
2364
+ - Sheets use their own .scr, in preparation for split-screen
2365
+ - add VisiData.finalInit() stage
2366
+ - call vd.finalInit() at end of module imports to initialise VisiData.init() members
2367
+ - so that e.g. cmdlog is not created until all internal sheet-specific options has been set
2368
+ - remove replayableOption() (now replay an argument within option())
2369
+ - CursesAttr is now ColorAttr; ColorAttr now a named tuple
2370
+ - variables that contain a ColorAttr have been renamed from attr to cattr for readability
2371
+ - improvements to scrolling API
2372
+ - rename most cases of Sheet*/Column* to *Sheet/*Column
2373
+ - use pathlib.Path in visidata.Path
2374
+ - remove BaseSheet.loaded; add BaseSheet.rows = UNLOADED
2375
+ - vd.push no longer returns sheet
2376
+ - add @asyncsingle for asyncthread singleton
2377
+
2378
+ ## Deps
2379
+ - add submodule fork of pyxlsb for VisiData integration
2380
+ - add amoffat/sh as submodule for vgit and vsh
2381
+ - [postgres] swap for binary version of dep
2382
+
2383
+
2384
+ # v1.5.2 (2019-01-12)
2385
+
2386
+ ## Bugfixes
2387
+ - [regex] fix `g*` #239 (thanks to @jsvine for bug hunting)
2388
+ - [editline] suspend during editline will resume in editline
2389
+ - [editline] `Ctrl+W` on an empty value in editline now works
2390
+
2391
+ ## Docs
2392
+ - [manpage] update the manpage to be more accurate for boolean command line options
2393
+
2394
+ # v1.5.1 (2018-12-17)
2395
+
2396
+ ## Bugfixes
2397
+ - [canvas] fix mouse right-click and cursor movement on canvas
2398
+ - [idle performance] fix regression
2399
+ - [columns] fix editing of "value" column on ColumnsSheet
2400
+ - [describe] fix colorizer inheritance
2401
+ - [csv] always create at least one column
2402
+ - [pandas] fix pandas eval (`=`, etc) #208 (thanks to @nickray for suggesting)
2403
+ - [pandas] preserve columns types from DataFrame #208 (thanks to @nickray for suggesting)
2404
+ - [pandas] remove data autodetect #208 (thanks to @nickray for suggesting)
2405
+
2406
+ ## Additions and changes
2407
+ - [selection] `options.bulk_select_clear` per #229 (thanks to @aborruso for suggesting)
2408
+ - [setcol-subst-all] add `gz*` to substitute over all visible cols (thanks to @aborruso for suggesting)
2409
+ - [options] Shift+O now global options (was sheet options); `zO` now sheet options; `gO` now opens .visidatarc which can be edited (was global options)
2410
+ - [sort] orderBy now asynchronous #207 (thanks to @apnewberry for suggesting)
2411
+ - [fill] fill now async; uses previous non-null regardless of selectedness #217 (thanks to @aborruso for suggesting)
2412
+ - [pandas] `options.pandas_filetype_*` passed to `pandas.read_<filetype>` (like `csv_*` to Python `csv` module) # 210 (thanks to @pigmonkey for suggesting)
2413
+ - [rename-col-selected] `z^` now renames the current column to contents of selected rows (previously `gz^`); `gz^` now renames all visible columns to contents of selected rows #220 (thanks to @aborruso for suggesting)
2414
+ - [vdtui null] show null display note in cells which match `options.null_value` (was only for None) # 213 (thanksto @aborruso for suggesting)
2415
+ - [vdtui] visidata.loadConfigFile("~/.visidatarc") for use in REPL #211 (thanks to @apnewberry for suggesting)
2416
+ - [progress] include thread name on right status during async
2417
+ - [progress] add gerund to display (instead of threadname)
2418
+ - [http] user specified filetype overrieds mime type
2419
+ - e.g. `vd https://url.com/data -f html`
2420
+ - [clipboard] use `options.save_filetype` for default format
2421
+
2422
+
2423
+
2424
+ # v1.5 (2018-11-02)
2425
+
2426
+ ## Bugfixes
2427
+ - [clipboard] fix broken `gzY` (syscopy-cells)
2428
+ - [cmdlog] always encode .vd files in utf-8, regardless of options.encoding
2429
+ - [tsv] major `save_tsv` performance improvement
2430
+ - [tsv] make short rows missing entries editable
2431
+ - [shp] reset columns on reload
2432
+ - [graph] shift rightmost x-axis label to be visible
2433
+ - [http] allow CLI urls to have `=` in them
2434
+ - [fixed width] truncate cell edits on fixed width sheets
2435
+ - [aggregators] ignore unknown aggregators
2436
+ - `visidata.view(obj)`: obj no longer required to have a `__name__`
2437
+
2438
+ ## Additions and changes
2439
+ - [save tsv json] errors are saved as `options.safe_error` (default `#ERR`)
2440
+ - if empty, error message is saved instead
2441
+ - [plugins] `~/.visidata` added to sys.path on startup
2442
+ - put plugin in `~/.visidata/vdfoo.py`
2443
+ - put `import vdfoo` in `.visidatarc` to activate
2444
+ - [aggregators] show-aggregate (`z+`) now aggregates selectedRows
2445
+ - [tsv] add unnamed columns if extra cells in rows
2446
+ - [diff] now based on display value (more intuitive)
2447
+ - [mouse] move to column also
2448
+ - [mouse] right-click to rename-col, rename-sheet, or edit-cell
2449
+ - [cosmetic] addcol-new (`za`) input new column name on top of new column
2450
+ - [cosmetic] include file iteration in progress meter
2451
+ - [xls xlsx] use options.header to determine column names
2452
+
2453
+ # v1.4 (2018-09-23)
2454
+
2455
+ ## Bugfixes
2456
+
2457
+ - batch mode with no script should use implicit stdin only if no other files given (Closed #182)
2458
+ - [pivot] pivot keycolumn copy was yielding strange nulls
2459
+ - [join] fix extend join
2460
+ - [csv] include first row in file even if `options.header` == 0
2461
+ - [sysclip] fix bug where `gzY` did not copy selected rows (Closed #186)
2462
+ - [motd] fix bug with disabling `options.motd_url` (Closed #190)
2463
+
2464
+ ## Additions and changes
2465
+
2466
+ - various improvements in performance and in CPU usage (Closed #184, #153)
2467
+ - [pyobj] `visidata.view(obj)` and `visidata.view_pandas(df)`
2468
+ - [pandas] `-f pandas` loads file with `pandas.read_<ext>`
2469
+ - [TextSheet] wrap made consistent with new options
2470
+ - [date] date minus date now gives float number of days instead of seconds
2471
+ - [pcap] add support for reading pcapng (thanks @layertwo!)
2472
+ - [setcol] limit `gz=` range parameters to the number of rows selected to be filled (thanks @ssiegel!)
2473
+ - [anytype] format anytype with simple str()
2474
+
2475
+ # v1.3.1 (2018-08-19)
2476
+
2477
+ - [http] add `tab-seperated-values` to content_filetypes mapping
2478
+ - [join] add `extend` join type to use keep all rows and retain **SheetType** from first selected sheet
2479
+ - `rename-sheet` renames current sheet to input
2480
+ - [json] add options.json_indent for pretty-printing
2481
+ - [tsv json txt] add options.save_errors (default True) to include errors when saving
2482
+ - remove all options.foo_is_null and fix according to 178-nulls.md
2483
+ - add `z^C` and `gz^C` to cancel threads in current/selected row(s)
2484
+ - [bugfix] `^R` (reload) on a filtered sheet (`"`) now reloads only the filtered rows
2485
+ - [aggregators] fix summation with exceptions
2486
+ - [DirSheet] add `gz^R` (reload-rows) to undo modifications on selected rows
2487
+
2488
+ # v1.3 (2018-08-11)
2489
+
2490
+ - commands overhaul; see `commands.tsv` (command longnames should now be largely stable)
2491
+ - add quantile aggregators (q3/q4/q5/q10)
2492
+ - add `z;` to add new column from bash *expr*, with `$`columnNames as variables
2493
+ - keyboard layout (thanks to @deinspanjer for the inspiration)
2494
+ - `O` launches sheet-specific options (see design/169.md); `gO` launches global OptionsSheet
2495
+ - options.wrap now defaults to False
2496
+ - options.quitguard enables confirmation before quitting last sheet
2497
+ - options.safety_first makes loading/saving more robust, at the cost of performance
2498
+ - currently only removing NULs from csv input
2499
+ - dedup, sort, color status messages by "priority" (thanks to @jsvine for suggestion)
2500
+ - remove menu system
2501
+ - can now edit source values from FreqSheet
2502
+
2503
+ - Command changes
2504
+ - `^H` is now main command to open the manpage! `z^H` opens a list of all commands for this sheet.
2505
+ - `R` (`random-sheet`) pushes sheet instead of selecting (reverting to former behavior)
2506
+ - `za` (`addcol-empty`) asks for column name
2507
+ - `zd` (`delete-cell`) moves value to clipboard ("cut", like other delete commands)
2508
+ - add `gI` (`describe-all`) like `gC` (`columns-all`)
2509
+ - add `gS` (`sheets-graveyard`)
2510
+ - add `g(`, `z(`, `gz(` variants of `(` 'expand-column'
2511
+ - add `z|` and `z\` to un/select by python expr (thanks to @jsvine for suggestion)
2512
+ - add `z#` to set type of current column to `len`
2513
+ - add `z;` to get the stdout/stderr from running a cmdline program with $colname args
2514
+ - `Space` is now bound to exec-longname (was `menu`; `^A` was exec-longname previously)
2515
+
2516
+ - Loaders:
2517
+ - add pandas adapter
2518
+ - add xml loader
2519
+ - add pcap loader (thanks to @vbrown608 and @TemperedNetworks)
2520
+ - add yaml loader (thanks to @robcarrington, @JKiely, @anjakefala at PyCon Sprints for making this happen)
2521
+ - add jsonl saver
2522
+ - remove `tsv_safe_char` and split into `tsv_safe_newline` and `tsv_safe_tab`
2523
+
2524
+ - initial commit of a task warrior app (vtask)
2525
+
2526
+ ## minor changes
2527
+ - more portable system clipboard handling (thanks @chocolateboy for PR)
2528
+ - [json] no more incremental display during loading (need better json parser than stdlib)
2529
+ - `date` supports adding a number of days (or `6*hours`, `9*months`, etc)
2530
+ - hidden columns are darkened on columns sheet
2531
+ - exception rollup
2532
+ - dev/commands.tsv table of commands
2533
+ - motd default url uses https
2534
+ - improve ProfileSheet
2535
+ - [DirSheet] editable `mode` (set to octal like `0o0644`)
2536
+
2537
+ # v1.2.1 (2018-07-05)
2538
+
2539
+ - python 3.7
2540
+ - Change `async` decorator to `asyncthread` and rename `async.py` to avoid using Python 3.7 keyword
2541
+
2542
+ # v1.2 (2018-04-30)
2543
+
2544
+ - macro system
2545
+ - `gD` goes to directory browser of `options.visidata_dir` (default to `~/.visidata/`) which contains saved commandlogs and macros
2546
+ - `z^S` on CommandLog saves selected rows to macro for given keystroke, saving to `.visidata/macro/command-longname.vd`
2547
+ - macro list saved at `.visidata/macros.vd` (keystroke, filename)
2548
+ - `options.cmdlog_histfile` for auto-appended (default: empty means disabled)
2549
+ - [DirSheet] edits make deferred changes to any field
2550
+ - add `directory` and `filetype` columns
2551
+ - note: only 256 changes maintained per column (same as column cache size)
2552
+ - `^S` saves all deferred changes
2553
+ - `z^S` saves changes for the current file only
2554
+ - `^R` clears all changes (reload)
2555
+ - `z^R` clears changes on the current file only
2556
+ - `d`/`gd` marks the current/selected file for deletion
2557
+ - if `directory` is edited, on `^S` (save) file is moved (if directory not existing, a new directory is created)
2558
+ - [New conda package](https://github.com/conda-forge/visidata-feedstock)
2559
+ - add .visidatarc [snippets](https://github.com/saulpw/visidata/tree/stable/snippets) with examples of extra functionality
2560
+ - add replayable options [#97](https://github.com/saulpw/visidata/issues/97)
2561
+ - `g^S` for multisave to single file (`.html`, `.md` and `.txt` are currently supported) or directory
2562
+ - `z^S` to save selected rows of current column only (along with key columns)
2563
+ - `T` to transpose rows and columns [#129](https://github.com/saulpw/visidata/issues/129)
2564
+ - `^A` to specify a command longname to execute
2565
+ - `^O`/`g^O` to open current/selected files in external editor
2566
+ - `g^R` on SheetsSheet to reload all [selected] sheets
2567
+ - `options.error_is_null` to treat errors as nulls when applicable
2568
+ - `g,` fixed to compare by visible column values, not by row objects
2569
+ - `gv` to unhide all columns
2570
+ - `gM` open melted sheet (unpivot) with key columns retained and *regex* capture groups determining how the non-key columns will be reduced to Variable-Value rows
2571
+ - `g*` replace selected row cells in current column with regex transform
2572
+ - Shift-Up/Down aliases for mac [#135](https://github.com/saulpw/visidata/issues/135)
2573
+ - options.wrap now true by default on TextSheet (`v` to toggle)
2574
+ - `save_txt` with single column concatenates all values to single file
2575
+ - `+` can add multiple aggregators
2576
+ - ^X bugfix: use evalexpr over cursorRow
2577
+ - `z`/`gz` `s`/`t`/`u` to select to/from cursorRow
2578
+ - `z<` and `z>` to move up/down to next null cell
2579
+ - `"` no longer reselects all rows
2580
+ - `sheet-set-diff` command to act like `--diff`
2581
+ - math functions (like sin/cos) now at toplevel
2582
+ - bugfix: freeze
2583
+ - all `csv_` options sent to csv.reader/writer
2584
+ - `options.tsv_safe_char` to replace \t and \n in tsv files; set to empty for speedup during tsv save
2585
+ - loaders and savers
2586
+ - support bz2 and xz (LZMA) compression (thanks @jpgrayson)
2587
+ - add loaders for:
2588
+ - sas7bda (SAS; requires `sas7bdat`)
2589
+ - xpt (SAS; requires `xport`)
2590
+ - sav (SPSS; requires `savReaderWriter`)
2591
+ - dta (Stata; requires `pandas`)
2592
+ - .shp can save as .geojson
2593
+ - add htm as alias for html filetype
2594
+ - json bugfix: fix [#133](https://github.com/saulpw/visidata/issues/133) json loader column deduction
2595
+ - [experimental] bin/vsh initial commit
2596
+
2597
+ # v1.1 (2018-03-05)
2598
+
2599
+ - VisiData will be included in the [next debian repository release](https://tracker.debian.org/pkg/visidata)!
2600
+ - remove all install dependencies
2601
+ - additional libraries must be installed manually for certain loaders; see requirements.txt
2602
+ - experimental hierarchical menu system with SPACE to explore commands
2603
+ - use standard movement keys (`hjkl`/`arrows`) to navigate within a command level
2604
+ - Use `Enter`/`q` to navigate down/up a command tree
2605
+ - abort with `gq` or `^C`
2606
+ - existing chooseOne selections (aggregators/joins) still use simple input() for now
2607
+ - most longnames changed
2608
+ - let me know if anyone is using any longnames at all, and we will stabilize the names
2609
+ - if you do end up playing with it, please let me know what did and didn't work for you
2610
+ - randomized message/announcement/tip on startup; disable with `options.motd_url = None`
2611
+ - cache messages in `$HOME/.visidata/`
2612
+
2613
+ Command additions/changes:
2614
+
2615
+ - add `za` and `gza` to add 1/N new blanks column
2616
+ - add `(` and `)` commands to expand/collapse list/dict columns (e.g. in nested json)
2617
+ - add `Backspace` command to drop sheet like `q` and also scrub its history from the cmdlog
2618
+ - [canvas] add `d` and `gd` to delete points from source sheet
2619
+ - remove `!@#$%-_` special actions on columns sheet
2620
+ - alias Shift+Arrows to `HJKL` (may not work in all environments)
2621
+ - alias `ENTER` to modify-edit-cell by default
2622
+ - add `Y`/`gY`/`zY` to copy row/selected/cell to system clipboard (with options.clipboard_copy_cmd)
2623
+
2624
+ - filename `-` works to specify stdin/stdout (`-b -o -` will dump final sheet to stdout)
2625
+ - search/select uses most recent when not given any (as in vim/etc)
2626
+ - annotate None with disp_note_none ('∅'); previously was not visually distinguishable from empty string
2627
+
2628
+ - save to .md org-mode compatible table format
2629
+ - load/view/edit/save png, edit pixels in data form
2630
+ - load/view ttf/otf font files
2631
+ - [canvas] draw quadratic curves with qcurve([(x,y)...])
2632
+ - improvements/bugfixes: pivot, describe, melt, sqlite, shp, html
2633
+
2634
+ # v1.0 (2018-01-24)
2635
+
2636
+ - date.__sub__ returns timedelta object (was int days)
2637
+ - pivot table bugfixes
2638
+ - many cosmetic fixes
2639
+ - disable default profiling for perf improvements
2640
+ - remove .visidatarc support in PWD or XDG; only $HOME/.visidatarc supported now
2641
+ - website and docs complete overhaul
2642
+ - do not execute .py files
2643
+ - apt/brew packages submitted
2644
+
2645
+ # v0.99 (2017-12-22)
2646
+
2647
+ - tab completion for filename and python expr
2648
+ - `v` now 'visibility toggle' (moved from `w`)
2649
+ - `^W` to erase a word in the line editor
2650
+ - `gC`
2651
+ - `--version` (thanks to @jsvine)
2652
+ - `options.use_default_colors` (thanks to @wavexx)
2653
+ - `median` aggregator
2654
+ - .html loads tables (requires lxml)
2655
+ - simple http works (requires requests)
2656
+ - json save
2657
+ - json incremental load
2658
+ - [cmdlog] use rowkey if available instead of row number; options.rowkey_prefix
2659
+ - [cmdlog] only set row/col when relevant
2660
+ - [vdtui] task renamed to thread
2661
+ - /howto/dev/loader
2662
+ - /design/graphics
2663
+
2664
+ # v0.98.1 (2017-12-04)
2665
+
2666
+ - [packaging]
2667
+ - make non Python standard library loader dependencies optional
2668
+ - provide method for full installation via `pip3 install "visidata[full]"`
2669
+ - [visidata.org](http://visidata.org) change copyright in footer
2670
+ - [docs] add csv dialects to manpage (closes issue #88)
2671
+ - [bugfix]
2672
+ - fix for `^Z` in builtin line editor
2673
+ - fixed-width loader needs source kwarg
2674
+
2675
+ # v0.98 (2017-11-23)
2676
+
2677
+ - [visidata.org](http://visidata.org) revamp
2678
+
2679
+ - [canvas] graphs and maps!
2680
+ - `.` or `g.` to push a graph or a map from the current sheet (dot=plot)
2681
+ - supports .shp and vector .mbtiles
2682
+ - mouse left-click/drag to set cursor
2683
+ - mouse right-click/drag to scroll canvas
2684
+ - scrollwheel to zoom in/out on a canvas
2685
+ - `s`/`u` to select/unselect rows at canvas cursor
2686
+ - `ENTER` to push source sheet with only rows at canvas cursor
2687
+ - 1-9 to toggle display of 'layers' (colors)
2688
+ - `_` to zoom out to full width
2689
+ - `disp_pixel_random` option chooses pixel attrs at random (weighted), instead of most common
2690
+ - `+`/`-` to zoom in/out via keyboard
2691
+
2692
+ - Updates to commands
2693
+ - Remove ` (backtick) command
2694
+ - Remove most zscroll commands (`zs`/`ze`)
2695
+ - `zz` moves cursor to center, uncertain about the future of `zt` due to conflict with `t` for toggle
2696
+ - `ga` adds N new rows
2697
+ - `gz=` sets value for selected/all rows to a Python sequence in this column
2698
+ - `z_` sets column width to given value
2699
+ - `z-` cuts column width in half
2700
+ - `P` is now "paste before" (like vim); `R` now pushes a random sample
2701
+ - `^Z` now sends SIGSTOP; `^O` "opens" the external $EDITOR (from builtin line editor)
2702
+ - [ColumnsSheet] Added `~!@#$` commands back, to set type of source columns
2703
+ - `w` is becoming a more universal "visibility toggle"
2704
+ - [TextSheet] `w` toggles wordwrap
2705
+ - [canvas] `w` toggles display of the labels
2706
+ - [pyobj] `w` toggles hidden properties and methods
2707
+
2708
+ - Updates to command line args and options
2709
+ - set initial row/col with `+<row#>:<col#>` (numeric only)
2710
+ - `--delimiter`/`-d ` option (separate from `--csv-delimiter`) sets delimiter for tsv filetype
2711
+ - `--replay-wait`/`-w` renamed from `--delay`/`-d`
2712
+ - `disp_date_fmt` option for date display format string (default is date-only)
2713
+ - `zero_is_null`/`empty_is_null`/`none_is_null`/`false_is_null` set which values are considered null (previously was `aggr_null_filter`)
2714
+ - `--skiplines` option renamed to `--skip`, and `--headerlines` to `--header`
2715
+
2716
+ - Design improvements
2717
+ - Add specific rowtype for each sheet (see right status)
2718
+ - dates are a kind of numeric type (useful for graphing as the x-axis)
2719
+ - `use_default_colors` (at behest of @wavexx)
2720
+ - more robust Progress indicator
2721
+ - populate DescribeSheet in async thread
2722
+ - remove default names for unnamed columns
2723
+ - history up/down in edit widget now feels right
2724
+
2725
+ - API changes
2726
+ - change main Column API to getter(col, row) and setter(col, row, val)
2727
+ - move Path and subclasses out of vdtui
2728
+ - TextSheet source is any iterable of strings
2729
+ - Sheet.filetype provides default save filename extension
2730
+
2731
+
2732
+ ## 0.97.1 (2017-10-29)
2733
+ - Fix postgres lazy import
2734
+ - BugFix: issue #83 - `z?` works on OSX
2735
+ - BugFix: <Enter> on SheetsSheets itself now does nothing
2736
+ - Move from readthedocs to visidata.org
2737
+
2738
+
2739
+ ## 0.97 (2017-10-05)
2740
+ - Features
2741
+ - [replay]
2742
+ - move vdplay into vd --play
2743
+ - -p --play now replays scripts live
2744
+ - --delay interspaces replay by delay seconds
2745
+ - --batch to replay without interface
2746
+ - --output to save at end of replay
2747
+ - --replay-movement=True has --play move the cursor cell-by-cell
2748
+ - -y --confirm-overwrite=False
2749
+ - replay scripts can be strformatted with field=value
2750
+ - add ^U command to pause/resume playback
2751
+ - add ^K to cancel replay
2752
+ - add Space command to go to next step of replay while paused
2753
+ - [global]
2754
+ - remap toggle to 't' (was Space)
2755
+ - remap ^Y to push sheet of cursorRow
2756
+ - 'A' creates new sheet with N empty columns
2757
+ - remap 'r' to regex search of row key
2758
+ - add zr/zc to go to row/col number
2759
+ - F1/z? now launches man page
2760
+ - gF1/gz? now launches commands sheet
2761
+ - add `f` command to fill empty cells with the content of a non-empty cell up the current column
2762
+ - add Del/gDel to set value(s) to None
2763
+ - remove TAB/Shift-TAB sheet cycling
2764
+ - add z^ command to set current column name to current cell value
2765
+ - add gz^ to set current column name to cell values in selected rows
2766
+ - add 'z=' to show computed expression over current row
2767
+ - z' adds cache to current column (gz' for all columns)
2768
+ - `gh` moves cursor to leftmost column (instead of leftmost non-key column)
2769
+ - [aggregators]
2770
+ - allow multiple aggregators
2771
+ - 'g+ adds an aggregator to selected columns on columns sheets
2772
+ - sets the exact set of aggregators on the column sheet with 'e'/'ge'
2773
+ - 'z+' displays result of aggregation over selected rows for current column on status
2774
+ - rework aggregators so multiple aggregators can be set
2775
+ - [sheets sheet]
2776
+ - '&' on Sheets sheet is now sole join sheet command; jointype is input directly
2777
+ - add sheet concat
2778
+ - [columns sheet]
2779
+ - remap ~!@#$%^ on Columns sheet to behave like they do on other sheets
2780
+ - add g prefix to ~!@#$%^ to operate on all 'selected rows' on Columns sheet (thus modifying column parameters on source sheet)
2781
+ - [textsheet]
2782
+ - add 'w' command on TextSheets to toggle wrap
2783
+ - [cmdlog]
2784
+ - editlog renamed to cmdlog
2785
+ - cmdlog has a new format which minimises recordings of movement commands
2786
+ - '^D' now saves cmdlog sheet
2787
+ - [pivot]
2788
+ - zEnter pushes this cell; Enter pushes whole row
2789
+ - [describe]
2790
+ - add DescribeSheet with 'I' command for viewing descriptive statistics
2791
+ - add zs/zu/zt/zEnter commands to engage with rows on source sheet which are being described in current cell of describe sheet
2792
+ - [frequency]
2793
+ - 'zF' provides summary aggregation
2794
+ - [metasheets]
2795
+ - add hidden source column to metasheets
2796
+ - ^P view status history
2797
+ - [loaders]
2798
+ - add 'postgres' schema for simple loader from postgres:// url
2799
+ - add gEnter for .zip file mass open
2800
+ - add 'fixed' filetype to use fixed column detector
2801
+ - [clipboard]
2802
+ - remove `B` clipboard sheet
2803
+ - rework all d/y/p commands for only one buffer
2804
+ - remove g^Z and gp
2805
+ - [options]
2806
+ - remove -d debug option
2807
+ - add --diff to add colorizer against base sheet
2808
+ - diffs a pair of tsvs cell-by-cell
2809
+ - theme options removed as CLI arguments (still available for .visidatarc or apps)
2810
+ - `'` appends frozen column
2811
+ - rename and reorder options
2812
+ - Community
2813
+ - [docs]
2814
+ - replace .rst userguide with VisiData [man page](http://visidata.org/man)
2815
+ - [visidata.org]
2816
+ - update index.html
2817
+ - automate creation of tour pages from tours.vd
2818
+ - tours will be played and recorded using asciinema
2819
+ - then compiled into a .html with mkdemo.py for http://visidata.org/tour
2820
+ - upload html version of manpage
2821
+ - Internals
2822
+ - renamed toplevel command() to globalCommand(); removed Sheet.command(); sheet commands now specified in Sheet.commands list of Command() objects at class level
2823
+ - setter API now (sheet,col,row,value)
2824
+ - move `visidata/addons/*.py` into toplevel package
2825
+
2826
+ ## 0.96 (2017-08-21)
2827
+ - data can be piped through stdin
2828
+ - remap: `N` is now previous match (instead of `p`)
2829
+ - `:` now regex split
2830
+ - add `bin/viewtsv` example tsv viewer as an example of a small vdtui application
2831
+ - add `options.cmd_after_edit` for automove after edit
2832
+ - add clipboard functionality
2833
+ - `y` yanks row at cursor to clipboard; `gy` copies all selected rows
2834
+ - `d` deletes row and move to clipboard; `gd` moves all selected rows
2835
+ - `p` now pastes the row most recently added to the clipboard after current row; `gp` pastes all rows from clipboard after current row
2836
+ - `Shift-B` opens clipboard sheet
2837
+ - `Ctrl+z` now undoes the most recent delete; `gCtrl+z` undoes all deletes
2838
+ - Fix cursor row highlighting of identical rows
2839
+
2840
+ ## v0.95.2
2841
+ - move some functionality out of vdtui into separate python files
2842
+ - add Ctrl+z command to launch external $EDITOR
2843
+ - add ``options.force_valid_names``
2844
+
2845
+ ## v0.94 (2017-08-02)
2846
+ - add options.textwrap for TextSheet
2847
+ - add vd.remove(sheet)
2848
+ - Sheet.sources now modifiable
2849
+
2850
+ ## v0.93 (2017-07-30)
2851
+ - fix display/feel bugs in editText
2852
+ - remove BACKSPACE for editlog undo
2853
+ - fix colorizer API
2854
+ - add `ctrl-u` command to toggle profiling of main thread
2855
+ - fix `C`olumn statistics (`options.col_stats` still disabled by default)
2856
+
2857
+ ## v0.92 (2017-07-11)
2858
+ - `F`requency sheet groups numeric data into intervals
2859
+ - added `histogram_bins` and `histogram_even_interval` options
2860
+ - added `w` command on the sheet that toggles `histogram_even_interval`
2861
+ - change key for 'eval Python expression as new pyobj sheet' from Ctrl+O to Ctrl+X
2862
+
2863
+ ## v0.91 (2017-06-28)
2864
+ - make options automatically typed based on default
2865
+ - documentation cleanups
2866
+ - remove R command (set filetype on CLI)
2867
+
2868
+ ## v0.80
2869
+ - tour of screenshot.gif
2870
+ - regex transform now `*` (';' is still regex split)
2871
+ - Make regex search/select to work more like vim
2872
+ - Move several non-essential commands out of vd.py
2873
+ - change license of vd.py to MIT
2874
+ - vdtutor start
2875
+ - currency type with `$`; str type moved to `~`; remove type autodetect
2876
+ - www/ for landing page
2877
+ - move from .md to .rst for documentation
2878
+
2879
+ ## v0.61 (2017-06-12)
2880
+ - colorizers
2881
+ - `g[` and `g]` to sort by all key columns
2882
+ - `;` and `.` experimental regex commands
2883
+
2884
+ ## v0.59 (2017-05-31)
2885
+ - pivot sheets with `W`
2886
+ - undo with `BACKSPACE` and replay with `ga`
2887
+ - dev guide and user guide
2888
+ - `ge` mass edit
2889
+ - freeze with `g'`
2890
+
2891
+ ## v0.44
2892
+ - creating sustainable dev process at RC
2893
+ - `z` scrolling prefix
2894
+
2895
+ ## v0.42
2896
+ - async select/unselect
2897
+ - aggregator functions on columns
2898
+ - .xls
2899
+
2900
+ ## v0.41 (2017-01-18)
2901
+ - asynchronous commands (each in its own thread) with
2902
+ - `^T` sheet of long-running commands
2903
+ - `^C` cancel
2904
+ - `ENTER` to see the final performance profile
2905
+ - `P` random population of current sheet
2906
+ - headerlines default now 1
2907
+
2908
+ ## v0.40
2909
+ - options settable with command-line arguments (`--encoding=cp437`)
2910
+ - input() histories with UP/DOWN (and viewable with `I`)
2911
+ - unicode input now works
2912
+ - editText clears value on first typing
2913
+ - `"` duplicates sheet with only selected rows; `g"` duplicates entire sheet verbatim
2914
+
2915
+ ## v0.38
2916
+ - sortable date
2917
+ - open_zip comes back
2918
+
2919
+ ## v0.37
2920
+ - `g~` (autodetect all columns)
2921
+ - `"` copies row to immediately following
2922
+ - nulls, uniques on columns sheet
2923
+
2924
+ ## v0.36
2925
+ - right column
2926
+ - regex subst
2927
+ - unreverse [/] sort keys ([ = ascending)
2928
+
2929
+ ## v0.35 (2016-12-04)
2930
+ - reverse [/] sort keys
2931
+ - goto `r`ow by number or `c`olumn by name
2932
+
2933
+ ## v0.33
2934
+ - type detection with `~`
2935
+ - date type
2936
+ - fix outer join
2937
+
2938
+ ## v0.32
2939
+ - expose col.type in column header
2940
+ - push value conversion to time of usage/display
2941
+
2942
+ ## v0.31
2943
+ - F1 help sheet
2944
+ - ^O directly exposes eval result as sheet
2945
+ - custom editText with initial value, ESC that raises VEscape, and readline edit keys
2946
+
2947
+ ## v0.30 (2016-11-27)
2948
+ - make all sheets subclasses of VSheet
2949
+ - remove .zip opening and url fetching
2950
+ - added options ColumnStats and csv_header
2951
+
2952
+ ## v0.29
2953
+ - pin key columns to left
2954
+ - join sheets on exact key match
2955
+ - -r/--readonly mode
2956
+
2957
+ ## v0.28 (2016-11-22)
2958
+ - inputs: .csv, .tsv, .json, .hdf5, .xlsx, .zip
2959
+ - outputs: .csv, .tsv
2960
+ - hjkl cursor movement, t/m/b scroll to position screen cursor
2961
+ - skip up/down columns by value
2962
+ - row/column reordering and deleting
2963
+ - resize column to fix max width of onscreen row
2964
+ - filter/search by regex in column
2965
+ - sort asc/desc by one column
2966
+ - `g`lobal prefix supersizes many commands
2967
+ - `e`dit cell contents
2968
+ - convert column to int/str/float
2969
+ - reload sheet with different format options
2970
+ - add new column by Python expression
2971
+ - `s`elect/`u`nselect rows, bulk delete with `gd`
2972
+ - `F`requency table for current column with histogram
2973
+ - `S`heets metasheet to manage/navigate multiple sheets,
2974
+ - `C`olumns metasheet
2975
+ - `O`ptions sheet to change the style or behavior
2976
+ - `E`rror metasheet
2977
+ - `g^P` status history sheet
2978
+
2979
+ ## v0.14 (2016-11-13)