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.3.tar.gz (240.6 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.3-py3-none-any.whl (18.2 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: esprit-0.2.3.tar.gz
  • Upload date:
  • Size: 240.6 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.3.tar.gz
Algorithm Hash digest
SHA256 0f406a4f31c55018a239e197901f9d2b35446c92c6cf3e6d805f4e7eca888ffb
MD5 8f723560a06780d2068e9bdea0413b17
BLAKE2b-256 75743170d64a159e0e2423b2e114ae48947d04b9761c1c0ae1009464b2e55d9d

See more details on using hashes here.

File details

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

File metadata

  • Download URL: esprit-0.2.3-py3-none-any.whl
  • Upload date:
  • Size: 18.2 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.3-py3-none-any.whl
Algorithm Hash digest
SHA256 9a9651c54c6e649d8f90d6036aa44058b36966a5af1df8a00b35813015b86778
MD5 bf05949bc211df1e01f991ead8907b35
BLAKE2b-256 8c3fc1c00691c965b9c4138fc9f7b9863566af7ca4f0e3c8e95717717b584a9a

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