diff --git a/src/ReadLine/KeyHandler.cs b/src/ReadLine/KeyHandler.cs index 046d11d..8cbc8e6 100644 --- a/src/ReadLine/KeyHandler.cs +++ b/src/ReadLine/KeyHandler.cs @@ -31,15 +31,20 @@ internal class KeyHandler private void MoveCursorLeft() { - if (IsStartOfLine()) - return; + MoveCursorLeft(1); + } + + private void MoveCursorLeft(int count) + { + if (count > _cursorPos) + count = _cursorPos; - if (IsStartOfBuffer()) + if (count > Console2.CursorLeft) Console2.SetCursorPosition(Console2.BufferWidth - 1, Console2.CursorTop - 1); else - Console2.SetCursorPosition(Console2.CursorLeft - 1, Console2.CursorTop); + Console2.SetCursorPosition(Console2.CursorLeft - count, Console2.CursorTop); - _cursorPos--; + _cursorPos -= count; } private void MoveCursorHome() @@ -76,8 +81,7 @@ private void MoveCursorEnd() private void ClearLine() { MoveCursorEnd(); - while (!IsStartOfLine()) - Backspace(); + Backspace(_cursorPos); } private void WriteNewString(string str) @@ -119,18 +123,24 @@ private void WriteChar(char c) private void Backspace() { - if (IsStartOfLine()) - return; + Backspace(1); + } - MoveCursorLeft(); + private void Backspace(int count) + { + if (count > _cursorPos) + count = _cursorPos; + + MoveCursorLeft(count); int index = _cursorPos; - _text.Remove(index, 1); + _text.Remove(index, count); string replacement = _text.ToString().Substring(index); int left = Console2.CursorLeft; int top = Console2.CursorTop; - Console2.Write(string.Format("{0} ", replacement)); + string spaces = new string(' ', count); + Console2.Write(string.Format("{0}{1}", replacement, spaces)); Console2.SetCursorPosition(left, top); - _cursorLimit--; + _cursorLimit -= count; } private void Delete() @@ -177,8 +187,7 @@ private void TransposeChars() private void StartAutoComplete() { - while (_cursorPos > _completionStart) - Backspace(); + Backspace(_cursorPos - _completionStart); _completionsIndex = 0; @@ -187,8 +196,7 @@ private void StartAutoComplete() private void NextAutoComplete() { - while (_cursorPos > _completionStart) - Backspace(); + Backspace(_cursorPos - _completionStart); _completionsIndex++; @@ -200,8 +208,7 @@ private void NextAutoComplete() private void PreviousAutoComplete() { - while (_cursorPos > _completionStart) - Backspace(); + Backspace(_cursorPos - _completionStart); _completionsIndex--; @@ -275,15 +282,13 @@ public KeyHandler(IConsole console, List history, IAutoCompleteHandler a _keyActions["ControlN"] = NextHistory; _keyActions["ControlU"] = () => { - while (!IsStartOfLine()) - Backspace(); + Backspace(_cursorPos); }; _keyActions["ControlK"] = () => { int pos = _cursorPos; MoveCursorEnd(); - while (_cursorPos > pos) - Backspace(); + Backspace(_cursorPos - pos); }; _keyActions["ControlW"] = () => {