- Zig 94.1%
- Tree-sitter Query 2.9%
- Shell 1.6%
- Scheme 0.7%
- Python 0.7%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
| docs | ||
| examples | ||
| grammars | ||
| scripts | ||
| src | ||
| tests | ||
| tools | ||
| vendor | ||
| .devkit.conf | ||
| .gitattributes | ||
| .gitignore | ||
| build.zig | ||
| build.zig.zon | ||
| CLAUDE.md | ||
| context.md | ||
| DESIGN.md | ||
| LICENSE | ||
| quote.svg | ||
| README.md | ||
| RELEASING.md | ||
| TODO.md | ||
A Scheme/Lisp and s-expression code editor component, built in Zig.
It is a standalone editor app, but is also designed to be embedded
inside applications such as game engines and tools that already
have a dvui window.
Status: pre-1.0, and used day-to-day for its own development — any file type, not only Scheme. What is still in progress is the engine side: hot-reload into a host VM and inline value inspection. See DESIGN.md for the full feature map and current phase.
Highlights
- Modal editing in the Helix/Kakoune lineage — normal mode for movement and selection, insert mode for typing.
- Cross-file code intelligence over a tree-sitter symbol index:
g djumps to a definition,g rlists where a symbol is used,space kshows its documentation,space sfinds any definition in the project, and the completion popup ranks candidates from the same index with their signatures and docstrings. The index covers your code, Zig's standard library, and every dependencybuild.zig.zondeclares — no configuration — and it persists between sessions. - Tree-sitter–driven syntax highlighting + AST-aware indent. Scheme and
Markdown are built in; Zig, JSON and Python install at runtime from a
signed catalogue (
:packages), which also upgrades and removes them. - Scheme-aware paredit basics (auto-pair, skip-close, strict delete) and structural navigation
- Pickers for everything, all fuzzy-matched with previews: files, buffers, recent files, outline, project symbols, themes, packages, and a live workspace grep whose results re-search as you type
- Git-aware gutter: added/modified/removed bars, live against HEAD
- Scheme-defined keybindings, themes, and command-palette commands
(
src/keybindings.scm,src/themes.scm,src/commands.scm), layered with a userinit.scm - Multi-cursor editing, split views, jumplist, dot-repeat, selection undo/redo, count-prefixed motions
- Evaluate Scheme from the buffer into a
*repl*transcript (space efor the form at the cursor,space Efor the selection) - macOS app bundle (
zig build bundle), aquoteCLI that opens files in the running app,quote -wfor use as$EDITOR, and in-place self-update (:upgrade)
Build
Requires Zig 0.16.0 or newer. Earlier toolchains will fail at manifest validation.
main is self-contained: every dependency is pinned by url+hash, so a
plain clone builds with no sibling checkouts. (The dev branch instead
uses ../sibling path dependencies for fast local iteration — as a
consumer you want main.)
zig build # debug build → zig-out/bin/quote
zig build run # build + run
zig build test # full test suite (~80 s warm; fuzz + perf canaries)
zig build bundle -Doptimize=ReleaseFast # macOS Quote.app
zig build install-user -Doptimize=ReleaseFast # bundle + install to ~/Applications & ~/.local/bin/quote
After install-user, Quote.app is in ~/Applications (clickable from
Finder) and quote is on $PATH — quote path/to/file.md opens the
file in the running Quote.app (or starts it). No sudo, no system-wide
writes. If ~/.local/bin isn't on your $PATH, the install step
prints the line to add to your shell rc.
build.zig.zon pins every dependency to an exact commit;
.tools/devkit/devkit pin-deps (run on main) bumps the pins to the
sibling repos' pushed heads.
Cutting a release — versioning, signing, publishing — is written up in RELEASING.md.
Dependencies
Zig package manager pulls these via build.zig.zon:
- storykit — text editing core (gap buffer, styling, layout, undo)
- dvui — immediate-mode GUI (our fork of david-vanderson/dvui tracking the Zig 0.16 work)
- dvui-sokol — sokol backend for dvui (windowing, Metal, clipboard, native dialogs, std.Io runtime)
- sokol-zig — sokol bindings fork (carries an NSTextInputClient patch for dead-key composition)
- sokey — keyboard-layout-aware key translation
- sift + sift-matcher — threaded fuzzy-match engine + fzf-style matcher (file/buffer pickers)
- zpicker — headless picker state (query, selection, scroll)
- comb — content-search engine (regex/literal over a gitignore-aware walk) behind the live grep
- bearing — tags-based symbol
index and resolver over tree-sitter: the definitions, use sites and
ranked candidates behind
g d,g r,space kand completion - plumbuz — in-Zig git library (HEAD blobs + line diff for the gutter, gitignore for the walks)
- lamp — Scheme VM for REPL/completion/integration tests
- inputmap — modal input mapping
- zentry — file watching
- tree-sitter, with
tree-sitter-scheme and
tree-sitter-markdownvendored invendor/and compiled in.tree-sitter-zigandtree-sitter-jsonare fetched for the test suite but not bundled — the app installs those grammars, and Python, from the signed catalogue at runtime.
License
MIT — see LICENSE.