void CmdTabOrComplete()
{
bool complete = false;
if (AutoCompleteEvent != null)
{
if (TabAtStartCompletes)
complete = true;
else
{
for (int i = 0; i < cursor; i++)
{
if (!Char.IsWhiteSpace(text[i]))
{
complete = true;
break;
}
}
}
if (complete)
{
Completion completion = AutoCompleteEvent(text.ToString(), cursor);
string[] completions = completion.Result;
if (completions == null)
return;
int ncompletions = completions.Length;
if (ncompletions == 0)
return;
if (completions.Length == 1)
{
InsertTextAtCursor(completions[0]);
}
else
{
int last = -1;
for (int p = 0; p < completions[0].Length; p++)
{
char c = completions[0][p];
for (int i = 1; i < ncompletions; i++)
{
if (completions[i].Length < p)
goto mismatch;
if (completions[i][p] != c)
{
goto mismatch;
}
}
last = p;
}
mismatch:
if (last != -1)
{
InsertTextAtCursor(completions[0].Substring(0, last + 1));
}
Console.WriteLine();
foreach (string s in completions)
{
Console.Write(completion.Prefix);
Console.Write(s);
Console.Write(' ');
}
Console.WriteLine();
Render();
ForceCursor(cursor);
}
}
else
HandleChar('\t');
}
else
HandleChar('t');
}