From d2b579fddcbe8db083d6c6868f22170226e336bc Mon Sep 17 00:00:00 2001 From: Zhiming Wang Date: Wed, 10 Apr 2019 19:59:25 +0800 Subject: [PATCH] Enable ANSI color in cmd and PowerShell on Windows 10 VT100 control sequences are supported in cmd and PowerShell starting from Windows 10 Anniversary Update, but only if the ENABLE_VIRTUAL_TERMINAL_PROCESSING flag is set on the screen buffer handle using SetConsoleMode. Setting this flag does not seem to negatively affect third party terminal emulators with native ANSI support such as ConEmu, so hopefully there's no regression. References: https://docs.microsoft.com/en-us/windows/console/console-virtual-terminal-sequences https://docs.microsoft.com/en-us/windows/console/setconsolemode Credits: https://github.com/jarun/googler/pull/275 https://github.com/tartley/colorama/pull/139 --- googler | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/googler b/googler index 6837536..c21fa67 100755 --- a/googler +++ b/googler @@ -30,6 +30,7 @@ from http.client import HTTPSConnection import locale import logging import os +import platform import shutil import signal import socket @@ -3229,6 +3230,29 @@ def main(): Result.urlexpand = True if os.getenv('DISABLE_URL_EXPANSION') is None else False GooglerCmd.colors = colors + # Try to enable ANSI color support in cmd or PowerShell on Windows 10 + if sys.platform == 'win32' and sys.stdout.isatty() and colorize: + # VT100 control sequences are supported on Windows 10 Anniversary Update and later. + # https://docs.microsoft.com/en-us/windows/console/console-virtual-terminal-sequences + # https://docs.microsoft.com/en-us/windows/console/setconsolemode + if platform.release() == '10': + STD_OUTPUT_HANDLE = -11 + ENABLE_VIRTUAL_TERMINAL_PROCESSING = 0x0004 + try: + from ctypes import windll, wintypes, byref + kernel32 = windll.kernel32 + stdout_handle = kernel32.GetStdHandle(STD_OUTPUT_HANDLE) + old_mode = wintypes.DWORD() + if not kernel32.GetConsoleMode(stdout_handle, byref(old_mode)): + raise RuntimeError('GetConsoleMode failed') + new_mode = old_mode.value | ENABLE_VIRTUAL_TERMINAL_PROCESSING + if not kernel32.SetConsoleMode(stdout_handle, new_mode): + raise RuntimeError('SetConsoleMode failed') + # Note: No need to restore at exit. SetConsoleMode seems to + # be limited to the calling process. + except Exception: + pass + if opts.url_handler is not None: open_url.url_handler = opts.url_handler else: