diff --git a/lib/std/fs/file.zig b/lib/std/fs/file.zig index 3ed4b07a3d..0a2fbf74ad 100644 --- a/lib/std/fs/file.zig +++ b/lib/std/fs/file.zig @@ -230,6 +230,13 @@ pub const File = struct { /// Test whether ANSI escape codes will be treated as such. pub fn supportsAnsiEscapeCodes(self: File) bool { if (builtin.os.tag == .windows) { + if (!os.isatty(self.handle)) return false; + + var console_mode: os.windows.DWORD = 0; + if (os.windows.kernel32.GetConsoleMode(self.handle, &console_mode) != 0) { + if (console_mode & os.windows.ENABLE_VIRTUAL_TERMINAL_PROCESSING != 0) return true; + } + return os.isCygwinPty(self.handle); } if (builtin.os.tag == .wasi) { diff --git a/lib/std/os/windows.zig b/lib/std/os/windows.zig index 2c3b1ded8e..c591f8cf7f 100644 --- a/lib/std/os/windows.zig +++ b/lib/std/os/windows.zig @@ -3387,6 +3387,8 @@ pub const CONSOLE_SCREEN_BUFFER_INFO = extern struct { dwMaximumWindowSize: COORD, }; +pub const ENABLE_VIRTUAL_TERMINAL_PROCESSING = 0x4; + pub const FOREGROUND_BLUE = 1; pub const FOREGROUND_GREEN = 2; pub const FOREGROUND_RED = 4;