Skip to main content

A minimal terminal-based spreadsheet editor

Project description

Esprit

A minimal terminal-based spreadsheet editor built with Python and Textual. Create, edit, and manage structured data tables with typed columns directly in your terminal.

Sometimes you want to take notes in a table.

Features

  • Terminal UI: Fast, keyboard-driven interface
  • Typed Columns: String, Number, Boolean, and URL column types
  • Row Operations: Insert, delete, and move rows with keyboard shortcuts
  • JSON Storage: Simple, readable JSON file format

Installation

Install esprit from PyPI:

pip install esprit

Or install from source:

git clone https://github.com/mkaz/esprit.git
cd esprit
pip install .

Requirements

  • Python 3.10 or higher

Usage

Starting Esprit

Launch with a new or existing file:

# Create or open a spreadsheet
esprit mydata.json

# Start with default empty spreadsheet
esprit

On first launch with a new file, you'll see the initialization dialog where you can:

  • Set the spreadsheet title
  • Define columns with names and types
  • Add or remove columns as needed

Column Types

  • String: Plain text values
  • Number: Numeric values with comma formatting
  • Boolean: True/False values displayed as ✓/✗
  • URL: Links with title and URL (format: Title | https://example.com)

Keyboard Shortcuts

Navigation

  • Arrow Keys: Move between cells

Editing

  • Enter: Edit current cell
  • Escape: Cancel editing

Row Operations

  • Ctrl+I: Insert empty row above current
  • Ctrl+K: Delete current row
  • Alt+Up: Move current row up
  • Alt+Down: Move current row down

File Operations

  • Ctrl+S: Save spreadsheet
  • Ctrl+Q: Quit (prompts to save if unsaved changes)

Special

  • Ctrl+Enter: Open URL in browser (when on URL column cell)

File Format

Esprit saves spreadsheets as JSON files:

{
  "metadata": {
    "title": "My Spreadsheet",
    "columns": [
      {"name": "Name", "type": "string"},
      {"name": "Amount", "type": "number"},
      {"name": "Active", "type": "boolean"},
      {"name": "Website", "type": "url"}
    ]
  },
  "rows": 20,
  "cols": 4,
  "cells": {
    "0,0": "Alice",
    "0,1": 1500,
    "0,2": true,
    "0,3": {"title": "Example", "url": "https://example.com"}
  }
}

License

MIT License - see LICENSE file for details

Contributing

Contributions welcome! Please open an issue or pull request on GitHub.

Links

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

esprit-0.2.2.tar.gz (202.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

esprit-0.2.2-py3-none-any.whl (13.4 kB view details)

Uploaded Python 3

File details

Details for the file esprit-0.2.2.tar.gz.

File metadata

  • Download URL: esprit-0.2.2.tar.gz
  • Upload date:
  • Size: 202.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.0

File hashes

Hashes for esprit-0.2.2.tar.gz
Algorithm Hash digest
SHA256 6cbe30dbf71d81cb162676b31eae1fe473a4b21577a219534a6635b640357b26
MD5 bfca4e27a61e93de274196cc13c060b6
BLAKE2b-256 08b97694e406d7b05327435f3baf8da36b8b156db2ab25d072f274090b1d481f

See more details on using hashes here.

File details

Details for the file esprit-0.2.2-py3-none-any.whl.

File metadata

  • Download URL: esprit-0.2.2-py3-none-any.whl
  • Upload date:
  • Size: 13.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.0

File hashes

Hashes for esprit-0.2.2-py3-none-any.whl
Algorithm Hash digest
SHA256 f39c938a77fa193c370f2d658a20f606d7ed3800bc4a6f4340862b1e30cae107
MD5 e1a8e3a032f59688425bc533d2a1666c
BLAKE2b-256 c7a44d7133b1d41494c3b21cf570697baf01a218f5e9217808ce5629beb3a1f1

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page