Sheets

Spreadsheets in your terminal — CSV を Vim 風に編集する Go 製 TUI(maaslalani/sheets)

1 — 概要

Sheets は、ターミナル上で CSV を表計算のように開き、Vim 風キーバインドでセルを移動・編集・検索できる TUI アプリ。同じバイナリから、シェルスクリプト向けの非対話 CLI(セル参照・範囲出力・一括代入)も呼び出せる。

Go実装言語
Bubble TeaTUI フレームワーク
52列A–AZ 相当
MITライセンス

データはメモリ上の map[cellKey]string に保持し、保存時に CSV へ書き戻す。存在しないファイルパスを指定した場合は空シートとして起動し、:w で新規作成できる。

2 — コマンドライン

引数が 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 # 代入してファイル保存
クエリ出力: 複数操作を渡すとブロックごとに CSV レコードが stdout へ連続出力される。カンマ区切りで横に並べる結合クエリもサポート。
3 — TUI 操作

状態は normalMode / insertMode / selectMode / コマンドライン(:)の 4 系統。検索は /・? で別プロンプト種別として扱う。

NORMAL移動・ヤンク・削除・モード切替。hjkl、gg/G、マーク、ジャンプリスト。
INSERTi / I / c で編集。Enter・Tab で確定して隣セルへ。
SELECTv / V で矩形・行選択。y / x / p でコピー・切り取り・貼り付け。
::w 保存、:e 別ファイル、:goto B9 ジャンプ、:q 終了。

移動(抜粋)

キー動作
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))。
4 — 内部構成

エントリは薄い main.go で、実装の大半は internal/sheets に集約。Charm の Bubble Tea・Lip Gloss で描画し、model が状態を一元管理する。

ファイル責務
main.goCLI/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 形式。

5 — 数式

セル値が = で始まる場合、表示時に formula.go のパーサが評価する。循環参照は #CYCLE、その他のエラーは #ERR として表示。

関数説明
SUM範囲の合計
AVG平均
MIN / MAX最小・最大
COUNT数値セルの個数

CLI でセルをクエリするとき、式セルは計算結果の文字列が返る(生の =... ではない)。代入時に単一値を範囲へ貼ると、数式内の相対参照がオフセット付きで複製される。

6 — インストール
方法コマンド / リンク
Homebrewbrew install sheets
Go installgo install github.com/maaslalani/sheets@main
バイナリGitHub Releases

リポジトリには Nix flake(flake.nix)と GoReleaser 設定も含まれる。サンプル CSV は examples/budget.csv。