ANSI 색상 처리 기능이 있는 Windows 콘솔

ANSI 색상 처리 기능이 있는 Windows 콘솔

ANSI 색상을 해석하는 Windows용 콘솔 에뮬레이터가 있습니까?

우리는 rspec을 사용하고 우리 팀의 일부는 Windows를 사용하며 색상 지정을 위한 특수 문자열은 그다지 유용하지 않습니다.)

답변1

이 페이지의 답변 중 어느 것도 새로운 지원의 중요한 측면을 언급하지 않습니다.ANSI 터미널 제어에 추가된 것윈도우 10빌드 16257(이상)의 콘솔 호스트. 즉, 그것은n̲o̲t̲ e̲n̲a̲b̲l̲e̲d̲기본적으로. 사용 중인 특정 소프트웨어가 아닌 이상가능하게 한다호출을 통한 ANSI 처리콘솔 모드 설정플래그 가 있는 API를 사용하면 ENABLE_VIRTUAL_TERMINAL_PROCESSING (0x0004)해당 응용 프로그램에 대한 색상이 표시되거나 ANSI 처리가 이루어지지 않습니다.

ENABLE_VIRTUAL_TERMINAL_PROCESSING0x0004
https://docs.microsoft.com/windows/console/setconsolemode

로 글을 쓸 때파일 쓰기또는쓰기콘솔, 문자는 기존 콘솔 API를 통해 수행할 수 있는 커서 이동, 색상/글꼴 모드 및 기타 작업을 제어하는 ​​VT100 및 유사한 제어 문자 시퀀스에 대해 구문 분석됩니다. 자세한 내용은 콘솔 가상 터미널 시퀀스를 참조하세요.

이 페이지에 표시된 예제가 작동하는 이유는 분명히 명령 echo(또는 아마도일괄 처리CMD.EXE또는 ) 의 일부는 conhost방금 언급한 API를 호출하여 ANSI 처리를 활성화합니다. 그러나 이를 작성하거나 수행하지 않을 수 있는 다른 많은 도구나 실행 파일이 stdin있는 stdout경우 해당 프로세스에 대한 색상이 표시되지 않습니다.

다행히 전역 기본값은 다음에서 변경할 수 있습니다.옵트에게옵트아웃. 의 레지스트리 키는 HKEY_CURRENT_USER\Console\VirtualTerminalLevelANSI 이스케이프 시퀀스 처리를 위한 전역 기본 동작을 설정합니다. DWORD필요한 경우 키를 생성 하고 해당 값을 기본적으로 ANSI 처리를 1전역적으로 활성화(또는 0비활성화)하도록 설정합니다.

[HKEY_CURRENT_USER\콘솔]
"가상 터미널 수준"=dword:00000001

이 레지스트리 설정은기본를 호출하여 콘솔 모드를 명시적으로 조작하지 않는 콘솔 앱에만 영향을 미친다는 의미입니다 SetConsoleMode(...). 따라서 레지스트리 값이 도움이 될 수 있지만~할 수 있게 하다ANSI콘솔 모드를 인식하지 못함어떤 앱에도 영향을 미치지 않습니다.콘솔 모드에 능숙함(어떤 이유로든) 명시적으로장애를 입히다ANSI.

여기에 이미지 설명을 입력하세요

답변2

콘에뮤Xterm 256 색상 확장으로 ANSI X3.64를 지원합니다. 저는 이 콘솔 에뮬레이터의 작성자입니다.

Ansi 시퀀스는 ConEmu 탭에서 실행되는 모든 프로세스에 대해 처리됩니다.

AFAIK, ConEmu는 Ansicon보다 더 많은 코드를 지원합니다.

ConEmu 및 ANSI X3.64 / Xterm 256 색상

답변3

Windows 10 TH2(v1511)부터 conhost.exe(및 확장에 따라 cmd.exe) 특정 색상에서 ANSI 이스케이프 시퀀스를 지원합니다.

아래 언급된 MSDN 페이지의 이미지

그만큼콘솔 가상 터미널 시퀀스에 대한 MSDN 페이지지원되는 시퀀스와 이를 활성화하는 방법을 설명합니다.

당신이 사용할 수있는GetConsoleMode그리고콘솔 모드 설정이 동작을 구성하는 플래그입니다. [...]

다음 시퀀스의 동작은 VT100 및 파생된 터미널 에뮬레이터 기술, 특히 xterm 터미널 에뮬레이터를 기반으로 합니다. 터미널 시퀀스에 대한 자세한 내용은 다음에서 확인할 수 있습니다.http://vt100.net그리고 에http://invisible-island.net/xterm/ctlseqs/ctlseqs.html.

답변4

현재 CMD 콘솔 색상은 Win10에서 기본적으로 활성화되어 있지 않으므로 활성화하려면 코드에 다음을 추가하세요.

#if defined WIN32 || defined _WIN32 || defined WIN64 || defined _WIN64
    HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
    DWORD dwMode = 0;
    GetConsoleMode(hOut, &dwMode);
    dwMode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING;
    SetConsoleMode(hOut, dwMode);

    // References:
    //SetConsoleMode() and ENABLE_VIRTUAL_TERMINAL_PROCESSING?
    //https://stackoverflow.com/questions/38772468/setconsolemode-and-enable-virtual-terminal-processing

    // Windows console with ANSI colors handling
    // https://superuser.com/questions/413073/windows-console-with-ansi-colors-handling
#endif

관련 정보