Skip to content

Commit 52f4257

Browse files
okt4vclaude
andcommitted
chore: release v0.1.22 — formula-aware paste, dd fix, style yank/paste
Major changes: - Fix dd/insert-row/delete-col corrupting rows below due to unsorted HashMap iteration during cell shifting (sort ascending for shift-up, descending for shift-down) - Yank/delete now carries cell styles alongside values; paste restores them - Formula-aware paste: relative refs (A1) adjust by paste offset, absolute refs ($A$1) stay fixed, mixed refs ($A1/A$1) lock one axis - Parser and Expr AST now preserve abs_col/abs_row from $ notation - New adjust_formula_refs() function in asat-formula for paste offset - Register stores source_row/source_col for delta computation - Delete operations (x, dd, visual d) yank to register+clipboard first - Formula bar shows visible edit cursor with inverted colors - :home command returns to welcome screen - Visual selection stays visible when entering command mode - Undo/redo repositions cursor to affected cell - Edit mode shows formula text instead of computed result - Version bump to 0.1.22, website and README updated Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 6911a0a commit 52f4257

14 files changed

Lines changed: 463 additions & 90 deletions

File tree

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
# Cargo.lock is committed for binary crates (required for --locked builds)
44

55
# ── Project-specific non-code directories ─────────────────────────────────────
6+
/marketing/
67
/planning/
78
/userinfo/
89
/testdata/

Cargo.lock

Lines changed: 9 additions & 9 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ members = [
1313
resolver = "2"
1414

1515
[workspace.package]
16-
version = "0.1.21"
16+
version = "0.1.22"
1717
edition = "2021"
1818
license = "GPL-3.0"
1919
authors = ["okt4v"]

README.md

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,9 @@
1717
- **Named ranges**`:name SALES A1:C10` defines a named range usable in formulas as `=SUM(SALES)`
1818
- **Multi-sheet workbooks** — tab bar, `:tabnew`, `:tabclose`, `gt` / `gT` to switch sheets
1919
- **File format support** — read and write CSV, TSV, XLSX, and ODS (OpenDocument Spreadsheet); native `.asat` format with bincode + zstd compression; ODS formula round-trip with cached computed values
20-
- **System clipboard** — yank (`yy`, `yc`, visual `y`) copies as TSV; `Ctrl+V` in Insert mode pastes from system clipboard
21-
- **Full undo stack** — 1000-deep undo/redo covering cell edits, row/column operations, pastes, and style changes
20+
- **System clipboard** — yank (`yy`, `yc`, visual `y`) copies values and styles as TSV; `Ctrl+V` in Insert mode pastes from system clipboard; delete (`dd`, `x`, visual `d`) also yanks to register + clipboard before clearing
21+
- **Formula-aware paste** — pasting a formula adjusts relative cell references (`A1` becomes `B2` when pasted one row down and one column right); absolute references (`$A$1`) stay fixed; mixed references (`$A1`, `A$1`) lock only the `$`-prefixed axis
22+
- **Full undo stack** — 1000-deep undo/redo covering cell edits, row/column operations, pastes, and style changes; undo/redo repositions the cursor to the affected cell
2223
- **Sort & find/replace**`:sort [COL] [!]` sorts rows by any column (e.g. `:sort B!` = column B descending); `:s/pat/repl/g` does regex find & replace across cells; both undoable
2324
- **Filter rows**`:filter <col> <op> <val>` hides non-matching rows (supports `=`, `!=`, `>`, `<`, `>=`, `<=`, `~`); `:filter off` restores all rows
2425
- **Freeze panes** — frozen rows and columns render as sticky headers with a visual separator; set via `:freeze rows N` / `:freeze cols N`
@@ -54,16 +55,16 @@
5455

5556
### Pre-built binaries (GitHub Releases)
5657

57-
Download a binary for your platform from the [v0.1.21 release](https://github.com/okt4v/ASAT/releases/tag/v0.1.21):
58+
Download a binary for your platform from the [v0.1.22 release](https://github.com/okt4v/ASAT/releases/tag/v0.1.22):
5859

5960
| Platform | Link |
6061
|----------|------|
61-
| Linux x86_64 (glibc) | [asat-x86_64-unknown-linux-gnu.tar.gz](https://github.com/okt4v/ASAT/releases/download/v0.1.21/asat-x86_64-unknown-linux-gnu.tar.gz) |
62-
| Linux x86_64 (musl) | [asat-x86_64-unknown-linux-musl.tar.gz](https://github.com/okt4v/ASAT/releases/download/v0.1.21/asat-x86_64-unknown-linux-musl.tar.gz) |
63-
| Linux aarch64 | [asat-aarch64-unknown-linux-gnu.tar.gz](https://github.com/okt4v/ASAT/releases/download/v0.1.21/asat-aarch64-unknown-linux-gnu.tar.gz) |
64-
| macOS arm64 | [asat-aarch64-apple-darwin.tar.gz](https://github.com/okt4v/ASAT/releases/download/v0.1.21/asat-aarch64-apple-darwin.tar.gz) |
65-
| macOS x86_64 | [asat-x86_64-apple-darwin.tar.gz](https://github.com/okt4v/ASAT/releases/download/v0.1.21/asat-x86_64-apple-darwin.tar.gz) |
66-
| Windows x86_64 | [asat-x86_64-pc-windows-msvc.zip](https://github.com/okt4v/ASAT/releases/download/v0.1.21/asat-x86_64-pc-windows-msvc.zip) |
62+
| Linux x86_64 (glibc) | [asat-x86_64-unknown-linux-gnu.tar.gz](https://github.com/okt4v/ASAT/releases/download/v0.1.22/asat-x86_64-unknown-linux-gnu.tar.gz) |
63+
| Linux x86_64 (musl) | [asat-x86_64-unknown-linux-musl.tar.gz](https://github.com/okt4v/ASAT/releases/download/v0.1.22/asat-x86_64-unknown-linux-musl.tar.gz) |
64+
| Linux aarch64 | [asat-aarch64-unknown-linux-gnu.tar.gz](https://github.com/okt4v/ASAT/releases/download/v0.1.22/asat-aarch64-unknown-linux-gnu.tar.gz) |
65+
| macOS arm64 | [asat-aarch64-apple-darwin.tar.gz](https://github.com/okt4v/ASAT/releases/download/v0.1.22/asat-aarch64-apple-darwin.tar.gz) |
66+
| macOS x86_64 | [asat-x86_64-apple-darwin.tar.gz](https://github.com/okt4v/ASAT/releases/download/v0.1.22/asat-x86_64-apple-darwin.tar.gz) |
67+
| Windows x86_64 | [asat-x86_64-pc-windows-msvc.zip](https://github.com/okt4v/ASAT/releases/download/v0.1.22/asat-x86_64-pc-windows-msvc.zip) |
6768

6869
Extract the archive and place the `asat` binary somewhere on your `$PATH` (e.g. `~/.local/bin/`).
6970

@@ -85,7 +86,7 @@ brew install asat
8586
### Debian / Ubuntu (apt)
8687

8788
```bash
88-
curl -LO https://github.com/okt4v/ASAT/releases/download/v0.1.21/asat_0.1.21-1_amd64.deb
89+
curl -LO https://github.com/okt4v/ASAT/releases/download/v0.1.22/asat_0.1.21-1_amd64.deb
8990
sudo apt install ./asat_0.1.21-1_amd64.deb
9091
```
9192

@@ -308,6 +309,7 @@ Tab-completion works in command mode — press `Tab` to cycle through matching c
308309
| `:unmerge` | Unmerge the merged region under the cursor |
309310
| `:wrap` / `:ww` | Toggle line wrap on current cell or selection |
310311
| `:help` / `:h` | Open full-screen searchable help (Keybindings + Formulas tabs) |
312+
| `:home` | Return to the welcome / home screen |
311313
| `:plugins` | Open plugin manager TUI |
312314

313315
---
@@ -347,10 +349,11 @@ Start any cell with `=` to write a formula. Formulas re-evaluate automatically a
347349

348350
| Syntax | Meaning |
349351
|--------|---------|
350-
| `A1` | Relative cell reference |
351-
| `$A$1` | Absolute cell reference |
352+
| `A1` | Relative cell reference (adjusts on paste) |
353+
| `$A$1` | Absolute cell reference (fixed on paste) |
354+
| `$A1` / `A$1` | Mixed reference (lock column or row only) |
352355
| `A1:B10` | Range |
353-
| `Sheet2.C4` | Cross-sheet reference |
356+
| `Sheet2!C4` | Cross-sheet reference |
354357

355358
**Interactive reference picking:** While editing a formula, press `Ctrl+R` to enter F-REF mode. Navigate with `hjkl`/arrows. Press `v` (or `:`) to anchor a range start, then move to the end cell and press `Enter` to insert the range reference (e.g. `A1:C5`). Press `Enter` without anchoring to insert a single cell reference. Press `Esc` to cancel. The formula bar continues to show your in-progress formula throughout.
356359

0 commit comments

Comments
 (0)