internal static void Init(ref ICharMap charMap) { // If either stdin or stdout is redirected, PSReadLine doesn't really work, so throw // and let PowerShell call Console.ReadLine or do whatever else it decides to do. if (IsHandleRedirected(stdin: false) || IsHandleRedirected(stdin: true)) { // Some CI environments redirect stdin/stdout, but that doesn't affect our test runs // because the console is mocked, so we can skip the exception. if (!PSConsoleReadLine.IsRunningCI()) { throw new NotSupportedException(); } } if (_enableVtOutput) { // This is needed because PowerShell does not restore the console mode // after running external applications, and some popular applications // clear VT, e.g. git. SetConsoleOutputVirtualTerminalProcessing(); } // If input is redirected, we can't use console APIs and have to use VT input. if (IsHandleRedirected(stdin: true)) { EnableAnsiInput(ref charMap); } else { _prePSReadLineConsoleInputMode = GetConsoleInputMode(); // This envvar will force VT mode on or off depending on the setting 1 or 0. var overrideVtInput = Environment.GetEnvironmentVariable("PSREADLINE_VTINPUT"); if (overrideVtInput == "1") { _enableVtInput = true; } else if (overrideVtInput == "0") { _enableVtInput = false; } else { // If the console was already in VT mode, use the appropriate CharMap. // This handles the case where input was not redirected and the user // didn't specify a preference. The default is to use the pre-existing // console mode. _enableVtInput = (_prePSReadLineConsoleInputMode & ENABLE_VIRTUAL_TERMINAL_INPUT) == ENABLE_VIRTUAL_TERMINAL_INPUT; } if (_enableVtInput) { EnableAnsiInput(ref charMap); } SetOurInputMode(); } }