ccm — cacamacs
A small terminal text editor with Emacs key bindings, built on the
gtcaca libcaca TUI toolkit and its
editor widget. It shows off the widget's colourization, folding, annotations,
autocompletion, search/replace and a VSCode-style language-extension model.
ccm [file | directory] [language-configuration.json]
- A file opens in the editor.
- A directory opens the file browser (also
C-x d). - An optional explicit
language-configuration.jsonforces that config.
It also has a diagram mode (M-x diagram): a drag-and-drop canvas for ASCII
diagrams. Pick a shape from the pane on the left — box, rounded, diamond,
circle, ellipse, cloud, cylinder, hexagon, actor or free text — drop it on the
canvas with the mouse or the keyboard, link any two by clicking one then the
other, draw plain lines and freehand strokes, rub out single characters with the
eraser, and colour or dash anything. Leaving drops the finished art into your
document at the cursor — plain characters, saved with C-x C-s like anything
else — and C-w keeps a .drawio copy that preserves the colours.
+-------+ .-----------.
O / \ |'---------'|
/|\ +------>+ ok? +----------->| store |
/ \ -----+ \ / | |
user +-------+ '-----------'
See docs/README-cacamacs.md for the full key-binding reference and feature tour.
History. ccm started life as
apps/cacamacsinside the gtcaca repo, where a copy remains as a worked example of building an app on the toolkit. Active development now happens here, against gtcaca as an ordinary external dependency.
Copy and paste are the system's: C-w/M-w put text on the macOS, Windows or
Linux clipboard (and on the terminal's, via OSC 52, so it works over ssh), and
C-y yanks whatever another application copied. Large pastes arrive as a single
edit rather than as thousands of keystrokes.
Install with pip
Prebuilt binaries are published to PyPI for macOS (Apple Silicon), Linux (x86_64) and Windows (x86_64) — no compiler or Homebrew needed:
pip install cacamacs
ccm # or: cacamacs
PyPI is used purely as a binary channel (as ruff/cmake/ninja do): the
wheel carries the compiled ccm and the libgtcaca/libcaca/oniguruma
libraries it needs, made relocatable, plus the sample language extensions so
syntax highlighting works out of the box. See packaging/ for how
the per-platform wheels are built (packaging/build.sh → packaging/wheel.py,
wired up in .github/workflows/release.yml, which publishes on a v* tag).
Building
ccm consumes gtcaca like any third party would: install gtcaca first, then
build ccm against it. gtcaca ships a gtcaca.pc, so pkg-config finds it.
# 1. install gtcaca (any one of these):
brew install stricaud/tap/gtcaca # Homebrew tap
# …or from a gtcaca checkout: cmake -S . -B build && cmake --build build && sudo cmake --install build
# 2. build ccm
cmake -S . -B build
cmake --build build
# 3. run it
./run.sh # builds if needed, then runs build/ccm
./run.sh path/to/file
Requirements: a C compiler, CMake ≥ 3.20, pkg-config, and an installed
gtcaca (which pulls in libcaca).
Installing
sudo cmake --install build # → /usr/local/bin/ccm, share/ccm/ccm-theme.example
Self-contained macOS package
scripts/package-macos.sh builds a .pkg that bundles libgtcaca and
libcaca alongside ccm (rewritten to @rpath), so the installed editor needs
neither Homebrew nor a system gtcaca:
scripts/package-macos.sh # → ccm-<version>.pkg
Its postinstall seeds ~/.ccm/theme from the bundled sample (never clobbering
an existing one).
Configuration
- Colour theme — copy docs/ccm-theme.example to
~/.ccm/theme. Comments in the file explain every key. - Editor config — copy examples/config.json to
~/.cacamacs/config.jsonfor tab size, indent, per-language overrides. - Language extensions — the VSCode-style grammar/config bundles under examples/extensions/ drive syntax colourization.
Layout
src/ editor sources (cacamacs.c, ui.c, edit.c, search.c, …)
diagram.c / diagram_model.c — M-x diagram (mode / document)
docs/ feature docs + the colour-theme sample
examples/ config sample and language extensions
packaging/ cross-platform bundles + pip wheels (build.sh → wheel.py)
scripts/ macOS packaging
CMakeLists.txt standalone build (finds gtcaca via pkg-config)
run.sh build-and-run helper
License
Released into the public domain under the Unlicense — do whatever you want with it.
Release files for cacamacs 0.0.9
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Built distributions (wheels)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| cacamacs-0.0.9-py3-none-win_amd64.whl | Python 3 | none | Windows x86-64 | Details |
| cacamacs-0.0.9-py3-none-manylinux_2_35_x86_64.whl | Python 3 | none | Linux glibc 2.35+ x86-64 | Details |
| cacamacs-0.0.9-py3-none-macosx_14_0_arm64.whl | Python 3 | none | macOS 14.0+ ARM64 | Details |
Total release size: 3.8 MB
Release files / cacamacs-0.0.9-py3-none-win_amd64.whl
| Download URL | cacamacs-0.0.9-py3-none-win_amd64.whl |
|---|---|
| Size | 1.2 MB |
| Tags | Python 3 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
2f3b88707da077a8918329e9d237bdfa7dad7d7d2e2af3d643263f5956f74eb8
|
|
BLAKE2b-256 checksum How to use checksums |
23125f1ad284c3700ed910df9c10f3da77b7d1e18538524ee482ea1ec7e80313
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jul 31, 2026.
Transparency logRelease files / cacamacs-0.0.9-py3-none-manylinux_2_35_x86_64.whl
| Download URL | cacamacs-0.0.9-py3-none-manylinux_2_35_x86_64.whl |
|---|---|
| Size | 1.9 MB |
| Tags | Linux glibc 2.35+ x86-64 Python 3 |
|
SHA-256 checksum How to use checksums |
1125fba2178feac9ea604b9c6643fe85e2bc4f703076fe81f9ff2c90b65c6a83
|
|
BLAKE2b-256 checksum How to use checksums |
d57e05436c0af5ad556ad78b153baca1c2c11c5710ad55ee67700780762c1cb3
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jul 31, 2026.
Transparency logRelease files / cacamacs-0.0.9-py3-none-macosx_14_0_arm64.whl
| Download URL | cacamacs-0.0.9-py3-none-macosx_14_0_arm64.whl |
|---|---|
| Size | 695.5 kB |
| Tags | Python 3 macOS 14.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
8fcaac9f266d4619a83474b05d1e35947ca4059224ac1e20f8bf4c7bfa688fe2
|
|
BLAKE2b-256 checksum How to use checksums |
b69743ad3e96407a94adc9f27241bab27e22df7c6c54076015f128d12406a7f4
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jul 31, 2026.
Transparency log