feat: add autocomplete foundation

- add reusable autocomplete provider contracts

- integrate slash command completions with editor select list
This commit is contained in:
chuan
2026-06-04 02:23:06 +08:00
Unverified
parent 83967fa691
commit 41c0d91d77
14 changed files with 383 additions and 3 deletions
+24
View File
@@ -1,4 +1,5 @@
using TinyTUI.Components;
using TinyTUI.Autocomplete;
using TinyTUI.Input;
using TinyTUI.Rendering;
using TinyTUI.Text;
@@ -41,6 +42,29 @@ loader.HandleInput(new TuiInputEvent(TuiInputEventKind.Key, KeyNames.Escape));
AssertTrue(loader.IsCanceled, "cancellable loader token");
AssertTrue(canceled, "cancellable loader callback");
var autocompleteEditor = new Editor(measurer)
{
AutocompleteProvider = new SlashCommandAutocompleteProvider(
[
new SlashCommand("help", "show help"),
new SlashCommand("history", "show history"),
]),
};
autocompleteEditor.HandleInput(new TuiInputEvent(TuiInputEventKind.Text, "/h"));
AssertTrue(autocompleteEditor.IsAutocompleteActive, "slash command autocomplete active");
AssertTrue(autocompleteEditor.RenderAutocomplete(40).Any(line => line.Contains("help", StringComparison.Ordinal)), "slash command autocomplete render");
autocompleteEditor.HandleInput(new TuiInputEvent(TuiInputEventKind.Key, KeyNames.Down));
autocompleteEditor.HandleInput(new TuiInputEvent(TuiInputEventKind.Key, KeyNames.Tab));
AssertEqual("/history ", autocompleteEditor.Value, "slash command autocomplete confirm");
AssertFalse(autocompleteEditor.IsAutocompleteActive, "slash command autocomplete closes after confirm");
autocompleteEditor.Value = "/h";
autocompleteEditor.HandleInput(new TuiInputEvent(TuiInputEventKind.Key, KeyNames.Tab));
AssertTrue(autocompleteEditor.IsAutocompleteActive, "forced autocomplete active");
autocompleteEditor.HandleInput(new TuiInputEvent(TuiInputEventKind.Key, KeyNames.Escape));
AssertFalse(autocompleteEditor.IsAutocompleteActive, "autocomplete cancel");
AssertEqual("/h", autocompleteEditor.Value, "autocomplete cancel keeps text");
Console.WriteLine("TinyTUI component checks passed");
static void AssertEqual<T>(T expected, T actual, string name)