AICodeEditor ist ein vollständig in Kotlin Compose Multiplatform entwickelter, intelligenter Code-Editor mit nativer AI-Integration und ohne BasicTextField.
BasicTextField ist eine High-Level-Komponente von Compose, die auf TextInputService und
Plattform-IME aufbaut. Sie ist für einfache Editoren gedacht, nicht für
strukturierte, zeilenweise kontrollierte Editoren mit:
- eigener Zeichen- und Layoutlogik (Canvas / Paragraph)
- semantischem Cursor- und Selektionsmodell
- Syntax Highlighting auf Tokenbasis
- KI-Transaktionen (strukturierte EditPlans)
- Undo/Redo mit Transaktionsgruppen
- Millionen Zeilen ohne Reflow
- Unkontrollierbares Repaint – ganze Textregion wird bei jedem Edit neu gezeichnet.
- IME- und Clipboard-Bugs – insbesondere bei Multiline und Undo.
- Fehlende Transparenz – Cursor-Position und Textlayout nur intern verfügbar.
- Kein Token- oder Line-basiertes Rendering – unbrauchbar für Syntax.
- Performanceeinbruch bei langen Dateien.
- Ungeeignet für KI-Integration, da Editorenoperationen nicht deterministisch steuerbar sind.
AICodeEditor rendert jede Zeile manuell mit Skia Paragraphs auf einem Canvas. Das erlaubt:
- Volle Kontrolle über Layout, Caching und Scrollverhalten.
- Viewport-basiertes Rendering (nur sichtbare Zeilen).
- Eigener Cursor / Auswahl mit Pixelgenauigkeit.
- AI-Overlays für semantische Änderungen.
- Reproduzierbare Textoperationen für KI-Agenten.
Ziel ist eine Umgebung, in der Mensch und KI denselben Editor benutzen können, ohne Zwischenlayer wie HTML, DOM oder TextField-APIs.
- Menschen sehen eine native Compose-Oberfläche.
- KI steuert denselben Editor über JSON-RPC und strukturierte EditPlans.
Die Änderungen werden atomar, parse-validiert und undo-fähig ausgeführt.
TextBuffer(Piece Table oder Rope) für performantes EditingLineIndexfür Offset↔(line,col) MappingUndoManagerfür TransaktionenParserundTokenizer(Monarch-ähnlich)- keine Abhängigkeit zu Compose
- Canvas-basiertes Rendering (Skia / Paragraph)
- Viewport-only Darstellung
- Syntax Highlighting
- Caret + Selection Layer
- AI-Overlays (Changes, Diagnostics, Suggestions)
- EditPlan API (strukturierte Operationen statt Diffs)
- Commit/Rollback-Transaktionen
- Constraints:
mustParse,forbidTouching,maxAddedBytes - AutoHeal (Klammern, Quotes)
- DryRun/Preview-Modus
- Command Palette
- Timeline für KI-Aktionen
- DiffPreview
- Undo/Redo (Plan-basiert)
- pro Zeile:
Paragraphmit monospace Font - Zeilenhöhe konstant (z. B. 20 px)
- horizontales Clipping statt Line-Wrap
- Paragraph-Cache mit Hash-Key
(lineHash, width, font)
- Keyboard Handling über
onPreviewKeyEvent - eigene Keymap für Pfeiltasten, Enter, Backspace, Selection
- kein IME (später optional per Platform Bridge)
- nur sichtbare Zeilen rendern (Viewport ± 2 Zeilen)
- incremental tokenization / lazy paragraph build
- Repaint auf Dirty Lines
- Speicher-Cache für 10 000 Zeilen unter 50 ms
TextBuffer.kt+LineIndex.kt- Insert/Delete, Offset-Konvertierung, Tests
EditorView.kt+TextPainter.kt- Paragraph-basiertes Zeichnen ohne BasicTextField
Keymap.ktfür Tastenlogik (ASCII)- Cursorbewegung, Enter, Backspace, Insert
- Auswahl mit Shift + Pfeilen
- Zeichnen der Markierung per Rect
- Transaktionales Edit-Log
- Coalescing von Tipparien
EditPlan.kt,Selector.kt,EditExecutor.kt- JSON-RPC Schnittstelle
LspClient.kt- Fehler- und Hover-Anzeige
AICodeEditor
│
├── core/
│ ├─ TextBuffer.kt
│ ├─ LineIndex.kt
│ ├─ UndoManager.kt
│ └─ EditTransaction.kt
│
├── syntax/
│ ├─ TokenizerDSL.kt
│ └─ TokenCache.kt
│
├── ai/
│ ├─ EditPlan.kt
│ ├─ Selector.kt
│ ├─ EditExecutor.kt
│ ├─ JsonRpcServer.kt
│ └─ AutoHeal.kt
│
└── ui/
├─ EditorView.kt
├─ paint/TextPainter.kt
├─ input/Keymap.kt
├─ PlanTimeline.kt
└─ DiffPreview.kt
Claude soll schrittweise:
- Core aufbauen (TextBuffer + LineIndex)
- Rendering umstellen (Canvas/Paragraph)
- Keymap hinzufügen
- Selection und Undo ergänzen
- AI-EditPlan-API implementieren
Jede Iteration liefert kompilierbaren Code ohne BasicTextField.
AICodeEditor ersetzt BasicTextField vollständig durch Canvas + Paragraph.
Dadurch wird der Editor deterministisch, performant und KI-fähig. Der gesamte Textfluss, das Layout und die Ereignissteuerung liegen vollständig in unserer Hand.
Baue und installiere das Artefakt lokal:
./gradlew publishToMavenLocalFüge in deiner build.gradle.kts hinzu:
repositories {
mavenLocal()
// ggf. weitere Repositories
}
dependencies {
implementation("ai.codeeditor:codeeditor:1.0.0")
}Beispiel für Compose Multiplatform:
import ai.codeeditor.core.EditorController
import ai.codeeditor.ui.EditorView
val buffer = SimpleTextBuffer("fun main() {\n println(\"Hello World!\")\n}")
val controller = EditorController(buffer)
EditorView(controller = controller)fun main() = application {
Window(
onCloseRequest = ::exitApplication,
title = "AICodeEditor",
state = rememberWindowState(width = 1200.dp, height = 800.dp)
) {
val buffer = remember { SimpleTextBuffer("fun main() {\n println(\"Hello World!\")\n}") }
val controller = remember(buffer) { EditorController(buffer) }
EditorView(controller = controller)
}
}- Die API ist Compose Multiplatform-kompatibel.
- Syntax Highlighting, Undo/Redo und Keymap sind integriert.