Sheets
Spreadsheets in your terminal — CSV を Vim 風に編集する Go 製 TUI(maaslalani/sheets)
Sheets は、ターミナル上で CSV を表計算のように開き、Vim 風キーバインドでセルを移動・編集・検索できる TUI アプリ。同じバイナリから、シェルスクリプト向けの非対話 CLI(セル参照・範囲出力・一括代入)も呼び出せる。
データはメモリ上の map[cellKey]string に保持し、保存時に CSV へ書き戻す。存在しないファイルパスを指定した場合は空シートとして起動し、:w で新規作成できる。
引数が 2 個以上(ファイル + 操作)のときは TUI を起動せず runCLI が走る。1 個以下なら Bubble Tea の対話セッションになる。stdin から CSV を渡す場合は TTY が別途必要。
flowchart TD
Args["sheets 引数"] --> Opt{"-h / -v ?"}
Opt -->|yes| Help["ヘルプ / バージョン出力"]
Opt -->|no| Count{"len(args) > 1 ?"}
Count -->|yes| CLI["runCLI: 参照・代入・保存"]
Count -->|no| TUI["Bubble Tea TUI"]
TUI --> File["ファイル / stdin から CSV 読込"]
CLI --> Query["セル・範囲を stdout へ"]
CLI --> Write["cell=value で更新後 :w 相当保存"]
対話起動
sheets budget.csv
sheets <<< $'ID,Name,Age\n1,Alice,24'
cat budget.csv | sheets
非対話クエリ・更新
sheets budget.csv B9 # 単一セル
sheets budget.csv B1:B3 # 範囲(行ごとに出力)
sheets budget.csv B7=10 B8=20 # 代入してファイル保存
状態は normalMode / insertMode / selectMode / コマンドライン(:)の 4 系統。検索は /・? で別プロンプト種別として扱う。
移動(抜粋)
| キー | 動作 |
|---|---|
| h j k l | セル移動 |
| gg / G / 5G | 先頭行・末尾行・指定行 |
| gB9 | セル参照へ直接ジャンプ |
| 0 / ^ / $ | 行の先頭列・最初の非空列・最終非空列 |
| / ? n N | 前方・後方検索と繰り返し |
| ma / 'a | マーク設定・ジャンプ |
| ctrl+o / ctrl+i | ジャンプ履歴の戻る・進む |
編集・Undo
- dd で行削除、o / O で行挿入して INSERT へ。
- u / ctrl+r / U で undo・redo・行単位 undo。
- レジスタ("a 等)と . による変更の繰り返しをサポート。
- ビジュアルモードで = を押すと、選択範囲を参照する数式を挿入(例:
=SUM(B1:B8))。
エントリは薄い main.go で、実装の大半は internal/sheets に集約。Charm の Bubble Tea・Lip Gloss で描画し、model が状態を一元管理する。
| ファイル | 責務 |
|---|---|
main.go | CLI/TUI 分岐、CSV 読込、クエリ出力、Main エントリ |
model.go | セルマップ、選択・オフセット、undo スタック、スタイル定義 |
normal_mode.go / edit_mode.go / select_mode.go | 各モードのキー処理 |
commands.go | : コマンドプロンプト(保存・読込・goto) |
navigate.go / search.go | 移動・検索 |
render.go | グリッド・ステータスバー・コマンドライン描画 |
formula.go | = 始まりの式評価・集計関数 |
clipboard.go | ヤンク・レジスタ・ペースト |
dsv.go / markdown.go | 区切り文字付き入出力・Markdown 連携 |
デフォルト行数は 999、最大 50,000 行。列は A–AZ(52 列)。セル参照はスプレッドシート慣習の B9 形式。
セル値が = で始まる場合、表示時に formula.go のパーサが評価する。循環参照は #CYCLE、その他のエラーは #ERR として表示。
| 関数 | 説明 |
|---|---|
SUM | 範囲の合計 |
AVG | 平均 |
MIN / MAX | 最小・最大 |
COUNT | 数値セルの個数 |
CLI でセルをクエリするとき、式セルは計算結果の文字列が返る(生の =... ではない)。代入時に単一値を範囲へ貼ると、数式内の相対参照がオフセット付きで複製される。
| 方法 | コマンド / リンク |
|---|---|
| Homebrew | brew install sheets |
| Go install | go install github.com/maaslalani/sheets@main |
| バイナリ | GitHub Releases |
リポジトリには Nix flake(flake.nix)と GoReleaser 設定も含まれる。サンプル CSV は examples/budget.csv。
- GitHub: maaslalani/sheets — ソース・Issues
- README.md — CLI 例とキーバインド一覧
- Releases — 配布バイナリ
- Charm — Bubble Tea / Lip Gloss エコシステム