kte - Kyle's Text Editor
Vision
kte is a small, fast, and understandable text editor with a terminal-first UX and an optional ImGui GUI. It modernizes the original ke editor while preserving its familiar WordStar/VDE‑style command model and Emacs‑influenced ergonomics. The focus is on simplicity of design, excellent latency, and pragmatic features you can learn and keep in your head.
I am experimenting with using Jetbrains Junie to assist in development, largely as a way to learn the effective use of agentic coding.
Project Goals
- Keep the core minimal and readable; favor straightforward data structures (gap buffer, piece table) and incremental evolution.
- Round‑trip editing of large files with low latency in a terminal environment.
- Preserve ke keybindings and command semantics wherever sensible; smooth migration for ke users.
- Provide a clean separation between core model, input, and rendering so a GUI can grow independently of the TUI.
- Minimize dependencies; the GUI layer remains optional and isolated.
User Experience (intended)
- Terminal first: instant startup, responsive editing, no surprises over SSH.
- Optional GUI: an ImGui‑based window with tabs, menus, and palette-sharing the same editor core and command model.
- Discoverable command model: WordStar/VDE style with a
C-kprefix, Emacs‑like incremental search, and context help. - Sensible defaults with a simple config file for remaps and theme selection.
- Respect the file system: no magic project files; autosave and crash‑recovery journals are opt‑in and visible.
Core Features (roadmapped)
- Buffers and windows
- Multiple file buffers; fast switching, closing, and reopening.
- Split views (horizontal/vertical) in TUI and tiled panels in GUI.
- Editing primitives
- Gap buffer (primary) with an alternative piece table for large‑edit scenarios.
- Kill/yank ring, word/sentence/paragraph motions, and rectangle ops.
- Undo/redo with grouped edits and time‑travel scrubbing.
- Search and replace
- Incremental search (C-s) and regex search (C-r) with live highlighting.
- Multi‑file grep with a quickfix list; replace with confirm.
- Files and projects
- Robust encoding/line‑ending detection; safe writes (atomic where possible).
- File tree sidebar (GUI) and quick‑open palette.
- Lightweight session restore.
- Language niceties (opt‑in, no runtime servers required)
- Syntax highlighting via fast, table‑driven lexers.
- Basic indentation rules per language; trailing whitespace/EOF newline helpers.
- Extensibility (later)
- Command palette actions backed by the core command model.
- Small C++ plugin ABI and a scripting shim for config‑time customization.
Interfaces
- CLI: the primary interface.
kte [files]starts in the terminal, adopting your$TERMcapabilities. Terminal mode is implemented using ncurses. - GUI: an optional ImGui‑based frontend that embeds the same editor core.
Man pages
- Terminal editor:
docs/kte.1(view locally withman -l docs/kte.1) - GUI frontend:
docs/kge.1(view locally withman -l docs/kge.1)
The ke keybinding reference remains the canonical source for
commands while kte evolves: see docs/ke.md.
Architecture (intended)
- Core model
- Buffer: file I/O, cursor/mark, viewport state, and edit operations.
- GapBuffer: fast in‑memory text structure for typical edits.
- PieceTable: alternative representation for heavy insert/delete workflows.
- Controller layer
- InputHandler interface with
TerminalInputHandlerandGUIInputHandlerimplementations. - Command: normalized operations (save, kill, yank, move, search, etc.).
- InputHandler interface with
- View layer
- Renderer interface with
TerminalRendererandGUIRendererimplementations.
- Renderer interface with
- Editor: top‑level state managing buffers, messaging, and global flags.
Performance and Reliability Targets
- Sub‑millisecond keystroke to screen update on typical files in TUI.
- Sustain fluid editing on multi‑megabyte files; graceful degradation on very large files.
- Atomic/safe writes; autosave and crash‑recovery journals are explicit and transparent.
Keybindings
kte maintains ke’s command model while internals evolve. Highlights (subject to refinement):
- K‑command prefix:
C-kenters k‑command mode; exit withESCorC-g. - Save/Exit:
C-k s(save),C-k xorC-k C-x(save and exit),C-k q(quit with confirm),C-k C-q(quit immediately). - Editing:
C-k d(kill to EOL),C-k C-d(kill line),C-k BACKSPACE(kill to BOL),C-w(kill region),C-y( yank),C-u(universal argument). - Navigation/Search:
C-s(incremental find),C-r(regex search),ESC f/b(word next/prev),ESC BACKSPACE(delete previous word). - Buffers/Files:
C-k e(open),C-k b/C-k p(switch),C-k c(close),C-k C-r(reload). - Misc:
C-l(refresh),C-g(cancel),C-k m(run make),C-k g(goto line).
See ke.md for the canonical ke reference retained for now.
Build and Run
Prerequisites: C++17 compiler, CMake, and ncurses development headers/libs.
Dependencies by platform
-
macOS (Homebrew)
- Terminal (default):
brew install ncurses
- Optional GUI (enable with
-DBUILD_GUI=ON):brew install sdl2 freetype- OpenGL is provided by the system framework on macOS; no package needed.
- Terminal (default):
-
Debian/Ubuntu
- Terminal (default):
sudo apt-get install -y libncurses5-dev libncursesw5-dev
- Optional GUI (enable with
-DBUILD_GUI=ON):sudo apt-get install -y libsdl2-dev libfreetype6-dev mesa-common-dev- The
mesa-common-devpackage provides OpenGL headers/libs (libGL).
- Terminal (default):
-
NixOS/Nix
- Terminal (default):
- Ad-hoc shell:
nix-shell -p cmake gcc ncurses
- Ad-hoc shell:
- Optional GUI (enable with
-DBUILD_GUI=ON):- Ad-hoc shell:
nix-shell -p cmake gcc ncurses SDL2 freetype libGL
- Ad-hoc shell:
- With flakes/devshell (example
flake.nixinputs not provided): includencursesfor TUI, andSDL2,freetype,libGLfor GUI in your devShell.
- Terminal (default):
Notes
- The GUI is OFF by default to keep SDL/OpenGL/Freetype optional. Enable it by
configuring with
-DBUILD_GUI=ONand ensuring the GUI deps above are installed for your platform. - If you previously configured with GUI ON and want to disable it, reconfigure
the build directory with
-DBUILD_GUI=OFF.
Example build:
cmake -S . -B cmake-build-debug -DCMAKE_BUILD_TYPE=Debug
cmake --build cmake-build-debug
Run:
./cmake-build-debug/kte [files]
If you configured the GUI, you can also run the GUI-first target (when
built as kge) or request the GUI from kte:
./cmake-build-debug/kte --gui [files]
# or if built/installed as a separate GUI target
./cmake-build-debug/kge [files]
GUI build example
To build with the optional GUI (after installing the GUI dependencies listed above):
cmake -S . -B cmake-build-debug -DCMAKE_BUILD_TYPE=Debug -DBUILD_GUI=ON
cmake --build cmake-build-debug
./cmake-build-debug/kte --gui [files]
Status
- The project is under active evolution toward the above architecture and UX. The terminal interface now uses ncurses for input and rendering. GUI work will follow as a thin, optional layer. ke compatibility remains a primary constraint while internals modernize.
Roadmap (high level)
- Solidify core buffer model (gap buffer), file I/O, and ke‑compatible commands.
- Introduce structured undo/redo and search/replace with highlighting.
- Stabilize terminal renderer and input handling across common terminals. (initial ncurses implementation landed)
- Add piece table as an alternative backend with runtime selection per buffer.
- Optional GUI frontend using ImGui; shared command palette.
- Language niceties (syntax highlighting, indentation rules) behind a zero‑deps, fast path.
- Session restore, autosave/journaling, and safe write guarantees.
- Extensibility hooks with a small, stable API. References
- ke manual and keybinding
reference:
ke.md - Inspirations: Antirez’ kilo, WordStar/VDE, Emacs, and
mg(1)