turbo-editors/turbo-pythonpublic Fork 0
v1.0.0
Commits
Clone
git clone https://git.rickub.com/turbo-editors/turbo-python.git
git clone ssh://git@rickub.com/turbo-editors/turbo-python.git

Host key fingerprint (ed25519): SHA256:iycHnxEyq0Q7uyVpB7JlznP0G7JrTPXLYRcAU5CSLhc — verify it before your first connect.

README.md · 115 lines · 9.6 KBmarkdown Blame HistoryRaw
📦 Turbo Python 6fc62ea k33g 8h ago1# turbo-python
2
3A Turbo C-style editor for Python, written in Go.
4
5Built on **[turbo-core](https://rickub.com/turbo-editors/turbo-core)**, the library every Turbo editor shares. What is in this repository is the command, the profile that says this editor is for Python, and the Python scanner — about seven hundred lines. Everything else lives in the library.
6
7A full-screen terminal IDE with the Borland furniture — a menu bar with hot keys, movable windows that cast shadows, modal dialogs, a clickable status bar — and the things a Python editor needs today: syntax colouring that carries triple-quoted strings across lines and tells a constant from a class, loadable colour themes, completion and diagnostics from `pylsp`, shell windows, per-project settings, a project tree, snippets, and the uv toolchain a menu away.
8
9```
10 File Edit Search Run Code Options Window Snippets Python Help
11╔═[x]═════════════════════════════ shapes.py ═══════════════════════════════1═[■]╗
12║ 1 """A demo module.""" ▲║
13║ 2 from abc import ABC, abstractmethod ▓║
14║ 3 ░║
15║ 4 ░║
16║ 5 class Shape(ABC): ░║
17║ 6 @abstractmethod ░║
18║ 7 def area(self) -> float: ... ░║
19║ 8 ░║
20║ 9 MAX_SIDES = 0x1f_ff ▼║
21║◄▓░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░►║
22╚════════════════════════════════════════════════════════════════════════════════╝
23 F1 Describe F2 Save F3 Open F6 Window F7 Next F10 Menu 1:1 LSP: ready
24```
25
26## Getting started
27
28```bash
29make install
30```
31
32That builds the editor, puts it where your shell looks for commands, and reports what it found — the Go version it built with, where the binary went, whether that directory is on your `PATH`, and whether `pylsp` is installed. Then, from any Python project:
33
34```bash
35turbo-python main.py
36```
37
38To build without installing, `make build` leaves the binary in `bin/turbo-python`. From the module proxy instead of a checkout: `go install rickub.com/turbo-editors/turbo-python@latest`.
39
40For completion and diagnostics, install the Python language server as well — the editor works without it, and says so on the status bar:
41
42```bash
43pipx install "python-lsp-server[all]"
44```
45
46The `[all]` is not optional if you want the gutter to show anything: the linters that produce diagnostics are extras, and without them the server has nothing to report.
47
48The [tutorial](docs/en/tutorials/getting-started.md) walks through a first session in about ten minutes.
49
50## Features
51
52- **Every build knows what it is** — `turbo-python -version` and **Help ▸ About** name the version, the commit and the build date, stamped in by the linker from `git describe` rather than read from a constant somebody forgot to bump
53- **Turbo Vision interface** — menu bar with `Alt`-letter hot keys, overlapping movable and resizable windows, modal dialogs, mouse support throughout
54- **Syntax colouring for nine languages** — Python by a hand-written scanner that carries triple-quoted strings and line continuations exactly, knows all six string prefixes, and separates `SCREAMING_SNAKE_CASE` constants from `CapWords` classes; plus TOML, YAML, Markdown, JavaScript, HTML, XML, Dockerfiles and shell scripts from turbo-core
55- **Themes** in TOML, eleven embedded — Borland navy, dark grey, paper white, espresso, Catppuccin Frappé and Latte, cobalt, Darcula and IntelliJ Light, and a hueless monochrome in both polarities — and any number of your own, with inheritance between files and between style keys. Every shipped theme is held to its contrast by tests
56- **Per-project settings** in `.turbo-python/settings.toml` — pin a theme, turn on automatic saving — created from a menu item, never by itself, and re-read on every save so a change takes effect without a restart
57- **Completion, hover, go-to-definition, references and diagnostics** from `pylsp`, entirely optional. The server is looked for in the active virtual environment, `~/.local/bin`, pyenv's shims and macOS' per-version script directories as well as on `PATH`
58- **Terminal windows** — `F8` opens a real shell in a window, with its own VT/ANSI emulator, scrollback and job control (Linux, macOS and Windows)
59- **Project tree** — `F9` shows the project's files in a window; walk it with the arrows and press Enter to open one
60- **Snippets** — a `Snippets` menu built from `.turbo-python/snippets.toml`, grouped into submenus and filtered by the file you are in; the chosen text is inserted at the cursor, re-indented to match — which in Python is a correctness matter and not a nicety
61- **The uv toolchain a menu away** — `Alt-P` runs `uv venv`, `uv sync`, `ruff format`, `ruff check`, `pytest` and your script from `.turbo-python/tools.toml`, each showing its output where the tool asked: a popup that fills in as it goes, a terminal window, or an editing window to search. Files the command rewrote are re-read for you, and a tool naming a `menu` of its own gets that menu on the bar
62- **Editing** with word movement, block indent, a shared clipboard, and undo that merges a run of typing into one step
63- **Faithful files** — line endings and the trailing newline are preserved, and saving is atomic
64- **Automatic saving**, off by default, writing a short while after you stop typing
65
66## Commands
67
68| Command | What it does |
69| --- | --- |
70| `make install` | Build and install onto your `PATH` |
71| `make build` | Compile into `bin/turbo-python` |
72| `make test` | Run the whole test suite |
73| `make check` | `fmt`, `vet`, then the tests — what a commit should pass |
74| `make run FILE=x.py` | Build and start the editor on a file |
75| `make help` | List every target |
76
77```bash
78turbo-python [-theme name] [-no-lsp] [file...]
79turbo-python -list-themes
80```
81
82## Documentation
83
84Full documentation in **[English](docs/en/)** and **[French](docs/fr/)**, organised by the [Diátaxis](https://diataxis.fr) method:
85
86| | |
87| --- | --- |
88| **Tutorial** | [Your first file in Turbo Python](docs/en/tutorials/getting-started.md) |
89| **How-to** | [install](docs/en/how-to/install.md) · [run the tests](docs/en/how-to/run-the-tests.md) · [enable completion](docs/en/how-to/enable-completion.md) · [write a theme](docs/en/how-to/write-a-theme.md) · [move around a file](docs/en/how-to/navigate-code.md) · [ask about code](docs/en/how-to/ask-about-code.md) · [use a terminal](docs/en/how-to/use-a-terminal.md) · [configure a project](docs/en/how-to/configure-a-project.md) · [browse a project](docs/en/how-to/browse-a-project.md) · [use snippets](docs/en/how-to/use-snippets.md) · [run uv commands](docs/en/how-to/run-uv-commands.md) · [make a release](docs/en/how-to/make-a-release.md) |
90| **Reference** | [command line](docs/en/reference/cli.md) · [keyboard](docs/en/reference/keyboard.md) · [menus](docs/en/reference/menus.md) · [theme format](docs/en/reference/themes.md) · [terminal windows](docs/en/reference/terminal.md) · [project settings](docs/en/reference/project-settings.md) · [project tree](docs/en/reference/project-tree.md) · [languages](docs/en/reference/languages.md) · [snippets](docs/en/reference/snippets.md) · [Python tools](docs/en/reference/python-tools.md) · [the version number](docs/en/reference/versioning.md) |
91| **Explanation** | [architecture](docs/en/explanation/architecture.md) · [design decisions](docs/en/explanation/design-decisions.md) · [colouring and completion](docs/en/explanation/colouring-and-completion.md) · [terminal windows](docs/en/explanation/terminal-windows.md) · [project settings](docs/en/explanation/project-settings.md) · [project tree](docs/en/explanation/project-tree.md) · [snippets](docs/en/explanation/snippets.md) · [Python tools](docs/en/explanation/python-tools.md) |
92
93The library's packages each carry their own `README.md` beside the code, in [turbo-core](https://rickub.com/turbo-editors/turbo-core).
94
95## Where the code is
96
97| | |
98| --- | --- |
99| `main.go` | flags, the terminal, the wiring |
100| `internal/pythonlang` | the profile, the Python scanner, the three starter files |
101| everything else | [turbo-core](https://rickub.com/turbo-editors/turbo-core) |
102
103The dependency graph is drawn in [`docs/diagrams/packages.drawio`](docs/diagrams/packages.drawio), checked against `go list` by `diagram_test.go`.
104
105## Design in one line
106
107Two dependencies — `tcell/v2` and `BurntSushi/toml` — and everything else from the standard library, including the scanner toolkit and the Language Server Protocol client. Both come through turbo-core; this repository adds none of its own. The [design decisions](docs/en/explanation/design-decisions.md) page explains why.
108
109## Requirements
110
111Go 1.26 or later to build it — the editor is written in Go even though it is an editor for Python. A terminal with mouse reporting, which is all of them. `pylsp` is optional.
112
113## Licence
114
115See [LICENSE](LICENSE).