# Project Guidelines

kte is Kyle's Text Editor — a simple, fast text editor written in C++17. It
replaces the earlier C implementation, ke (see the ke manual in `docs/ke.md`). The
design draws inspiration from Antirez' kilo, with keybindings rooted in the
WordStar/VDE family and emacs. The spiritual parent is `mg(1)`.

These guidelines summarize the goals, interfaces, key operations, and current
development practices for kte.

## Goals

- Keep the core small, fast, and understandable.
- Provide an ncurses-based terminal-first editing experience, with an additional ImGui GUI.
- Preserve familiar keybindings from ke while modernizing the internals.
- Favor simple data structures (e.g., piece table) and incremental evolution.

Project entry point: `main.cpp`

## Core Components (current codebase)

- Buffer: editing model and file I/O (`Buffer.h/.cpp`).
- GapBuffer: editable in-memory text representation (`GapBuffer.h/.cpp`).
- PieceTable: experimental/alternative representation (`PieceTable.h/.cpp`).
- InputHandler: interface for handling text input (`InputHandler.h/`), along
  with `TerminalInputHandler` (ncurses-based) and `GUIInputHandler`.
- Renderer: interface for rendering text (`Renderer.h`), along with
  `TerminalRenderer` (ncurses-based) and `GUIRenderer`.
- Editor: top-level editor state (`Editor.h/.cpp`).
- Command: command model (`Command.h/.cpp`).
- General purpose editor functionality (`Editing.h/.cpp`)

## Keybindings (inherited from ke)

The file `docs/ke.md` contains the canonical reference for keybindings.

## Contributing/Development Notes

- C++ standard: C++17.
- Keep dependencies minimal.
- Prefer small, focused changes that preserve ke’s UX unless explicitly changing
  behavior.

## References

- Previous editor manual: `ke.md` (canonical keybinding/spec reference for now).
- Inspiration: kilo, WordStar/VDE, emacs, `mg(1)`.

