/// <summary> /// Start a new digit argument to pass to other functions /// </summary> public static void DigitArgument(ConsoleKeyInfo?key = null, object arg = null) { if (!key.HasValue || char.IsControl(key.Value.KeyChar)) { Ding(); return; } #region VI special case if (_singleton._options.EditMode == EditMode.Vi && key.Value.KeyChar == '0') { BeginningOfLine(); return; } #endregion VI special case bool sawDigit = false; _singleton._statusLinePrompt = "digit-argument: "; var argBuffer = _singleton._statusBuffer; argBuffer.Append(key.Value.KeyChar); if (key.Value.KeyChar == '-') { argBuffer.Append('1'); } else { sawDigit = true; } _singleton.Render(); // Render prompt while (true) { var nextKey = ReadKey(); KeyHandler handler; if (_singleton._dispatchTable.TryGetValue(nextKey, out handler)) { if (handler.Action == DigitArgument) { if (nextKey.KeyChar == '-') { if (argBuffer[0] == '-') { argBuffer.Remove(0, 1); } else { argBuffer.Insert(0, '-'); } _singleton.Render(); // Render prompt continue; } if (nextKey.KeyChar >= '0' && nextKey.KeyChar <= '9') { if (!sawDigit && argBuffer.Length > 0) { // Buffer is either '-1' or '1' from one or more Alt+- keys // but no digits yet. Remove the '1'. argBuffer.Length -= 1; } sawDigit = true; argBuffer.Append(nextKey.KeyChar); _singleton.Render(); // Render prompt continue; } } else if (handler.Action == Abort || handler.Action == CancelLine || handler.Action == CopyOrCancelLine) { break; } } int intArg; if (int.TryParse(argBuffer.ToString(), out intArg)) { _singleton.ProcessOneKey(nextKey, _singleton._dispatchTable, ignoreIfNoAction: false, arg: intArg); } else { Ding(); } break; } // Remove our status line argBuffer.Clear(); _singleton.ClearStatusMessage(render: true); }