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.0.tar.gz (160.1 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.0-py3-none-any.whl (12.4 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: esprit-0.2.0.tar.gz
  • Upload date:
  • Size: 160.1 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.0.tar.gz
Algorithm Hash digest
SHA256 dcc9f84d853cf1ad0a172d9babc466556ce0d64abf331dfbf1e8814fcc628f84
MD5 f79940a74a9329ae89b972c02020ea43
BLAKE2b-256 8df74bb90f98d9bf032f7dca8ca705bced2dd4b6544ad6b5aecdb58adce18b53

See more details on using hashes here.

File details

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

File metadata

  • Download URL: esprit-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 12.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.0-py3-none-any.whl
Algorithm Hash digest
SHA256 d1ee7676f27baddee26b057c79775ca6a8c3415188126163b09f33c051ed3cc7
MD5 509b036351c3257615dca16634753c87
BLAKE2b-256 f98e45116f12a8b122304465ae9960064d492c133d1cca616155aa1f7d891679

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