static string GetConsoleLine(ref NEXT_CMD cmd, string init = "", bool enhancedMode = true) { //string line = init; StringBuilder sb = new StringBuilder(init); int delta = init.Length - 1; string prompt = GetPrompt(); Console.Write(prompt); Console.Write(init); if (!enhancedMode) { return(Console.ReadLine()); } while (true) { ConsoleKeyInfo key = Console.ReadKey(true); if (key.Key == ConsoleKey.UpArrow) { cmd = NEXT_CMD.PREV; ClearLine(prompt, sb.ToString()); return(sb.ToString()); } if (key.Key == ConsoleKey.DownArrow) { cmd = NEXT_CMD.NEXT; ClearLine(prompt, sb.ToString()); return(sb.ToString()); } if (key.Key == ConsoleKey.RightArrow) { delta = Math.Max(-1, Math.Min(++delta, sb.Length - 1)); SetCursor(prompt, sb.ToString(), delta + 1); continue; } if (key.Key == ConsoleKey.LeftArrow) { delta = Math.Max(-1, Math.Min(--delta, sb.Length - 1)); SetCursor(prompt, sb.ToString(), delta + 1); continue; } if (key.Key == ConsoleKey.Tab) { cmd = NEXT_CMD.TAB; ClearLine(prompt, sb.ToString()); return(sb.ToString()); } if (key.Key == ConsoleKey.Backspace || key.Key == ConsoleKey.Delete) { if (sb.Length > 0) { delta = key.Key == ConsoleKey.Backspace ? Math.Max(-1, Math.Min(--delta, sb.Length - 2)) : delta; if (delta < sb.Length - 1) { sb.Remove(delta + 1, 1); } SetCursor(prompt, sb.ToString(), Math.Max(0, delta + 1)); } continue; } if (key.Key == ConsoleKey.Enter) { Console.WriteLine(); return(sb.ToString()); } if (key.KeyChar == Constants.EMPTY) { continue; } ++delta; Console.Write(key.KeyChar); if (delta < sb.Length) { delta = Math.Max(0, Math.Min(delta, sb.Length - 1)); sb.Insert(delta, key.KeyChar.ToString()); } else { sb.Append(key.KeyChar); } SetCursor(prompt, sb.ToString(), delta + 1); } }
private static void RunLoop() { List <string> commands = new List <string>(); StringBuilder sb = new StringBuilder(); int cmdPtr = 0; int tabFileIndex = 0; bool arrowMode = false; string start = "", baseCmd = "", startsWith = "", init = "", script; string previous = ""; while (true) { sb.Clear(); NEXT_CMD nextCmd = NEXT_CMD.NONE; script = previous + GetConsoleLine(ref nextCmd, init).Trim(); if (script.EndsWith(Constants.CONTINUE_LINE.ToString())) { previous = script.Remove(script.Length - 1); init = ""; continue; } if (nextCmd == NEXT_CMD.PREV || nextCmd == NEXT_CMD.NEXT) { if (arrowMode || nextCmd == NEXT_CMD.NEXT) { cmdPtr += (int)nextCmd; } cmdPtr = cmdPtr < 0 || commands.Count == 0 ? cmdPtr + commands.Count : cmdPtr % commands.Count; init = commands.Count == 0 ? script : commands[cmdPtr]; arrowMode = true; continue; } else if (nextCmd == NEXT_CMD.TAB) { init = CompleteTab(script, init, ref tabFileIndex, ref start, ref baseCmd, ref startsWith); continue; } init = ""; previous = ""; tabFileIndex = 0; arrowMode = false; if (string.IsNullOrWhiteSpace(script)) { continue; } if (commands.Count == 0 || !commands[commands.Count - 1].Equals(script)) { commands.Add(script); } if (!script.EndsWith(Constants.END_STATEMENT.ToString())) { script += Constants.END_STATEMENT; } ProcessScript(script); cmdPtr = commands.Count - 1; } }