Skip to main content

Show HN: A terminal spreadsheet editor with Vim keybindings

Show HN: A terminal spreadsheet editor with Vim keybindings

Show HN: A terminal spreadsheet editor with Vim keybindings

Did you know that more than 70 % of data‑driven professionals spend at least an hour a day switching between a spreadsheet and a terminal? Imagine editing cells, running VLOOKUP or XLOOKUP formulas, and navigating rows with the speed of Vim—without ever leaving the command line. Meet Cell, the open‑source terminal spreadsheet that brings the full power of Excel into your favorite shell.

Why a Terminal‑Based Spreadsheet Matters for Excel Users

First off, speed beats everything. The ability to type instead of click means you keep your hands on the keyboard and your mind on the data. Vim motions—h, j, k, l, w, b, 0, $—let you traverse a spreadsheet in milliseconds, while the mouse would drag you around like a toddler.
Second, the cross‑platform consistency is a game‑changer. Whether you’re on Linux, macOS, or Windows via WSL, the same keybindings and look will greet you. No need to learn a new UI for each OS.
Third, automation‑ready. Terminal spreadsheets fit naturally into awk, sed, Python, or any language you trust. You can pipe a CSV through a sed filter, load it into Cell, run a VLOOKUP, then pipe the output to a reporting script—all in one line. It’s pretty much the holy grail of data workflow.

Getting Started: Installing and Launching Cell

  • Prerequisitesgit and Rust’s cargo are your best friends. If you prefer, grab a pre‑built binary from the releases page.
  • One‑line installcargo install cell or wget https://github.com/cell/cli/releases/latest/download/cell-linux-amd64 -O /usr/local/bin/cell && chmod +x /usr/local/bin/cell.
  • Launchcell mydata.csv opens a CSV, cell -n starts a brand‑new workbook. If you’re on Windows, cell.exe works the same way.

Core Excel‑Like Features in the Terminal

Now, let’s talk features. Cell is built to feel like Excel while staying lightweight.

  • Cell editing & navigation – Think Vim motions plus :set style commands. i enters insert mode, Esc returns to navigation, gg goes to the top, G to the bottom. Pretty much everything you know from Excel feels natural.
  • Formula engine – The same =SUM, =AVERAGE, =VLOOKUP, =XLOOKUP you’re used to. Under the hood, it’s Rust, so performance is top‑notch. Plus, you can drop in your own Rust or Lua functions—more on that later.
  • Real‑time filter & sort:filter A:A "Active" or :sort B asc mimics Excel’s Data tab. The results update instantly, and you can even chain filters.

Practical Walkthrough: Building a Dynamic Lookup Table

Let’s get our hands dirty. Suppose you have a CSV of product IDs and prices, products.csv:

SKU,Price
A100,19.99
B200,29.99
C300,39.99

Open it: cell products.csv. Now create a new sheet for the lookup table: :sheet add lookup (or simply :t new lookup if you prefer). In the first cell, type =XLOOKUP(A2, 'products.csv'!A:B, 2, FALSE). Drag the formula down. Every time you change A2 to a new SKU, the price updates instantly. Save the file, cell -o report.csv, and pipe it to a shell script that emails the results. The whole thing runs in the terminal—no GUI needed.

Actionable Takeaways & Next Steps

  • Checklist – Replace your daily Excel copy‑paste loops with cell commands.
    • Use cell -n for fresh starts.
    • Keep your CSVs tidy; cell loves plain text.
    • Leverage :filter to clean data before calculations.
  • Git integration – Treat your spreadsheet as code. Commit *.csv files to a repo, use git diff --color-words to see changes, and roll back if a formula goes awry.
  • Extending Cell – Write a Rust plugin for a custom function. The snippet below shows a simple DOUBLE UDF. Build it, drop it into $HOME/.cell/plugins, restart cell, and you’re good to go.
use cell::prelude::*;

/// Double the numeric value of the given cell.
fn double(args: Vec) -> Result {
    let num = args[0].as_f64()?;          // Convert first argument to f64
    Ok(Value::Number(num * 2.0))         // Return doubled value
}

fn main() -> Result<(), CellError> {
    // Register the function under the name "DOUBLE"
    register_function("DOUBLE", 1, double);
    // Launch the editor (or run in headless mode)
    cell::run()
}

That’s it. You can now type =DOUBLE(B3) and instantly double any numeric entry—just like a custom Excel macro, but native to the terminal environment.

Frequently Asked Questions

Q1: How does Cell’s formula syntax compare to Excel’s?

A: Cell uses a familiar function‑first syntax (=SUM(A1:A10), =XLOOKUP(A2, B:B, C:C)) while allowing native Rust expressions for advanced calculations, so Excel users feel at home with a powerful extension.

Q2: Can I open an existing .xlsx file directly in Cell?

A: Not yet; Cell works with plain‑text formats (CSV, TSV). Convert the workbook with xlsx2csv or Excel’s “Save As → CSV” before loading it into Cell.

Q3: Is it possible to use Cell on a remote server via SSH?

A: Absolutely. Because Cell runs in the terminal, you can SSH into any Linux box, launch cell, and edit spreadsheets without a graphical interface.

Q4: How do I perform a VLOOKUP that spans multiple sheets in Cell?

A: Load each sheet as a separate file, then reference them with the sheet!cell syntax, e.g., =VLOOKUP(A2, 'prices.csv'!B:C, 2, FALSE).

Q5: Will my macros or VBA scripts work in Cell?

A: No. Cell does not support VBA, but you can replicate most automation with Rust plugins or external shell scripts that read/write CSVs.


Related reading: Original discussion

What do you think?

Have experience with this topic? Drop your thoughts in the comments - I read every single one and love hearing different perspectives!

Comments

Popular posts from this blog

2026 Update: Getting Started with SQL & Databases: A Comp...

Low-Code Isn't Stealing Dev Jobs — It's Changing Them (And That's a Good Thing) Have you noticed how many non-tech folks are building Mission-critical apps lately? Honestly, it's kinda wild — marketing tres creating lead-gen tools, ops managers deploying inventory systems. Sound familiar? But here's the deal: it's not magic, it's low-code development platforms reshaping who gets to play the app-building game. What's With This Low-Code Thing Anyway? So let's break it down. Low-code platforms are visual playgrounds where you drag pre-built components instead of hand-coding everything. Think LEGO blocks for software – connect APIs, design interfaces, and automate workflows with minimal typing. Citizen developers (non-IT pros solving their own problems) are loving it because they don't need a PhD in Java. Recently, platforms like OutSystems and Mendix have exploded because honestly? Everyone needs custom tools faster than traditional codin...

Practical Guide: Getting Started with Data Science: A Com...

Laravel 11 Unpacked: What's New and Why It Matters Still running Laravel 10? Honestly, you might be missing out on some serious upgrades. Let's break down what Laravel 11 brings to the table – and whether it's worth the hype for your PHP framework projects. Because when it comes down to it, staying current can save you headaches later. What's Cooking in Laravel 11? Laravel 11 streamlines things right out of the gate. Gone are the cluttered config files – now you get a leaner, more focused starting point. That means less boilerplate and more actual coding. And here's the kicker: they've baked health routing directly into the framework. So instead of third-party packages for uptime monitoring, you've got built-in /up endpoints. But the real showstopper? Per-second API rate limiting. Remember those clunky custom solutions for throttling requests? Now you can just do: RateLimiter::for('api', function (Request $ 💬 What do you think?...

Expert Tips: Getting Started with Data Tools & ETL: A Com...

{"text":""} 💬 What do you think? Have you tried any of these approaches? I'd love to hear about your experience in the comments!