public void Update() { Console.Clear(); var leftPane = new List <string>(); int paneWidth = (Console.WindowWidth - 1) / 2; IEnumerator <Tuple <string, string> > inputEnum = m_inputs.GetEnumerator(); while (true) { if (!inputEnum.MoveNext()) { break; } var sb = new StringBuilder("> "); for (int i = 0; i < inputEnum.Current.Item1.Length; i++) { char c = inputEnum.Current.Item1[i]; if (sb.Length < paneWidth && c != '\n') { sb.Append(c); } else { leftPane.Add(sb.ToString()); sb.Clear(); sb.Append("...> "); if (c != '\n') { sb.Append(c); } } } if (sb.Length > 0) { leftPane.Add(sb.ToString()); sb.Clear(); } if (inputEnum.Current.Item2 != null) { for (int i = 0; i < inputEnum.Current.Item2.Length; i++) { char c = inputEnum.Current.Item2[i]; if (sb.Length < paneWidth && c != '\n') { sb.Append(c); } else { leftPane.Add(sb.ToString()); sb.Clear(); if (c != '\n') { sb.Append(c); } } } if (sb.Length > 0) { leftPane.Add(sb.ToString()); } } } var visibleInput = leftPane.Reverse <string>().Take(Console.WindowHeight - 1).Reverse <string>(); var visibleStack = m_stack.Get(Math.Min(m_stack.Count, Console.WindowHeight - 1)).GetEnumerator(); for (int i = 0; i < Console.WindowHeight - 1; i++) { bool haveStack = visibleStack.MoveNext(); Console.Out.WriteLine("{0,-" + paneWidth.ToString() + "}" + s_verticalBar + "{1,-" + paneWidth.ToString() + "}", visibleInput.ElementAtOrDefault(i, string.Empty), haveStack ? string.Format("{0}: {1}", i + 1, visibleStack.Current.ToString()) : string.Empty); } Console.Out.Write("> "); }