터미널은 256색 팔레트를 자동 생성해야 한다

1 month ago 14

  • 256색 팔레트를 사용자의 base16 테마에서 자동 생성하도록 제안하는 글로, 터미널의 색상 일관성과 가독성을 개선하는 방안 제시
  • 기존 base16 테마는 단순하지만 색상 수가 제한되고, truecolor는 설정 복잡성과 호환성 문제가 있음
  • 기본 256색 팔레트는 밝기 불균형, 테마 불일치, 잘못된 보간 등으로 인해 시각적 품질이 낮음
  • LAB 색공간 보간을 이용해 base16 색상에서 확장 팔레트를 생성하면, 일관된 밝기와 대비를 유지하면서도 풍부한 색 표현 가능
  • 여러 주요 터미널(예: Ghostty, iTerm2, SwiftTerm)이 이미 구현 중이며, 표준화된 자동 팔레트 생성 기능이 터미널 생태계 전반의 품질 향상으로 이어질 가능성 있음

256색 팔레트 개요

  • 256색 팔레트는 16개의 기본색, 216색 큐브, 24단계 그레이스케일로 구성
    • 기본 16색은 검정, 흰색, 원색 및 밝은 변형 포함
    • 216색 큐브는 RGB 각 채널에 6단계(0~5)를 사용하여 계산: 16 + (36 * R) + (6 * G) + B
    • 그레이스케일은 흑백 사이 24단계로 구성: 232 + S (S는 0~23)
  • 이 구조는 24비트 RGB의 단순화 버전으로, 색상 수를 줄이면서도 표현력을 확보

기존 256색 팔레트의 문제점

  • Base16 테마와의 불일치로 인해 색상 충돌 발생
    • 기본 팔레트는 대부분의 base16 테마와 조화되지 않음
  • 잘못된 색상 보간으로 인해 어두운 배경에서 가독성 저하
    • 기본 팔레트의 첫 번째 음영이 실제보다 밝게 계산되어 대비가 약화됨
  • 불균일한 대비 문제
    • 완전 채도의 색을 사용해 밝기 균형이 맞지 않으며, 같은 단계에서도 파란색이 녹색보다 어둡게 보임

팔레트 생성 방식

  • 해결책은 사용자의 base16 색상에서 256색 팔레트를 자동 생성하는 것
    • base16의 8개 기본색을 216색 큐브의 8개 꼭짓점에 매핑
    • 배경색과 전경색을 이용해 삼선형 보간(trilinear interpolation) 으로 큐브 생성
    • LAB 색공간을 사용해 색상 간 시각적 밝기 일관성 유지
  • 그레이스케일은 배경에서 전경으로의 단순 보간으로 생성
  • Python 예시 코드에서는 rgb_to_lab, lab_to_rgb, lerp_lab 함수를 사용해 변환 수행

구현 및 적용 현황

  • 제안된 코드는 퍼블릭 도메인으로 공개되어 자유롭게 수정·활용 가능
  • Ghostty, iTerm2, SwiftTerm 등 주요 터미널에서 이미 구현 완료
  • kitty, Wezterm, Tabby, Windows Terminal 등에서도 적용 요청 또는 개발 진행 중
  • 일부 개발자는 OKLAB/OKLCH 색공간 사용을 제안했으며, 프로젝트는 Ghostty의 결정에 따라 표준 색공간을 통일할 예정
  • Python 스크립트를 통해 직접 팔레트를 적용하거나, 터미널 설정 파일을 자동 생성 가능

결론 및 제안

  • 기본 256색 팔레트는 가독성 저하와 테마 불일치로 인해 프로그램 개발자들이 기피
  • 터미널이 base16 테마 기반으로 256색 팔레트를 자동 생성하면 다음과 같은 이점 확보
    • 설정 파일 없이도 넓은 색상 범위 사용 가능
    • 라이트/다크 모드 전환 시 개발자 개입 불필요
    • 광범위한 터미널 호환성 유지
  • 제안자는 이 기능이 기본 활성(opt-out) 되어야 하며, 장기적으로는 표준 기능으로 자리잡아야 함을 강조

Read Entire Article