cat / 012
clone

a spreadsheet for the terminal: lotus 1-2-3 looks, google sheets keys and formulas, one go binary

Docs: links for the new tree

Dami committed 6cea749
Every relative link in the docs, README.md, ROADMAP.md and CLAUDE.md
points at the page and heading its target moved to.
commit
6cea7499f72116a27c5df786558f65d8ff1788cd
parent
6fc38a05ef8d87209a7262a06f420b44d5b2d91d
author
Dami <dami.etoile@gmail.com>
34 files changed, +170 -170
MCLAUDE.md4+-
MREADME.md20+++++-----
MROADMAP.md60+++++++++++++++---------------
Mdocs/README.md16++++----
Mdocs/contributing/README.md16++++----
Mdocs/contributing/architecture.md12+++---
Mdocs/contributing/extending.md4+-
Mdocs/contributing/observability.md2+-
Mdocs/contributing/testing.md12+++---
Mdocs/contributing/ux.md4+-
Mdocs/files/README.md14++++----
Mdocs/files/excel.md6++--
Mdocs/files/format.md12+++---
Mdocs/files/saving.md4+-
Mdocs/formulas/README.md12+++---
Mdocs/formulas/decimal.md2+-
Mdocs/formulas/jev.md2+-
Mdocs/formulas/references.md4+-
Mdocs/getting-started/README.md10+++---
Mdocs/getting-started/install.md10+++---
Mdocs/reference/README.md8++--
Mdocs/reference/config.md4+-
Mdocs/reference/keys.md30++++++++--------
Mdocs/reference/macro-api.md4+-
Mdocs/sheets/README.md22++++++------
Mdocs/sheets/editing.md2+-
Mdocs/sheets/formatting.md10+++---
Mdocs/sheets/macros.md6++--
Mdocs/sheets/pivots.md2+-
Mdocs/sheets/rules.md6++--
Mdocs/sheets/sheets-and-tabs.md2+-
Mdocs/terminal/README.md4+-
Mdocs/terminal/ssh.md8++--
Mdocs/terminal/themes.md6++--
M CLAUDE.md +2 -2
M README.md +10 -10
@@ -31,28 +31,28 @@ searches every command. `012 config edit` opens the settings file.
3131 3232 ## A short tour3333 34-- **Formulas as in Sheets**, with [Sheets' functions](docs/functions.md),34+- **Formulas as in Sheets**, with [Sheets' functions](docs/reference/functions.md),3535 suggestions and argument hints, pointing at cells with the arrows or the3636 mouse, named ranges, references between sheets, optional decimal3737 arithmetic for money, and undo for everything38- ([formulas](docs/formulas.md)).38+ ([formulas](docs/formulas/README.md)).3939 - **Data tools**: freeze, sort, filter, find and replace, conditional4040 formatting, dropdowns and checkboxes, notes, protected ranges, and live41- pivot tables ([working with data](docs/data.md)).41+ pivot tables ([working with data](docs/sheets/README.md)).4242 - **Charts** that float over the grid and follow their data, drawn as real4343 images in kitty, Ghostty and WezTerm and as text elsewhere44- ([charts](docs/charts.md)).44+ ([charts](docs/sheets/charts.md)).4545 - **Files**: a diff-friendly JSON format, import from CSV, TSV, XLSX,4646 SQLite, Parquet and Lotus 1-2-3, export to CSV, TSV, XLSX and SQLite47- ([files](docs/files.md)).47+ ([files](docs/files/README.md)).4848 - **Macros**, recorded or written as Starlark scripts saved with the sheet49- ([macros](docs/macros.md)).49+ ([macros](docs/sheets/macros.md)).5050 - **Made for terminals**: the mouse, hyperlinks, the system clipboard over5151 SSH, your terminal's colors or any of hundreds of schemes, optional vim5252 keys, and `012 serve` to reach your sheets over SSH53- ([keys](docs/keys.md), [themes](docs/themes.md), [SSH](docs/ssh.md)).53+ ([keys](docs/reference/keys.md), [themes](docs/terminal/themes.md), [SSH](docs/terminal/ssh.md)).5454 - **JEV functions** ask TypeSafe's hosted model about your data from a55- formula ([JEV](docs/jev.md)).55+ formula ([JEV](docs/formulas/jev.md)).5656 5757 | | |5858 |---|---|
@@ -68,7 +68,7 @@ searches every command. `012 config edit` opens the settings file.
6868 The recordings are [VHS](https://github.com/charmbracelet/vhs) tapes in6969 [`demos/`](demos), rendered by `make demos` in the Catppuccin Mocha7070 palette; 012 draws in your terminal's own colors by default71-([themes](docs/themes.md)). Charts show as text here.71+([themes](docs/terminal/themes.md)). Charts show as text here.7272 7373 ## More7474
@@ -76,7 +76,7 @@ palette; 012 draws in your terminal's own colors by default
7676 working on it7777 - [Roadmap](ROADMAP.md)7878 - Working on 012: `make build`, then `make check` before a push; see79- [testing](docs/testing.md) and [CLAUDE.md](CLAUDE.md)79+ [testing](docs/contributing/testing.md) and [CLAUDE.md](CLAUDE.md)8080 8181 Young and moving quickly. The file format is versioned and older files8282 keep loading; the Go packages are internal and may change at any time.
M ROADMAP.md +30 -30
@@ -4,7 +4,7 @@ Principles: inside the grid 012 behaves like Google Sheets; 1-2-3 is the
44 visual identity around it. The main binary stays pure Go55 (`CGO_ENABLED=0`), and every feature ships with unit tests, a libghostty66 e2e test and reviewed golden screens. Visual and UX quality keep pace7-with features: see [docs/UX.md](docs/UX.md).7+with features: see [docs/UX.md](docs/contributing/ux.md).88 99 This page is what's ahead. What has shipped is listed once, at the end,1010 with the doc that describes it; when an item ships, it moves there as
@@ -20,7 +20,7 @@ Sizes: S (a day or two), M (about a week), L (weeks).
2020 |---|---|---|2121 | Open 012's XLSX output in Excel and LibreOffice before releases, as was done for Google Sheets | The writer is otherwise checked by excelize and 012's reader | S |2222 | Conditional formatting and validation, what's left: data bars and icon sets, "top 10", "duplicate values", date periods (this week, last month), validation on pastes and fills, rules moving with cut and paste, a dropdown's chip look, and custom checkbox values | Excel's other rule types come in as notes | M |23-| Remaining overlays get narrow hosts: filter picker, sort and choice bars, chart editor, shortcuts, named ranges, cell entry and prompts | Components testable without the model ([architecture.md](docs/architecture.md#the-ui)) | M |23+| Remaining overlays get narrow hosts: filter picker, sort and choice bars, chart editor, shortcuts, named ranges, cell entry and prompts | Components testable without the model ([architecture.md](docs/contributing/architecture.md#the-ui)) | M |2424 2525 ### 2. Spreadsheet features Sheets users reach for2626
@@ -33,7 +33,7 @@ Sizes: S (a day or two), M (about a week), L (weeks).
3333 3434 The grid is Excel's, 1,048,576 x 16,384, and memory is bounded by the3535 `max-cells` budget rather than the grid. The budget rises in measured36-steps; see [docs/limits.md](docs/limits.md#what-would-raise-the-bounds).36+steps; see [docs/limits.md](docs/contributing/limits.md#what-would-raise-the-bounds).3737 3838 | Item | Result | Size |3939 |---|---|---|
@@ -58,7 +58,7 @@ steps; see [docs/limits.md](docs/limits.md#what-would-raise-the-bounds).
5858 | Prebuilt binaries attached to version tags, built locally (the GitHub repo is hosting only); tags carry release notes in their message | S |5959 | `make stress-report` thresholds that flag regressions over a set percentage against the last release | S |6060 | Grafana: a trace panel for the nested spans | S |61-| Accessibility: a high-contrast theme, and an audit that every state reads without color (a [UX rule](docs/UX.md#visual-rules)) | S |61+| Accessibility: a high-contrast theme, and an audit that every state reads without color (a [UX rule](docs/contributing/ux.md#visual-rules)) | S |6262 6363 ## Later: sharing a live sheet (shelved)6464
@@ -79,44 +79,44 @@ by a gateway dialing the iroh ticket.
7979 8080 **Engine**8181 82-- Undo and redo for every change, across sheets: [data.md](docs/data.md#undo)83-- Copy, cut, paste and fill with relative and `$absolute` references; insert and delete rows and columns: [data.md](docs/data.md#copy-paste-and-fill)84-- Entries detected as typed (currency, percent, dates, times) and number formats: [formulas.md](docs/formulas.md#what-you-type)85-- Named ranges; several sheets with references between them, hidden sheets: [formulas.md](docs/formulas.md#references)86-- Sheets' everyday, math, text, lookup, date and finance functions, checked against excelize: [functions.md](docs/functions.md), [testing.md](docs/testing.md#the-excelize-oracle)87-- Dynamic arrays that spill (FILTER, SORT, UNIQUE, SEQUENCE and more, ARRAYFORMULA), LET and LAMBDA, SPLIT and the REGEX functions: [formulas.md](docs/formulas.md#arrays-and-spills)88-- Opt-in decimal arithmetic for money: [formulas.md](docs/formulas.md#decimal-arithmetic)89-- An Excel-sized grid with a `max-cells` budget; operations cost the data, not the grid: [limits.md](docs/limits.md#sheet-size)82+- Undo and redo for every change, across sheets: [data.md](docs/sheets/editing.md#undo)83+- Copy, cut, paste and fill with relative and `$absolute` references; insert and delete rows and columns: [data.md](docs/sheets/editing.md#copy-paste-and-fill)84+- Entries detected as typed (currency, percent, dates, times) and number formats: [formulas.md](docs/formulas/README.md#what-you-type)85+- Named ranges; several sheets with references between them, hidden sheets: [formulas.md](docs/formulas/references.md)86+- Sheets' everyday, math, text, lookup, date and finance functions, checked against excelize: [functions.md](docs/reference/functions.md), [testing.md](docs/contributing/testing.md#the-excelize-oracle)87+- Dynamic arrays that spill (FILTER, SORT, UNIQUE, SEQUENCE and more, ARRAYFORMULA), LET and LAMBDA, SPLIT and the REGEX functions: [formulas.md](docs/formulas/arrays.md)88+- Opt-in decimal arithmetic for money: [formulas.md](docs/formulas/decimal.md)89+- An Excel-sized grid with a `max-cells` budget; operations cost the data, not the grid: [limits.md](docs/contributing/limits.md#sheet-size)9090 9191 **Finding and using features**9292 93-- Sheets-structured menus, a command palette and a key for every command: [keys.md](docs/keys.md)94-- Formula suggestions, argument hints and pointing at cells and sheets: [formulas.md](docs/formulas.md#building-formulas)95-- Tracing precedents and dependents, hidden sheets explained: [formulas.md](docs/formulas.md#building-formulas)96-- An optional vim keymap with a `:` command line: [keys.md](docs/keys.md#vim-keys)93+- Sheets-structured menus, a command palette and a key for every command: [keys.md](docs/reference/keys.md)94+- Formula suggestions, argument hints and pointing at cells and sheets: [formulas.md](docs/formulas/building.md)95+- Tracing precedents and dependents, hidden sheets explained: [formulas.md](docs/formulas/building.md)96+- An optional vim keymap with a `:` command line: [keys.md](docs/reference/keys.md#vim-keys)9797 9898 **Data tools**9999 100-- Freeze, multi-column sort, filters with value pickers and conditions: [data.md](docs/data.md#freeze)101-- Find and replace, with regular expressions, across sheets: [data.md](docs/data.md#find-and-replace)102-- Conditional formatting (single-color rules, color scales) and data validation (dropdowns, checkboxes, bounds): [data.md](docs/data.md#conditional-formatting)103-- Pivot tables and frequency tables, live, with subtotals and renamed values: [data.md](docs/data.md#pivot-tables)104-- Notes on cells: [data.md](docs/data.md#notes)105-- Protected sheets and ranges that warn on edit: [data.md](docs/data.md#protected-sheets-and-ranges)106-- Charts (column, bar, line, area, pie, scatter; stacking, trend lines, axis and legend options), as images or text: [charts.md](docs/charts.md)107-- Macros, recorded or written in Starlark: [macros.md](docs/macros.md)108-- JEV functions, with the API key in the OS keychain: [jev.md](docs/jev.md)100+- Freeze, multi-column sort, filters with value pickers and conditions: [data.md](docs/sheets/sort-filter.md#freeze)101+- Find and replace, with regular expressions, across sheets: [data.md](docs/sheets/find-replace.md)102+- Conditional formatting (single-color rules, color scales) and data validation (dropdowns, checkboxes, bounds): [data.md](docs/sheets/rules.md#conditional-formatting)103+- Pivot tables and frequency tables, live, with subtotals and renamed values: [data.md](docs/sheets/pivots.md)104+- Notes on cells: [data.md](docs/sheets/notes-protection.md#notes)105+- Protected sheets and ranges that warn on edit: [data.md](docs/sheets/notes-protection.md#protected-sheets-and-ranges)106+- Charts (column, bar, line, area, pie, scatter; stacking, trend lines, axis and legend options), as images or text: [charts.md](docs/sheets/charts.md)107+- Macros, recorded or written in Starlark: [macros.md](docs/sheets/macros.md)108+- JEV functions, with the API key in the OS keychain: [jev.md](docs/formulas/jev.md)109109 110110 **The terminal**111111 112-- System clipboard, hyperlinks, curly error underlines, cursor shapes, progress and notifications, light and dark: [charts.md](docs/charts.md#terminal-features-012-uses)113-- Color schemes and a config file: [themes.md](docs/themes.md), [config.md](docs/config.md)114-- `012 serve` over SSH, with files on the ssh command line and recovery of unsaved work: [ssh.md](docs/ssh.md)112+- System clipboard, hyperlinks, curly error underlines, cursor shapes, progress and notifications, light and dark: [charts.md](docs/terminal/README.md#terminal-features-012-uses)113+- Color schemes and a config file: [themes.md](docs/terminal/themes.md), [config.md](docs/reference/config.md)114+- `012 serve` over SSH, with files on the ssh command line and recovery of unsaved work: [ssh.md](docs/terminal/ssh.md)115115 116116 **Files**117117 118-- Import CSV, TSV, XLSX, SQLite, Parquet and Lotus `.wk1`; export CSV, TSV, XLSX and SQLite; import locations; save-as and overwrite checks: [files.md](docs/files.md)118+- Import CSV, TSV, XLSX, SQLite, Parquet and Lotus `.wk1`; export CSV, TSV, XLSX and SQLite; import locations; save-as and overwrite checks: [files.md](docs/files/README.md)119119 120120 **Upkeep**121121 122-- `make check` before every push; demo tapes (`make demos`); version tags from v0.1.0: [testing.md](docs/testing.md)122+- `make check` before every push; demo tapes (`make demos`); version tags from v0.1.0: [testing.md](docs/contributing/testing.md)
M docs/README.md +8 -8
@@ -7,14 +7,14 @@ sidebar_position: 1
77 88 | Section | For |99 |---|---|10-| [Getting started](@/getting-started/README.md) | Installing and running 012, and the screen |11-| [Working with sheets](@/sheets/README.md) | Editing, formatting, sheets, sort and filter, find, rules, pivot tables, notes, charts, macros |12-| [Formulas](@/formulas/README.md) | Entries, references, building formulas, arrays, decimal arithmetic, JEV functions |13-| [Files](@/files/README.md) | Import and download, Excel files, saving, the `.012` format |14-| [The terminal](@/terminal/README.md) | Terminal features, themes, serving over SSH |15-| [Reference](@/reference/README.md) | Keys, functions, configuration, the macro API |16-| [Contributing](@/contributing/README.md) | Architecture, extending, the UX bar, testing, limits, observability |10+| [Getting started](getting-started/README.md) | Installing and running 012, and the screen |11+| [Working with sheets](sheets/README.md) | Editing, formatting, sheets, sort and filter, find, rules, pivot tables, notes, charts, macros |12+| [Formulas](formulas/README.md) | Entries, references, building formulas, arrays, decimal arithmetic, JEV functions |13+| [Files](files/README.md) | Import and download, Excel files, saving, the `.012` format |14+| [The terminal](terminal/README.md) | Terminal features, themes, serving over SSH |15+| [Reference](reference/README.md) | Keys, functions, configuration, the macro API |16+| [Contributing](contributing/README.md) | Architecture, extending, the UX bar, testing, limits, observability |1717 18-The [roadmap](@@/ROADMAP.md) says what's ahead. The docs are Markdown that18+The [roadmap](../ROADMAP.md) says what's ahead. The docs are Markdown that1919 reads on GitHub and builds with Docusaurus: each folder has a2020 `README.md` and a `_category_.json`, and each page front matter.
M docs/contributing/README.md +8 -8
M docs/contributing/architecture.md +6 -6
@@ -128,7 +128,7 @@ style.
128128 - **Functions.** One table (`FuncDef`, in `internal/functions`) holds129129 every function's name, signature, description and arity; it drives130130 parsing, evaluation, autocomplete, in-app help and131- [functions.md](functions.md). See [Functions](#functions).131+ [functions.md](../reference/functions.md). See [Functions](#functions).132132 - **Undo.** Every mutation goes through a small set of paths that snapshot133133 the cells, widths, names, charts, view state and sheet list they change,134134 on any sheet, so a step can be reversed exactly; multi-cell operations
@@ -186,7 +186,7 @@ style.
186186 (one file per category: `everyday.go`, `math.go`, `stats.go`,187187 `logic.go`, `text.go`, `regex.go`, `lookup.go`, `dynamic.go`,188188 `lambda.go`, `date.go`, `finance.go`, `link.go`, `jev.go`, which189-[functions.md](functions.md) is grouped by), the evaluation of formulas189+[functions.md](../reference/functions.md) is grouped by), the evaluation of formulas190190 (`eval.go`: operators and calls; arrays in `array.go`, functions mapped191191 over them in `lift.go`, the names LET and LAMBDA bind in `scope.go`), the helpers192192 functions share (arguments and blocks of cells in `args.go`, criteria
@@ -295,7 +295,7 @@ move without touching callers:
295295 296296 `internal/ui` is a Bubble Tea program. Inside the grid it follows Google297297 Sheets; around it, the control panel keeps a 1-2-3 look. See298-[UX.md](UX.md) for the rules every change follows.298+[UX.md](ux.md) for the rules every change follows.299299 300300 **Commands.** Every action is a registered command with a title and301301 description (`commands.go`), reached from key bindings, the menu bar,
@@ -479,7 +479,7 @@ file names. Everything a model knows lives in the model, so sessions
479479 share nothing but read-only tables (the command and function480480 registries), the process-wide telemetry and, with JEV on, the HTTP481481 client; each gets its own `jev.Cache`, whose queue belongs to that482-session's program. See [ssh.md](ssh.md).482+session's program. See [ssh.md](../terminal/ssh.md).483483 484484 **Unsaved work.** `Server.Shutdown` closes a channel every session485485 watches; a session quitting on it, or on its idle timeout, asks its
@@ -504,7 +504,7 @@ config directory; the same directory holds `themes/` and 012 serve's host
504504 key. Every option is one entry in `config.Options`: name, type, default,505505 environment variables, flag, whether Reload config applies it, and a506506 description. Parsing and validation, the flags `cmd/012` accepts, `012507-config`'s listing and default file, and [config.md](config.md)'s507+config`'s listing and default file, and [config.md](../reference/config.md)'s508508 reference (checked by a test) all come from that table. Values are layered defaults < file < environment < flags, each509509 remembering its source; problems are warnings, never fatal. The UI gets a510510 `ui.Settings` (the config, a reload function, the credential store, a JEV
@@ -550,7 +550,7 @@ color scheme (`theme.Palette`: VHS's embedded catalog, or a Ghostty,
550550 kitty or VHS JSON file in `themes/`) is drawn by `theme.FromPalette`,551551 which maps each ANSI color to the scheme's, adds full-width bands for the552552 bars and a screen background, and corrects contrast (see553-[themes.md](themes.md)). Bands are applied by `theme.Fill`, one pass over553+[themes.md](../terminal/themes.md)). Bands are applied by `theme.Fill`, one pass over554554 a rendered line's escape sequences that sets the band's colors at the555555 start and after each reset and pads to the width; `View` fills the bar556556 lines before overlays are composited and the whole screen after, so bars
M docs/contributing/extending.md +2 -2
@@ -19,12 +19,12 @@ shows it is derived from the table rather than listing it again.
1919 2020 | Registry | Entry | Derived from it |2121 |---|---|---|22-| `functions.FuncDef` (one file per category in `internal/functions`) | a function: name, signature, description, arity, eval, result format, decimal twin | parsing, autocomplete, argument hints, help, [functions.md](functions.md) |22+| `functions.FuncDef` (one file per category in `internal/functions`) | a function: name, signature, description, arity, eval, result format, decimal twin | parsing, autocomplete, argument hints, help, [functions.md](../reference/functions.md) |2323 | `ui.command` | an action: id, title, description, run, enabled, checked, what it edits, and how macros treat it | key bindings (Sheets and vim), menu bar, context menus, palette, shortcuts help, the `:` command line and its completions, macro recording and `run()` in scripts |2424 | `fileio` formats (`formats.go`) | a format: name, extensions, labels, traits, importer, exporter | `Import`, `Export`, detection, import picker, File > Download, command line |2525 | `chart.types`, with `sheet.ChartTypes` | a type: name and order (sheet, saved in files), a layout drawing text and image and the series its legend lists (chart) | `chart.Draw`, `chart.Image`, chart editor, Insert > Chart |2626 | theme roles (`theme.Theme`) | a role: dark and light styles on the 16 ANSI colors, with a contrast minimum for schemes (`minContrast`) | every style in the UI, drawn in the terminal's palette or any color scheme (`FromPalette`); `TestEveryThemeReadable` checks each role under every built-in scheme |27-| `config.Options` | an option: name, type, default, environment variables, flag, live or not, description, check | parsing and warnings, flags, `012 config` and its default file, [config.md](config.md), Reload config |27+| `config.Options` | an option: name, type, default, environment variables, flag, live or not, description, check | parsing and warnings, flags, `012 config` and its default file, [config.md](../reference/config.md), Reload config |2828 2929 Adding a function, command, format, chart type, option or role means3030 adding an entry (and its file), not editing switch statements elsewhere.
M docs/contributing/observability.md +1 -1
M docs/contributing/testing.md +6 -6
@@ -108,20 +108,20 @@ shows go there, and GIFs stay under 1 MB.
108108 ## Docs109109 110110 `make lint` runs `scripts/doclint`, which flags wording that narrates111-history (see [CLAUDE.md](../CLAUDE.md)), and `scripts/doccheck`: relative112-links and anchors resolve, [docs/README.md](README.md) links every doc,111+history (see [CLAUDE.md](../../CLAUDE.md)), and `scripts/doccheck`: relative112+links and anchors resolve, [docs/README.md](../README.md) links every doc,113113 every file in `docs/media` is shown by a doc and made by a tape, and114114 every tape records something a doc shows. Unit tests check what the docs115115 say about the code: menu paths lead to menu items, command ids and keys116-exist and every bound key is in [keys.md](keys.md)116+exist and every bound key is in [keys.md](../reference/keys.md)117117 (`internal/ui/docs_test.go`), settings and variables are options118-(`internal/config/docs_test.go`), and [files.md](files.md) names every118+(`internal/config/docs_test.go`), and [files.md](../files/README.md) names every119119 field of the format (`internal/sheet/file_doc_test.go`).120-[functions.md](functions.md) and [config.md](config.md)'s reference are120+[functions.md](../reference/functions.md) and [config.md](../reference/config.md)'s reference are121121 generated, and their tests fail when they're stale.122122 123123 ## No broken windows124124 125125 `make check` must pass before a push, and warnings are fixed or turned126126 off with a written reason rather than left standing. The rules are in127-[CLAUDE.md](../CLAUDE.md).127+[CLAUDE.md](../../CLAUDE.md).
M docs/contributing/ux.md +2 -2
M docs/files/README.md +7 -7
@@ -10,7 +10,7 @@ sheet in one file. Other formats come in through File > Import, File >
1010 Open or the command line (`012 sales.xlsx`), and go out through File >1111 Download.1212 13-![File > Import listing the spreadsheets in a folder](media/import-picker.png)13+![File > Import listing the spreadsheets in a folder](../media/import-picker.png)1414 1515 ## Import and download1616
@@ -21,7 +21,7 @@ it back in its format.
2121 | Format | Import | Download |2222 |---|---|---|2323 | CSV, TSV | Delimiter (`,` `;` tab `\|`), UTF-8 BOM, UTF-16 and Windows-1252 detected; entries become numbers, dates, currency and percentages as if typed; formulas stay text | Values as shown, of the sheet shown, as Sheets' Download does; a selection of whole columns or rows downloads their data, not a million blank lines |24-| Excel `.xlsx` | Every sheet, with formulas, formats and most of what a sheet holds: see [Excel files](#excel-files) | The same |24+| Excel `.xlsx` | Every sheet, with formulas, formats and most of what a sheet holds: see [Excel files](excel.md) | The same |2525 | SQLite | Pick a table or view, or type a query; a header row names the columns | The sheet shown or the selection as a table, first row as column names; a table of that name is replaced |2626 | Parquet | Every column, with dates and timestamps; lists joined with commas | |2727 | Lotus 1-2-3 `.wk1`, `.wks` | Numbers, labels with their alignment, formats, column widths, formulas translated (references, operators, `@SUM`, `@AVG`, `@IF`, `@ROUND`, `@PMT` and 60 more) or kept as values | |
@@ -48,17 +48,17 @@ line lists the removed charts first, then which were re-pointed and
4848 which kept their range, and undo brings the removed ones back.4949 5050 **Size.** A sheet is 1,048,576 rows by 16,384 columns (A to XFD), as in51-Excel. Imports keep at most `max-cells` cells ([config.md](config.md#max-cells),51+Excel. Imports keep at most `max-cells` cells ([config.md](../reference/config.md#max-cells),5252 two million by default, about 600 MB): whole rows, as many as fit, and5353 the context line says how many rows were left out, e.g. `only the first5454 166,666 rows fit in max-cells (2,000,000 cells); 12,000 rows left out`.5555 Data past the grid's edges is left out the same way. WK1 files keep their56-own 8,192 by 256. See [limits.md](limits.md#imports) for speeds.56+own 8,192 by 256. See [limits.md](../contributing/limits.md#imports) for speeds.5757 5858 ## More5959 6060 | Page | For |6161 |---|---|62-| [Excel files](@/files/excel.md) | What comes in from and goes out to `.xlsx` |63-| [Saving](@/files/saving.md) | Atomic saves, overwrite checks, unsaved work under `012 serve` |64-| [The .012 format](@/files/format.md) | The JSON format, its versions and fields |62+| [Excel files](excel.md) | What comes in from and goes out to `.xlsx` |63+| [Saving](saving.md) | Atomic saves, overwrite checks, unsaved work under `012 serve` |64+| [The .012 format](format.md) | The JSON format, its versions and fields |
M docs/files/excel.md +3 -3
M docs/files/format.md +6 -6
@@ -24,7 +24,7 @@ object:
2424 ```2525 2626 A formatted cell has its `input` and the formatting that isn't the27-default: `format` (as `number_format` in [macros](macros.md#cells) names27+default: `format` (as `number_format` in [macros](../reference/macro-api.md#cells) names2828 it: `currency`, `percent`, `date`, ...), `decimals`, `pattern` for a2929 custom format, `bold`, `italic`, `underline`, `strikethrough` and3030 `align` (`left`, `center`, `right`).
@@ -50,19 +50,19 @@ save), so they raise no version:
5050 5151 | Field | On | Holds |5252 |---|---|---|53-| `note` | a cell | Its [note](data.md#notes) |53+| `note` | a cell | Its [note](../sheets/notes-protection.md#notes) |5454 | `own` | a cell | `true` when its formatting is its own, not its column's or row's (Automatic in a currency column) |5555 | `lines` | a sheet | [Column and row formats](#column-and-row-formats) |5656 | `name`, `hidden` | a sheet | Its name when renamed; `true` when hidden (a file whose sheets are all hidden opens with the first one shown) |5757 | `charts` | a sheet | One chart per line: `type` (`column`, `bar`, `line`, `pie`, `area`, `scatter`), `data`, `at`, `width`, `height`, `byRow`, `header`, `labels`, `title`, and options left out at their defaults: `stack` (`stacked`, `percent`), `trend`, `min`, `max`, `log`, `gridlines` (only when off), `legend` (`right`, `none`). A build that charts but lacks a chart's type refuses the file |58-| `protected` | a sheet | [Protected ranges](data.md#protected-sheets-and-ranges): `{"range":"B2:C9","description":"Totals"}`, or `{"sheet":true}` |58+| `protected` | a sheet | [Protected ranges](../sheets/notes-protection.md#protected-sheets-and-ranges): `{"range":"B2:C9","description":"Totals"}`, or `{"sheet":true}` |5959 | `conditionalFormats`, `validations` | a sheet | [Rules](#conditional-formats-and-data-validation), one per line |60-| `arithmetic` | the workbook | `decimal` for [decimal arithmetic](formulas.md#decimal-arithmetic) |61-| `macros`, `macroOrigin` | the workbook | Macros as Starlark scripts, and the computer they were made or trusted on: see [macros.md](macros.md#in-the-file). Opening a file never runs them |60+| `arithmetic` | the workbook | `decimal` for [decimal arithmetic](../formulas/decimal.md) |61+| `macros`, `macroOrigin` | the workbook | Macros as Starlark scripts, and the computer they were made or trusted on: see [macros.md](../reference/macro-api.md#in-the-file). Opening a file never runs them |6262 6363 ## Column and row formats6464 65-[Formats of whole columns and rows](data.md#rows-and-columns) are kept65+[Formats of whole columns and rows](../sheets/editing.md#rows-and-columns) are kept6666 in a `lines` field after the widths, runs of lines with the same6767 formatting together; `A:XFD` is the whole sheet's format:6868
M docs/files/saving.md +2 -2
M docs/formulas/README.md +6 -6
M docs/formulas/decimal.md +1 -1
M docs/formulas/jev.md +1 -1
M docs/formulas/references.md +2 -2
M docs/getting-started/README.md +5 -5
M docs/getting-started/install.md +5 -5
M docs/reference/README.md +4 -4
M docs/reference/config.md +2 -2
M docs/reference/keys.md +15 -15
@@ -28,7 +28,7 @@ mouse and the vim keymap added.
2828 2929 | Key | Action |3030 |---|---|31-| Type | Replace the cell: `=` starts a formula, `'` forces text, and `$1,200`, `12%`, `9/26/2026` or `14:30` are numbers that keep their format ([formulas.md](formulas.md#what-you-type)) |31+| Type | Replace the cell: `=` starts a formula, `'` forces text, and `$1,200`, `12%`, `9/26/2026` or `14:30` are numbers that keep their format ([formulas.md](../formulas/README.md#what-you-type)) |3232 | Enter, Tab | Accept and move down or right; Enter goes back to the column a run of Tabs began in |3333 | Enter, F2, double-click | Edit the cell |3434 | Esc | Cancel the entry |
@@ -58,7 +58,7 @@ mouse and the vim keymap added.
5858 | Ctrl+D, Ctrl+R | Fill down, fill right; a series started in the top rows (1, 2 over blanks) continues |5959 | Ctrl+Alt+=, Ctrl+Alt+- | Insert rows above, delete the selected rows (columns when whole columns are selected) |6060 61-[data.md](data.md#copy-paste-and-fill) says how formats travel with61+[data.md](../sheets/editing.md#copy-paste-and-fill) says how formats travel with6262 copies and which series the fill handle continues.6363 6464 ## Formatting
@@ -89,20 +89,20 @@ The rest of the formats are in the Format menu.
8989 9090 | Key | Action | More |9191 |---|---|---|92-| Ctrl+F, Ctrl+H | Find; find and replace | [data.md](data.md#find-and-replace) |93-| Alt+Down | Open the active cell's dropdown (type to search, Enter picks); elsewhere, with a filter on (Data > Create a filter), the column's filter (Space checks values, type to search, or pick a condition) | [validation](data.md#data-validation), [filter](data.md#filter) |94-| Space | Check or uncheck the selected checkboxes (Insert > Checkbox); elsewhere Space starts an entry | [data.md](data.md#data-validation) |95-| Alt+, Alt+. | Trace precedents, dependents: highlight the cells a formula reads, or the formulas that read the cell, and jump to the first; again for the next, Esc to go back (Excel's Ctrl+[ and Ctrl+], which terminals send as Esc) | [formulas.md](formulas.md#building-formulas) |96-| Alt+Shift+F | Frequency table of the active column on a new sheet, as VisiData's Shift+F | [data.md](data.md#frequency-tables) |97-| Shift+F2 | Add or edit the active cell's note; Alt+Enter or Shift+Enter starts a new line | [data.md](data.md#notes) |92+| Ctrl+F, Ctrl+H | Find; find and replace | [data.md](../sheets/find-replace.md) |93+| Alt+Down | Open the active cell's dropdown (type to search, Enter picks); elsewhere, with a filter on (Data > Create a filter), the column's filter (Space checks values, type to search, or pick a condition) | [validation](../sheets/rules.md#data-validation), [filter](../sheets/sort-filter.md#filter) |94+| Space | Check or uncheck the selected checkboxes (Insert > Checkbox); elsewhere Space starts an entry | [data.md](../sheets/rules.md#data-validation) |95+| Alt+, Alt+. | Trace precedents, dependents: highlight the cells a formula reads, or the formulas that read the cell, and jump to the first; again for the next, Esc to go back (Excel's Ctrl+[ and Ctrl+], which terminals send as Esc) | [formulas.md](../formulas/building.md) |96+| Alt+Shift+F | Frequency table of the active column on a new sheet, as VisiData's Shift+F | [data.md](../sheets/pivots.md#frequency-tables) |97+| Shift+F2 | Add or edit the active cell's note; Alt+Enter or Shift+Enter starts a new line | [data.md](../sheets/notes-protection.md#notes) |9898 9999 Tools with no key of their own have their keys on screen while they're100100 open, and in their docs: sorting by several columns101-([data.md](data.md#sort)), conditional formatting and data validation102-([rules panel](data.md#conditional-formatting)), pivot tables103-([pivot editor](data.md#pivot-tables)), protected ranges104-([data.md](data.md#protected-sheets-and-ranges)) and charts105-([charts.md](charts.md)). In Data > Named ranges, Enter goes to a101+([data.md](../sheets/sort-filter.md#sort)), conditional formatting and data validation102+([rules panel](../sheets/rules.md#conditional-formatting)), pivot tables103+([pivot editor](../sheets/pivots.md)), protected ranges104+([data.md](../sheets/notes-protection.md#protected-sheets-and-ranges)) and charts105+([charts.md](../sheets/charts.md)). In Data > Named ranges, Enter goes to a106106 range, F2 renames or repoints it and Ctrl+D deletes it.107107 108108 ## Files, menus and help
@@ -119,7 +119,7 @@ range, F2 renames or repoints it and Ctrl+D deletes it.
119119 120120 | Key | Action |121121 |---|---|122-| Ctrl+Alt+Shift+0 to 9 | Run the macro with that shortcut ([macros.md](macros.md#running)) |122+| Ctrl+Alt+Shift+0 to 9 | Run the macro with that shortcut ([macros.md](../sheets/macros.md#running)) |123123 | Esc | Stop a macro while it runs (the mode indicator says CMD) |124124 125125 ## Vim keys
@@ -137,7 +137,7 @@ Ctrl+D, Ctrl+U and Ctrl+R are vim's, so fill down and fill right are in
137137 the Edit menu. F1 lists the vim keys first, and the menus and palette138138 show them where Sheets' keys are taken.139139 140-![Vim keys: counts, dd and p, / search, VISUAL rows and the : line](media/vim.gif)140+![Vim keys: counts, dd and p, / search, VISUAL rows and the : line](../media/vim.gif)141141 142142 | Keys (NORMAL) | Action |143143 |---|---|
M docs/reference/macro-api.md +2 -2
@@ -5,7 +5,7 @@ sidebar_position: 5
55 66 # Macro scripting API77 8-What a [macro](@/sheets/macros.md) script can do. Recorded macros use8+What a [macro](../sheets/macros.md) script can do. Recorded macros use99 the same functions, so recording one is a quick way to see them.1010 1111 A script runs from top to bottom. It's Starlark: Python's syntax
@@ -99,7 +99,7 @@ menus, help, undo or macros. The ids are those in the recorded scripts; a few:
9999 | `column.width` (answer: the width), `column.reset` | Column widths |100100 | `data.sort_sheet_az`, `data.sort_range_az`, `data.sort_range_za`, `data.filter`, `data.filter_remove` | Sorting and filters |101101 | `data.define_name` (answer: the name) | Name the selection |102-| `format.conditional_add`, `data.validation_add` (answer: the rule as a line of the file, see [files.md](files.md#conditional-formats-and-data-validation)), `insert.checkbox`, `format.conditional_clear`, `data.validation_clear`, `data.checkbox_toggle` | Conditional formats, data validation and checkboxes |102+| `format.conditional_add`, `data.validation_add` (answer: the rule as a line of the file, see [files.md](../files/format.md#conditional-formats-and-data-validation)), `insert.checkbox`, `format.conditional_clear`, `data.validation_clear`, `data.checkbox_toggle` | Conditional formats, data validation and checkboxes |103103 | `sheet.new`, `sheet.duplicate`, `sheet.rename` (answer: the name), `sheet.delete` (answer: `"enter"` when it asks), `sheet.hide`, `sheet.unhide` (answer: the sheet's name) | Sheets |104104 | `view.freeze_rows1`, `view.freeze_cols1`, `view.freeze_rows0`, ... | Frozen panes |105105
M docs/sheets/README.md +11 -11
@@ -8,17 +8,17 @@ sidebar_position: 1
88 How to change what a sheet holds and how it looks, and the tools for99 working with its data.1010 11-![Freezing, sorting and filtering an inventory](@/media/freeze-sort-filter.gif)11+![Freezing, sorting and filtering an inventory](../media/freeze-sort-filter.gif)1212 1313 | Page | For |1414 |---|---|15-| [Editing](@/sheets/editing.md) | Selecting, copy and paste, fill, undo, rows and columns, links |16-| [Formatting](@/sheets/formatting.md) | Number formats, text styles, column and row formats, widths |17-| [Sheets and tabs](@/sheets/sheets-and-tabs.md) | Several sheets: adding, moving, hiding |18-| [Freeze, sort and filter](@/sheets/sort-filter.md) | Keeping headers on screen, sorting, filtering by values or conditions |19-| [Find and replace](@/sheets/find-replace.md) | Searching one sheet, all of them or a range |20-| [Conditional formatting and data validation](@/sheets/rules.md) | Coloring cells by their values; dropdowns, checkboxes and entry rules |21-| [Pivot tables](@/sheets/pivots.md) | Summaries of a table on a sheet of their own, and frequency tables |22-| [Notes and protection](@/sheets/notes-protection.md) | Notes on cells; ranges that warn before an edit |23-| [Charts](@/sheets/charts.md) | Charts that float over the grid |24-| [Macros](@/sheets/macros.md) | Recording and running what you do |15+| [Editing](editing.md) | Selecting, copy and paste, fill, undo, rows and columns, links |16+| [Formatting](formatting.md) | Number formats, text styles, column and row formats, widths |17+| [Sheets and tabs](sheets-and-tabs.md) | Several sheets: adding, moving, hiding |18+| [Freeze, sort and filter](sort-filter.md) | Keeping headers on screen, sorting, filtering by values or conditions |19+| [Find and replace](find-replace.md) | Searching one sheet, all of them or a range |20+| [Conditional formatting and data validation](rules.md) | Coloring cells by their values; dropdowns, checkboxes and entry rules |21+| [Pivot tables](pivots.md) | Summaries of a table on a sheet of their own, and frequency tables |22+| [Notes and protection](notes-protection.md) | Notes on cells; ranges that warn before an edit |23+| [Charts](charts.md) | Charts that float over the grid |24+| [Macros](macros.md) | Recording and running what you do |
M docs/sheets/editing.md +1 -1
M docs/sheets/formatting.md +5 -5
@@ -7,9 +7,9 @@ sidebar_position: 3
77 88 Formats change how values show, never what they are. Select cells,99 whole columns or rows, then pick a format from the Format menu, a key10-([keys](@/reference/keys.md#formatting)) or the palette. Entries such as10+([keys](../reference/keys.md#formatting)) or the palette. Entries such as1111 `$1,200`, `12%` or `9/26/2026` take their format as you type them12-([formulas](@/formulas/README.md#what-you-type)).12+([formulas](../formulas/README.md#what-you-type)).1313 1414 ## Number formats1515
@@ -33,7 +33,7 @@ Format > Number, as Sheets names them:
3333 3434 Format > Increase and Decrease decimal places show one more or one less.3535 A formula left Automatic shows the format of what it reads36-([building formulas](@/formulas/building.md)).36+([building formulas](../formulas/building.md)).3737 3838 ## Text3939
@@ -51,7 +51,7 @@ cell of it shows the format unless it has its own, and a cell typed into
5151 later takes it. A cell's format comes from the cell, else its row, else5252 its column, else the whole sheet's (Ctrl+A twice, then a format); the5353 number format and the text style fall back separately. Copies carry what54-cells show ([editing](@/sheets/editing.md#copy-paste-and-fill)).54+cells show ([editing](editing.md#copy-paste-and-fill)).5555 5656 ## Column widths5757
@@ -60,4 +60,4 @@ Drag a column header's right edge, or use Format > Column width (1 to
6060 Reset column width goes back to the default.6161 6262 Conditional formats, which color cells by their values, are on63-[their own page](@/sheets/rules.md).63+[their own page](rules.md).
M docs/sheets/macros.md +3 -3
M docs/sheets/pivots.md +1 -1
M docs/sheets/rules.md +3 -3
@@ -15,7 +15,7 @@ Left/Right change a choice, Space flips a check, text lines are typed
1515 into, Enter saves and Esc goes back without saving. Every change is an1616 undo step.1717 18-![Checking a task off, picking an owner from a dropdown, a rejected entry, and the rules panel](media/rules.gif)18+![Checking a task off, picking an owner from a dropdown, a rejected entry, and the rules panel](../media/rules.gif)1919 2020 A rule applies to ranges (`A2:A100`, or several: `A2:A9,C2:C9`) and is2121 one of:
@@ -41,7 +41,7 @@ over a rule's colors; its text styles show through them.
4141 4242 Colors are named (red, yellow, green, cyan, blue, magenta) rather than4343 picked from a color wheel, because each is one of the terminal's 16 ANSI44-colors: the terminal's palette or the color scheme ([themes.md](themes.md))44+colors: the terminal's palette or the color scheme ([themes.md](../terminal/themes.md))4545 decides what they look like, and a fill's text is drawn in whichever of4646 black or white reads on it. A text color that wouldn't read on a rule's4747 fill takes the fill's ink instead. Color scales blend the scheme's colors
@@ -94,4 +94,4 @@ selection out of every rule.
9494 9595 Adding a checkbox or a dropdown changes no cells, so on a protected range9696 it doesn't ask first (on a protected sheet it does); checking a box or97-picking an item asks as typing does ([protection](#protected-sheets-and-ranges)).97+picking an item asks as typing does ([protection](notes-protection.md#protected-sheets-and-ranges)).
M docs/sheets/sheets-and-tabs.md +1 -1
M docs/terminal/README.md +2 -2
M docs/terminal/ssh.md +4 -4
@@ -10,7 +10,7 @@ the client's own terminal, on the files of one directory. It's for
1010 reaching your sheets from another machine or a tablet with an SSH app,1111 without installing anything there. It is not shared editing: two1212 sessions are two separate spreadsheets (see13-[the roadmap](../ROADMAP.md#later-sharing-a-live-sheet-shelved)).13+[the roadmap](../../ROADMAP.md#later-sharing-a-live-sheet-shelved)).1414 1515 ```sh1616 012 serve ~/sheets # serve ~/sheets on 127.0.0.1:2312
@@ -38,7 +38,7 @@ there's no command.
3838 | `--host-key` | `<config dir>/012/ssh_host_ed25519_key` | The server's key, generated on first run |3939 | `--idle-timeout` | `30m` | End a session after this long without input, keeping its unsaved changes; `0` never does |4040 | `--max-sessions` | `8` | Sessions at once; more are turned away with a message |41-| `--log`, `--otlp` | off | Telemetry, as for the app ([observability.md](observability.md)) |41+| `--log`, `--otlp` | off | Telemetry, as for the app ([observability.md](../contributing/observability.md)) |4242 4343 The config directory is `os.UserConfigDir()`: `~/Library/Application4444 Support` on macOS, `~/.config` on Linux. On start, 012 prints the served
@@ -142,7 +142,7 @@ client: the window size and its changes, the colors (from the `TERM`
142142 the client sends), the light or dark background, kitty graphics, and143143 the clipboard, which Ctrl+C sets on the client's machine through OSC 52.144144 145-[Macros](macros.md) can be recorded, run, renamed and deleted in a145+[Macros](../sheets/macros.md) can be recorded, run, renamed and deleted in a146146 session, but not edited as scripts: that would start an editor on the147147 server. A file's macros ask for trust once per session, since the148148 session isn't the server's own computer, and scripts have no file,
@@ -194,4 +194,4 @@ check protects the local app from other programs writing the file.
194194 300 B per cell of the sheets it opens; two sessions opening one file195195 hold two copies. With 50 sessions typing at once on loopback, frames196196 still arrive within one frame interval (p95 16.6 ms), the same as with197- 10: see [limits.md](limits.md#serving-over-ssh).197+ 10: see [limits.md](../contributing/limits.md#serving-over-ssh).
M docs/terminal/themes.md +3 -3
@@ -38,7 +38,7 @@ writes `theme = ...` to the config file, and Esc goes back to the theme you
3838 had. With a `light:`/`dark:` pair, the picker changes the one in use.3939 `012 config themes` lists every theme, with a `*` on the current one.4040 41-![The theme picker previewing 1-2-3 Classic](media/theme-classic.png)41+![The theme picker previewing 1-2-3 Classic](../media/theme-classic.png)4242 4343 ## Built-in schemes4444
@@ -100,7 +100,7 @@ for cell text, text on the bars, the selection, the headers and every
100100 other role (`TestEveryThemeReadable`). Charts, as text and as kitty101101 images, use the scheme's colors too.102102 103-Conditional formats ([data.md](data.md#conditional-formatting)) name103+Conditional formats ([data.md](../sheets/rules.md#conditional-formatting)) name104104 their colors (red, yellow, green, cyan, blue, magenta) rather than105105 giving RGB, and each is an ANSI slot, so they follow the theme too: a106106 text color is the slot on the cell (`RuleText`), a fill the slot as a
@@ -125,6 +125,6 @@ terminal theme leaves them empty, so it looks as it always has.
125125 ## Credits126126 127127 The built-in schemes are VHS's `themes.json` (MIT License, Copyright (c)128-2022-2023 Charmbracelet, Inc.; see [NOTICE](../NOTICE)), which credits128+2022-2023 Charmbracelet, Inc.; see [NOTICE](../../NOTICE)), which credits129129 each scheme's authors in its `meta.credits`. The contrast correction is130130 adapted from the theme package of puzzletea, by the same author.