Skip to main content

A terminal IDE with emacs keybindings, built on Textual — editor, file tree, markdown preview, and a real PTY terminal

Project description

candat

A terminal IDE with emacs keybindings, built on Textual.

Install

From PyPI, as a standalone tool (recommended — gives you a global candat command in its own isolated environment):

uv tool install candat
# or, with pipx (needs Python >= 3.10):
pipx install candat

Or with plain pip into the environment of your choice: pip install candat. To try it once without installing anything permanently: uvx candat.

The development version installs straight from GitHub:

uv tool install git+https://github.com/kavonrtep/candat

Requires Python >= 3.10 and Linux.

Run

candat [FILE|DIR ...]

Passing a directory sets the file-tree root; files are opened in buffers.

Keys (so far)

Key Action
C-x C-f find file (opens new file if it doesn't exist)
C-x C-s save buffer
C-x C-w write buffer to another file
C-x C-q toggle read-only (status bar shows %%)
C-x w toggle soft wrap for this buffer
C-x C-r open a file read-only
C-x k kill buffer
C-x b buffer list (Enter switches; next buffer preselected)
C-x o switch focus between tree and editor
C-x C-c quit (confirms if unsaved buffers)
C-x C-x exchange point and mark
C-x h mark whole buffer
C-x u, C-/, C-z undo
C-f C-b C-n C-p C-a C-e char/line movement
M-f M-b word movement
C-v M-v page down / up
M-< M-> beginning / end of buffer
C-space set mark (movement extends region)
C-k kill line (consecutive kills accumulate)
C-w / M-w kill / copy region
C-y / M-y yank / yank-pop
M-d / M-backspace kill word forward / backward
M-up / M-down move current line (or marked block) up / down
C-s / C-r incremental search (smart case, wraps)
M-% query-replace (y/n/!/q)
C-x g project-wide regex search (results list, Enter jumps)
M-; toggle line comment
C-c C-c send region or current line to the terminal REPL
C-x t toggle terminal panel (keys pass through raw; only C-x is reserved)
Shift+PgUp/PgDn terminal scrollback (typing snaps back)
C-c C-v cycle markdown preview: split / preview-only / off
M-x, Ctrl+Shift+P command palette
C-g / Esc cancel chord / prompt / search / mark

ESC acts as the Meta prefix, so ESC w == M-w, ESC x == M-x, etc. Tab completes paths in the find-file and write-file prompts.

Open files are watched for external changes: clean buffers reload automatically; buffers with local edits ask before discarding them.

.csv and .tsv files open in a table viewer (inspired by csvlens): a sticky header, row cursor, and original file line numbers in the gutter. Large files stream in as you scroll rather than loading whole. In the table: / (or C-s) searches, n repeats, & filters rows by regex, g/G jump to top/bottom. C-c C-v switches between the table and the raw text. The table is read-only.

The file tree has a filter box on top: press / while the tree is focused (or click it), type to narrow the tree to files whose path matches, Esc clears it. The file tree opens files on selection. The default theme is candat-light (high-contrast dark-on-white). The markdown preview is linked: it follows the editor's scroll position.

Development

uv run pytest

Roadmap

  1. Skeleton: tree / tabs / status bar / C-x chords / open & save
  2. Emacs editing: kill ring, C-s/C-r isearch, mark & region, M-x palette
  3. Markdown mode: side-by-side live preview (debounced)
  4. Terminal panel (full PTY: forkpty + pyte)
  5. Polish: terminal scrollback, dirty-line rendering, path completion in prompts, buffer list, scroll-synced preview, R/xml/html highlighting

Syntax highlighting covers python, markdown, json, yaml, bash, html, xml, css, toml, js, sql, go, rust, java, R, and config formats — INI/.cfg/ .conf, Makefiles, Dockerfiles, and shell dotfiles (.bashrc, .env, …).

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

candat-0.6.0.tar.gz (33.5 kB view details)

Uploaded Source

Built Distribution

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

candat-0.6.0-py3-none-any.whl (43.2 kB view details)

Uploaded Python 3

File details

Details for the file candat-0.6.0.tar.gz.

File metadata

  • Download URL: candat-0.6.0.tar.gz
  • Upload date:
  • Size: 33.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.26 {"installer":{"name":"uv","version":"0.11.26","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for candat-0.6.0.tar.gz
Algorithm Hash digest
SHA256 ab322c641332f5de3776236ab67673aeb101cc7bfa41c2773b4590dbf5d6f8c1
MD5 c77508ca069cc0524e297f4716180db3
BLAKE2b-256 240e704bcfc85ab622234b484014874652be794340a7024e9577ddd7768f5b94

See more details on using hashes here.

File details

Details for the file candat-0.6.0-py3-none-any.whl.

File metadata

  • Download URL: candat-0.6.0-py3-none-any.whl
  • Upload date:
  • Size: 43.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.26 {"installer":{"name":"uv","version":"0.11.26","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for candat-0.6.0-py3-none-any.whl
Algorithm Hash digest
SHA256 7a67b8be6132deeb8b3b3a48d5332129405d0cf3546febc9878317967de11798
MD5 aaf79f0d60b1b8d8306f9f4ce762af26
BLAKE2b-256 6284cca8fe850428953f5df33358ec93adad987e06d09775f0fa371a3e53e67e

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