배경
다양한 설정에서 터미널을 사용합니다. 프로그램의 색상 출력이 화면에 올바르게 렌더링되지 않는 경우가 많습니다.
인터넷에는 특정 설정의 색상을 수정하는 방법이 많이 있습니다. 그러나 이러한 수정 사항의 개념에 대한 이해가 부족합니다.
질문
터미널 색상이 꺼져 있는 이유를 이해하려면 어떤 개념을 알아야 합니까?
다양한 색상 프로필을 사용하여 vim
호출기를 실행하고 있습니다 . bat
모두 동일한 터미널 세션 내에 있습니다.
저는 Wayland(sway), ssh 및 tmux foot
와 함께 터미널 에뮬레이터를 사용하고 있습니다 .alacritty
색상 정확성 테스트
색상 정확성을 테스트하기 위해 호출기를 사용합니다 bat
.
bat --list-themes
다양한 테마의 20개 이상의 다채로운 예제 코드를 터미널에 출력합니다. 그런 다음 다른 기계와 설정의 출력을 비교합니다.
추신: 터미널을 작성할 때 터미널이나 터미널 에뮬레이터를 언급합니다.
답변1
터미널은 두 가지 주요 방법, 즉 이전 인덱스 팔레트와 새로운 트루 컬러 터미널 모드로 색상을 제공할 수 있습니다. 전자에는 마지막 정의를 제외한 거의 모든 터미널 정의에 사용되는 모든 8, 16 및 256 색상 모드가 포함됩니다 -direct
. (한 번도 인기가 없었고 실제로는 더 이상 사용되지 않는 88색 모드도 있습니다.)
그러나 8색 및 16색 순서에 대한 표준 정의가 없으며 256색 팔레트에 대한 일반적인 값이 있지만 일부 터미널 에뮬레이터는 다르게 동작합니다. 따라서 1이 빨간색을 나타낸다고 가정하는 것 외에는 특정 색상이 터미널에 나타날 것이라고 가정할 수 없습니다. 실제로 사람들은 다양한 이유로 정확한 색상을 사용자 정의할 수 있고 선택할 수 있습니다. 예를 들어 반투명 터미널(회색과 유사하게 표시됨)을 사용하는데 진한 빨간색은 읽기 어렵기 때문에 밝은 테마를 사용하는 것을 선호합니다.
ANSI 색상을 다루는 Wikipedia 기사터미널 에뮬레이터 간에 사용할 수 있는 다양한 음영을 보여 주는 각 터미널 에뮬레이터의 차이점을 보여 주며, 모두 올바른 동작으로 간주됩니다. 일반적으로 메인 팔레트의 색상을 선택하는 것은 터미널 에뮬레이터 자체이며(내 경우에는 Alacritty) 해당 터미널 에뮬레이터에서 실행되는 다른 모든 프로그램(SSH를 통해 실행되는 프로그램 포함)은 동일한 값을 사용해야 합니다. 인덱스 팔레트.
이제 터미널의 24비트 트루 컬러 모드를 사용하면 동일한 색상을 얻을 수 있습니다. 많은 프로그램이 이 모드를 지원하지만 트루 컬러를 수행하는 터미널 유형을 나타내는 로 TERM
끝나는 정의는 일반적으로 설정되지 않기 때문에 활성화하기 어려울 수 있습니다 . -direct
예를 들어, 많은 터미널 에뮬레이터는 xterm-256color
트루 컬러를 실제로 지원하더라도 기본적으로 트루 컬러를 사용합니다. 그 이유는 트루 컬러 xterm-direct
가 훨씬 더 최신이고 시스템 간 호환성이 훨씬 낮기 때문입니다(예: SSH를 통해 로그인할 때). TERM
터미널 에뮬레이터와 운영 체제가 이를 지원한다는 것을 알고 있는 경우 터미널 에뮬레이터의 구성이나 셸의 시작 코드에서 직접 설정해야 할 수도 있습니다.
termguicolors
최신 버전의 Vim은 트루 컬러 모드를 지원하며, 활성화된 경우 터미널에서 GUI 색상을 사용할 수 있습니다(그리고 t_8f
터미널 정의에 표시된 대로 모드를 설정합니다). t_8b
Git을 포함한 다른 많은 프로그램도 구성 가능한 색상을 지원합니다. 이는 좋은 기능일 뿐만 아니라 접근성에도 중요합니다(예: 특정 유형의 색맹이 있는 사람들이 적절한 색상을 선택할 수 있도록 허용).
또한 tmux에는 방출할 수 있는 것보다 더 많은 색상을 허용하는 기능이 있습니다. 예를 들어, tmux 세션 내에서 tmux-direct
트루 컬러 출력을 내는 프로그램을 사용했지만 나중에 Linux 콘솔(16개 색상만 있음)에 다시 연결하면 tmux는 색상을 지원되는 가장 가까운 색상에 매핑하려고 시도합니다. 모든 것이 작동하지만(좋은 일입니다), 추악한 결과가 발생합니다(나쁜 일입니다). 이런 경우 실패할 수밖에 없습니다.