2 คะแนน โดย GN⁺ 2024-10-04 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • ปัญหาเรื่องสีในเทอร์มินัลไม่ใช่เรื่องรสนิยมเท่านั้น แต่ใกล้เคียงกับ การขาดมาตรฐานและความแตกต่างของการติดตั้งใช้งาน ทำให้เอาต์พุตคำสั่งเดียวกันอาจอ่านยากได้ตามชุดของเทอร์มินัล ธีม และแอปที่ใช้
  • มีการใช้ทั้ง สี ANSI พื้นฐาน 16 สี, 256 สี และสี hex แบบ 24 บิตร่วมกัน แต่หมายเลขสีจะปรากฏเป็นสีจริงแบบใดนั้นแตกต่างกันไปตาม terminal emulator
  • ตัวอักษรสีน้ำเงิน/พื้นหลังสีดำ, สีเหลืองสว่าง/พื้นหลังสีขาว, การแมปสีเทาของ Solarized, สีพื้นหลังของ ngrok ล้วนเป็น การชนกันของคอนทราสต์ ที่เผยให้เห็นเมื่อสมมติฐานของโปรแกรมไม่ตรงกับธีมของผู้ใช้
  • แนวทางรับมือแบ่งเป็นหลายชั้น เช่น การรีเซ็ตพาเลต, base16-shell, LS_COLORS, NO_COLOR=true, --color=always, unbuffer และ การรองรับสี 24 บิต ของ Vim/Neovim
  • ฟีเจอร์ minimum contrast ของ iTerm2, tabby, kitty, Ghostty และ Windows Terminal ไม่ใช่วิธีแก้ที่สมบูรณ์แบบ แต่ช่วยลดความเสี่ยงที่จะเกิดเอาต์พุตที่อ่านไม่ได้

สี ANSI และความแตกต่างระหว่างเทอร์มินัล

  • เทอร์มินัลมักมี สี ANSI 16 สี ได้แก่ ดำ แดง เขียว เหลือง น้ำเงิน ม่วงแดง ฟ้าอมเขียว ขาว และเวอร์ชันสว่างของแต่ละสี
  • โปรแกรมระบุสีโดยส่งออก ANSI escape code
    • ตัวอย่างเช่น สามารถระบุหมายเลขสีพื้นหน้าในรูปแบบ \033[38;5;{num}m ได้
  • ปัญหาคือไม่มี มาตรฐานที่สม่ำเสมอ ว่าหมายเลขสี ANSI จะตรงกับสี hex ใดจริง ๆ
    • terminal emulator แต่ละตัวเลือกสีเอง
    • แม้แต่ตารางสี ANSI escape code ใน Wikipedia ก็มีความแตกต่างกันมากตามการติดตั้งใช้งาน
  • ความแตกต่างนี้อาจทำให้สีน้ำเงินที่ ls ใช้กับไดเรกทอรีมองเห็นได้ไม่ชัดบนพื้นหลังสีดำ
  • ชุดสีเหลืองสว่างกับพื้นหลังสีขาวก็แทบอ่านไม่ออก และปัญหาคล้ายกันอาจเกิดกับสีอื่นอย่างสีเขียวสว่างได้ด้วย

วิธีรีเซ็ตพาเลตสี

  • หากไม่ชอบสี ANSI พื้นฐานหรือมีปัญหาเรื่องคอนทราสต์ สามารถรับมือได้ด้วย การรีเซ็ตพาเลต
  • ตั้งค่าใน terminal emulator

    • terminal emulator สมัยใหม่ส่วนใหญ่มีฟังก์ชันให้รีเซ็ตสี
    • บางตัวมีธีมที่รวมมาให้ตั้งแต่ต้น
    • terminal emulator ที่ได้รับความนิยมมากกว่าอาจมีธีมให้เลือกมากกว่า
  • ตั้งค่าด้วยสคริปต์เชลล์

    • สามารถเปลี่ยนพาเลตสีของ terminal emulator ได้โดยส่งออก ANSI escape code
    • สคริปต์ Solarized Light ของ base16-shell ใช้ธรรมเนียม escape code หลายแบบตามแต่ละเทอร์มินัล
    • สคริปต์พยายามเลือกสไตล์ escape code ที่เหมาะสมตามตัวแปรสภาพแวดล้อม TERM
    • วิธีใช้สคริปต์เชลล์ช่วยให้คงการตั้งค่าสีเดิมได้ง่าย แม้เปลี่ยน terminal emulator
    • อย่างไรก็ตาม ไม่ใช่ terminal emulator ทุกตัวที่รองรับการเปลี่ยนพาเลตด้วยวิธีนี้ และแม้รองรับ ผลลัพธ์ก็อาจแตกต่างกันเล็กน้อย

256 สี, สี 24 บิต และธีมเฉพาะเครื่องมือ

  • เทอร์มินัลจำนวนมากรองรับวิธีระบุสี 3 แบบ
    • สี ANSI 16 สี
    • 256 สี แบบขยาย
    • สี hex 24 บิต เช่น #ffea03
  • fd ใช้ escape code อย่าง ^[[38;5;48m ในเอาต์พุตเพื่อระบุสีพื้นหน้าหมายเลข 48
    • สีนี้อาจดูเหมือนสีเขียวมะนาวที่ไม่มีในตารางสีเทอร์มินัลทั่วไป
    • อาจมีคอนทราสต์ไม่ดีกับตารางสีที่ใช้อยู่
  • bat ก็ใช้สีในลักษณะคล้ายกัน แต่ดูเหมือนเอาต์พุตพื้นฐานที่พยายามทำงานได้กับธีมเทอร์มินัลหลากหลายแบบ
  • เครื่องมือเทอร์มินัลรุ่นใหม่บางตัว เช่น fd, bat, delta รองรับธีมแบบกำหนดเองได้
    • ธีมพื้นฐานอาจชนกับพื้นหลังของเทอร์มินัล
    • แต่ก็ช่วยควบคุมธีมของเอาต์พุตจากเครื่องมือได้ละเอียดกว่าการเลือกใช้แค่สี ANSI 16 สี
  • เมื่อใช้ bat --theme ansi bat จะใช้สี ANSI ที่ตั้งไว้ในตารางสีเทอร์มินัลทั่วไป

ความขัดแย้งที่เกิดใน Solarized และ base16

  • Solarized Light อาจแสดง การแมปสี bright แตกต่างกันตามการติดตั้งใช้งาน
  • ธีม Solarized Light พื้นฐานของ iTerm แมปสีหมายเลข 9~14 หรือ “bright blue”, “bright red” เป็นต้น ไปยังกลุ่มสีเทา ตามดีไซน์ Solarized ดั้งเดิม
    • หาก ls ใช้สี bright กับไดเรกทอรีและไฟล์ executable ก็อาจมองเห็นเป็นสีเทา
  • base16 Solarized Light สามารถใช้เป็นรูปแบบดัดแปลงที่คงสี bright เป็นสีจริง ไม่ใช่สีเทา
  • ความแตกต่างนี้ดูเหมือนเป็นผลจากการที่ Solarized ดั้งเดิมถูกออกแบบมาให้ชุดสีของ Vim ใช้สีเทาได้
  • base16-shell ตั้งค่าสี 16~21 เพื่อให้สีเพิ่มเติมแก่ base16-vim
    • เมื่อ ngrok พยายามตั้งพื้นหลังเป็นสีหมายเลข 16 “black” หากสีนั้นถูกรีแมปเป็นสีส้มสว่าง ก็จะเกิดพื้นหลังที่แปลกมาก
    • การชนกันแบบนี้เกิดขึ้นได้ง่ายเมื่อโปรแกรมระบุสีพื้นหลัง ANSI และผู้ใช้รีแมปสีนั้นให้มีความหมายอื่น

ลดปัญหาคอนทราสต์ด้วย minimum contrast

  • เทอร์มินัลบางตัวมีฟีเจอร์ minimum contrast ที่ปรับสีอัตโนมัติเมื่อคอนทราสต์ระหว่างสีพื้นหน้ากับพื้นหลังไม่เพียงพอ
  • iTerm2, tabby, text_fg_override_threshold ของ kitty, Ghostty และ Windows Terminal มีฟีเจอร์นี้
  • เมื่อตั้งค่า minimum contrast ใน iTerm เป็น 40 เอาต์พุตที่อ่านยากอย่างกรณีสีพื้นหลังของ ngrok ชนกัน ก็อ่านง่ายขึ้น
  • เมื่อการตั้งค่าสีผิดพลาด หรือโปรแกรมกับธีมชนกัน minimum contrast เป็นกลไกป้องกันเชิงปฏิบัติที่ช่วยลด ปัญหาด้านความอ่านง่าย ที่เกิดโดยไม่ตั้งใจ

TERM, pipe และการปิดใช้สี

  • หากระบบที่เชื่อมต่อผ่าน SSH ไม่รองรับค่าตัวแปรสภาพแวดล้อม TERM ของเครื่อง local สีอาจทำงานไม่ถูกต้อง
  • ระบบใช้ฐานข้อมูล terminfo และหากค่า TERM ไม่มีอยู่ในฐานข้อมูลนั้น ก็ยากที่จะรู้ว่าควรส่งเอาต์พุตสีแบบใดให้ตรงกับเทอร์มินัล
  • แม้ไม่มีสภาพแวดล้อมที่ทำซ้ำได้ แต่คำตอบใน Stack Overflow แนะนำรูปแบบอย่าง TERM=xterm ssh แทน ssh
  • เมื่อเชื่อมคำสั่งด้วย pipe สีอาจถูกปิดใช้งาน
    • fd | less อาจแสดงผลโดยไม่มีสี
    • โดยทั่วไป การได้ข้อความธรรมดาโดยไม่มี escape code เมื่อต่อไปยังเครื่องมืออย่าง grep นั้นมีประโยชน์
  • หากต้องการคงสีไว้ สามารถใช้ unbuffer fd | less -r
    • unbuffer เปิด tty เพื่อให้คำสั่งรับรู้ว่ากำลังเขียนไปยัง TTY
    • และยังแก้ปัญหาเอาต์พุตของโปรแกรมถูกบัฟเฟอร์เมื่อเขียนไปยัง pipe
  • บางคำสั่ง เช่น fd สามารถส่งออกสีเสมอได้ด้วยแฟล็ก --color=always

ปิดหรือเปลี่ยนสีของ ls

  • ผู้ใช้บางคนไม่ต้องการเอาต์พุตสีของ ls
    • เพราะสีน้ำเงินอ่านยากบนพื้นหลังสีดำ
    • หรือไม่อยากปรับตารางสีเทอร์มินัล
    • หรือสีอาจไม่ได้ช่วยอะไรเลย
  • มีตัวเลือกหลายแบบ
    • ปิดสีด้วย ls --color=never
    • กำหนดสีที่ ls ใช้เองด้วยตัวแปรสภาพแวดล้อม LS_COLORS
    • บางโปรแกรมรองรับ NO_COLOR=true และมีรายการอยู่ที่ no-color.org
  • ตัวอย่างเช่น หากตั้งค่าเป็น LS_COLORS="fi=0:di=0:ln=0:pi=0:so=0:bd=0:cd=0:or=0:ex=0" ls ก็สามารถปรับสไตล์สีของไฟล์หลายชนิดให้เป็น 0 ได้

การเปลี่ยนแปลงของ Vim และ Neovim

  • การตั้งค่าสีของ Vim เคยมีปัญหามาก เพราะต้องทำให้ตารางสีเทอร์มินัลกับชุดสีของ Vim ตรงกัน
  • วิธีตั้งค่าชุดสีของ Vim ภายในเทอร์มินัลแบ่งกว้าง ๆ ได้ 2 แบบ
    • แมปคลาสสีของ Vim ไปยัง หมายเลขสี ANSI
    • ชุดสีใช้ สี hex 24 บิต เช่น #faea99 โดยตรง
  • เมื่อ 20 ปีก่อน เทอร์มินัลที่รองรับสี hex 24 บิตยังไม่แพร่หลาย และ Vim ก็ยังไม่รองรับการใช้สี 24 บิตในเทอร์มินัล
  • Vim เพิ่ม การรองรับสี 24 บิต ในปี 2016
  • Neovim 0.10 เปิดตัวในเดือนพฤษภาคม 2024 และในเทอร์มินัลที่รองรับสี 24 บิต termguicolors จะ เปิดเป็นค่าเริ่มต้น
  • หากในปี 2024 ไม่มีแผนจะใช้เทอร์มินัลที่ไม่รองรับสี 24 บิต ภาระที่ต้องซิงก์ตารางสีเทอร์มินัลกับชุดสีของ Vim ก็หมดไป
  • การเปลี่ยนแปลงนี้ทำให้ base16-shell จำเป็นต้องตั้งค่าสี 16~21 แบบพิเศษเพื่อเชื่อมกับ Vim น้อยลง
    • หากลบส่วนนั้นออก ก็หลีกเลี่ยงการชนกันอย่างพื้นหลังสีส้มของ ngrok ได้

ประสบการณ์ใช้งานและข้อจำกัดของ base16

  • เมื่อใช้ base16-shell ร่วมกับ base16-vim จะทำให้จับคู่สีของเทอร์มินัลและ Vim ได้ง่าย
  • สามารถตั้งค่าได้โดยเพิ่ม ไม่กี่บรรทัด ในการตั้งค่าของ fish และเพิ่มไม่กี่บรรทัดใน .vimrc
  • base16 ไม่ใช่วิธีที่เหมาะกับทุกคน
    • จำนวนธีมที่รวมมาให้มีจำกัด และอาจไม่มีธีมที่ถูกใจ
    • ธีม Solarized base16 ตั้งค่าสี bright ANSI ให้เหมือนกับสีปกติ ซึ่งอาจเป็นปัญหาสำหรับกรณีใช้งานที่ต้องการให้สี bright แตกต่างออกไป
    • วิธีตั้งค่าสี 16~21 เพื่อให้สีเพิ่มเติมแก่ base16-vim อาจไม่จำเป็นในสภาพแวดล้อมที่ใช้เฉพาะเทอร์มินัลที่รองรับสี 24 บิต
    • การตั้งค่าสี 16~21 อาจเกิดปัญหาในเทอร์มินัลที่ไม่รองรับ 256 สี เช่น Linux framebuffer terminal
  • มี tinted-theming เป็น community fork ของ base16

เครื่องมือทำตารางสีและธีมยอดนิยม

ปัญหาที่ยังเหลืออยู่

  • จุดที่หลายโปรแกรมมาบรรจบกัน เช่น ชุด tmux, SSH และ Vim อาจทำให้เกิดปัญหาสีเพิ่มเติม
  • การเลือกตารางสีที่ดีก็เป็นเรื่องยากในตัวเอง
    • ผู้ใช้ที่มีภาวะการมองเห็นสีผิดปกติอาจหาตารางสีที่เหมาะสมได้ยาก
    • หากสีพื้นหลังใกล้กับสีเคอร์เซอร์หรือสีพื้นที่ที่เลือกมากเกินไป ก็อาจหาตำแหน่งได้ยาก
    • การหาสีที่ทำงานได้ดีในทุกโปรแกรมเป็นเรื่องยาก และอาจเกิดการชนกันได้เหมือนกรณี ngrok
  • โปรแกรมที่คาดหวัง “ลุคคลาสสิก” แบบเฉพาะจากสี ANSI พื้นฐาน เช่น Nethack หรือ Midnight Commander อาจดูไม่คุ้นตาในธีมอย่าง Solarized
  • วิธีรับมือหนึ่งคือเปลี่ยนพาเลต ANSI ก่อนเรียกใช้โปรแกรม
    • เช่น รีแมปสีเหลืองให้เป็นสีเหลืองที่สว่างขึ้นก่อนเรียกใช้ Nethack
  • สำหรับผู้ใช้ที่แค่อยากให้สีทำงานได้ดีโดยอัตโนมัติ การตั้งค่าด้วยมือจำนวนมากถือเป็นภาระ ดังนั้นค่าเริ่มต้นที่สมเหตุสมผลและฟีเจอร์อย่าง minimum contrast จึงสำคัญ

1 ความคิดเห็น

 
GN⁺ 2024-10-04
ความคิดเห็นจาก Hacker News
  • ผมเคยเจอปัญหาแบบนี้และอีกมากมายตอนพยายามทำ ธีมสีสว่าง สำหรับระบบให้ดีจริง ๆ และมีสองเรื่องที่น่าสนใจเป็นพิเศษ
    พอมองย้อนกลับไปก็เป็นเรื่องที่แน่นอนอยู่แล้ว แต่ที่น่าประหลาดใจคือธีมสว่างจะดูต่างกันแบบละเอียดอ่อนมากกว่าธีมมืดเมื่อเปลี่ยนหน้าจอ แม้การตั้งค่าฮาร์ดแวร์และซอฟต์แวร์จะทำให้สีที่แสดงออกมาแตกต่างกัน แต่การเปลี่ยนแปลงที่เน้นบริเวณสว่างจะถูกรับรู้ได้เด่นกว่าการเปลี่ยนแปลงในบริเวณมืดมาก
    อีกอย่างคือบางครั้งต้องถอยลงไปใช้สภาพแวดล้อมที่รองรับฟอนต์และสีสันสวยงามได้จำกัด เช่นคอนโซลของ Linux หรือ BSD ซึ่งอาจทำให้ fd หรือ exa/lsd/whatever ใช้งานลำบากหรือถึงขั้นใช้ไม่ได้ โดยเฉพาะถ้าแมปตัวหลังไว้กับ ls ก็ยิ่งน่ารำคาญ หลังจากลองผิดลองถูกอยู่นาน ผมตั้งค่า fbterm เพื่อให้ได้ฟีเจอร์เทอร์มินัลที่พอใช้ได้แม้ไม่มี X แต่ fbterm ก็มีปัญหาเฉพาะตัวอยู่เหมือนกัน เวลาเซ็ตชุดสีของ Vim ควรเตรียม ธีมสำรอง สำหรับคอนโซลที่ความสามารถจำกัดไว้ หรือไม่ก็ฝึกพิมพ์คำสั่ง Vim แบบไม่ต้องมองให้มาก ๆ :D
    แก้ไข: ไม่ใช่สำหรับงานจริงจัง แต่เป็นหน้าจอ fbterm ที่ปรับสไตล์แล้วเพื่อแสดงให้เห็นว่าทำอะไรได้บ้างแม้ไม่มี X: https://i.imgur.com/RbDRgtD.png

    • เรื่องที่ธีมสว่างดูต่างกันละเอียดอ่อนกว่าตามแต่ละหน้าจอไม่น่าแปลกใจ ผมทำ การอัดภาพขาวดำแบบแอนะล็อก ด้วยฟิล์ม และเป็นที่รู้กันดีว่าดวงตามนุษย์จับความต่างของโทนเล็ก ๆ ในบริเวณสว่างของภาพพิมพ์ได้ดีกว่าบริเวณมืดมาก
      ดังนั้นเวลาปรับค่าแสงและคอนทราสต์ให้เหมาะสม จึงใช้เวลาพอสมควรไปกับการปรับไฮไลต์ให้ดู “พอดีเป๊ะ” ผมไม่ได้อัดภาพดิจิทัล แต่คิดว่าหลักการเดียวกันน่าจะใช้ได้
    • โดยปกติเราควรพึ่งพา ตัวแปร TERM ที่ตั้งค่าไว้อย่างถูกต้องได้ และยูทิลิตีบรรทัดคำสั่งก็ควรเคารพความสามารถที่รู้ได้จากตัวแปร TERM
      น่าเสียดายที่เฟรมเวิร์กเครื่องมือบรรทัดคำสั่ง “สมัยใหม่” ซึ่งมักเขียนด้วย JavaScript มีแนวโน้มจะละเลยเรื่องนี้
      https://www.gnu.org/software/gettext/manual/html_node/The-TE...
    • เมื่อไม่นานมานี้ผมพยายามแสดงชุดข้อมูลจำนวนมากในกราฟ Excel ด้วยสีต่าง ๆ กัน และตัวเลือกที่ดีที่สุดสำหรับการแยกแยะสีจำนวนมากได้ง่ายคือ สีรุ้ง แบบสเปกตรัมล้วนบนพื้นหลังสีดำ
      ยังมีการตั้งค่าให้จุดข้อมูลมีเอฟเฟกต์ “แสงฟุ้ง” จาง ๆ สีเดียวกัน ทำให้ดูเหมือนจุดเรืองแสงด้วย เมื่อมองจากมุมความอิ่มตัวของสี หรือก็คืออัตราส่วนสัญญาณต่อสัญญาณรบกวนตลอดทั้งสเปกตรัม ก็สมเหตุสมผลที่พื้นหลังสีดำจะดีกว่า
      ใช้สีต่างกันประมาณ 10 สีได้แทบไม่มีปัญหา อีกทั้งสีเหลืองอยู่ระหว่างสีแดงกับสีเขียว สีส้มอยู่ระหว่างสีแดงกับสีเหลือง จึงมีข้อดีในการสื่อ ข้อมูลลำดับ/ระยะห่าง ทำให้แบ่งย่อยและตีความได้ง่ายว่าสองสีอยู่ใกล้กันแค่ไหน
    • ต่อให้มีฟอนต์สวยและธีมสีดูดี ก็พังได้ด้วย พื้นหลัง เพียงอย่างเดียวที่ทำให้ตัวอักษรบางตัวอ่านยาก
  • จริง ๆ แล้วไม่ได้มองว่ายากขนาดนั้น
    ขั้นที่ 1: เทอร์มินัลอีมูเลเตอร์ส่วนใหญ่มีพาเล็ตสีเริ่มต้นที่แย่มาก ก็แค่เปลี่ยนมัน ส่วนตัวชอบ Solarized โดยเฉพาะธีมมืด แต่ธีมสว่างก็ใช้ได้ แม้ไม่ใช่ Solarized ก็มีธีมมากมายที่ทำให้อ่านสีใด ๆ ได้บนพื้นหลังเริ่มต้น
    ขั้นที่ 2: ควรหลีกเลี่ยงเครื่องมือบรรทัดคำสั่งที่ใช้ escape sequence สีแบบ 8 บิตหรือ 24 บิตเป็นค่าเริ่มต้น เรื่องนี้อาจถกเถียงกันได้ แต่ส่วนตัวมองว่าไม่เป็นมิตรต่อผู้ใช้ ผมเลือกพาเล็ตสีเทอร์มินัลที่ดีที่สุดให้ตรงกับความต้องการด้านความอ่านง่ายของตัวเองไว้แล้ว การที่นักพัฒนาคิดว่าตัวเองเป็นนักออกแบบจำแลงแล้วมาเขียนทับมันไม่ได้ช่วยอะไรเลย เครื่องมืออาจมีตัวเลือกให้เปิดธีมภายในได้ แต่ควรเป็นสิ่งที่ผู้ใช้เลือกเอง ไม่ใช่ค่าเริ่มต้น
    ในฐานะคนที่ใช้ชีวิตส่วนใหญ่อยู่ในเทอร์มินัล แค่รักษากฎสองข้อนี้ก็สร้างสภาพแวดล้อมเทอร์มินัลที่สม่ำเสมอและอ่านง่ายได้แทบไม่ต้องตั้งค่าเพิ่ม ปัญหาจริง ๆ คือเรายอมให้บรรดานักพัฒนาใช้ escape code สีแบบ 8 บิตและ 24 บิตกันมากเกินไป

    • เรื่องนี้เกี่ยวพันกับปัญหาเรื่อง ค่าเริ่มต้นที่ดี ถ้าผู้ใช้ต้องตั้งค่าเอง ก่อนอื่นก็ต้องรู้ว่ามันตั้งค่าได้ และต้องลงมือตั้งค่าจริง ๆ นี่เป็นอุปสรรคใหญ่ และมีผู้ใช้น้อยมากที่ทำได้
      หลายปีผ่านไป ผมได้ข้อสรุปว่าฟีเจอร์ใหม่ ๆ ต้องถูกนำไปวางไว้ต่อหน้าผู้ใช้ และค่าเริ่มต้นที่ดีต้องถูกผลักดันอย่างแข็งแรง ไม่เช่นนั้นฟีเจอร์แทบจะไม่ถูกใช้
      สีแบบ 8 บิตและ 24 บิตเป็นฟีเจอร์ที่ใช้งานแบบเลือกได้อยู่แล้ว และก็ตั้งค่าได้ด้วย ถ้าเป็นโปรแกรมเทอร์มินัลที่ทำงานได้ดี ตัวแปรสภาพแวดล้อม TERM และ COLORTERM จะเป็นตัวตัดสินว่าจะใช้สีเหล่านั้นหรือไม่
    • โดยเฉพาะ Solarized Dark ไม่เหมาะกับการใช้งานเทอร์มินัลนัก เพราะผู้เขียนกำหนด “bright black” ให้เป็นสีที่แทบเหมือนกับพื้นหลัง
      แอปพลิเคชันจำนวนมากคาดหวังว่าข้อความ “bright black” จะมองเห็นได้บนพื้นหลัง มีตัวอย่างมากมายที่นี่: https://github.com/altercation/solarized/issues/220
      พาเล็ตสีอื่น ๆ แทบทั้งหมดจะแสดง “bright black” เป็นสีเทาที่อ่านได้บนพื้นหลังสีดำ
    • แม้จะมีธีมที่ทำให้อ่านสีใด ๆ ได้บนพื้นหลังเริ่มต้น แต่ก็มีแอปพลิเคชันที่กำหนดทั้งสีข้อความและสีพื้นหลัง
      เช่น pamix ตั้งพื้นหลังเป็นสีดำ ส่วนแถบสถานะของ tmux หรือ ngrok ก็คล้ายกัน แล้วก็ทำให้ต้องตกลงไปใน โพรงกระต่าย เพื่อจัดการกับมัน
    • ควรถามก่อนว่า “วิธีจัดการที่ดีที่สุดคืออะไร?” แต่ตรงนี้ต้องนิยามคำว่า ดี ก่อน โดยส่วนตัวผมชอบหลักการที่ว่าการตั้งค่าปรับแต่งของผู้ใช้ควรอยู่ในที่เดียว และผลกระทบต่อโปรแกรมควรน้อยที่สุดในแง่เช่นจำนวนบรรทัดโค้ด
      ทั้งสองอย่างบ่งชี้ว่าโซลูชันควรอยู่ที่เทอร์มินัล โปรแกรมเทอร์มินัลควรมีสีเริ่มต้นที่สมเหตุสมผลตั้งแต่แรก สีน้ำเงินควรเป็นสีน้ำเงินที่แยกออกได้ และควรคำนึงถึงความบกพร่องในการมองเห็นสีที่พบได้บ่อยด้วย เช่น สีแดงล้วนบนพื้นหลังสีดำอ่านยาก ดังนั้นอย่าใช้แค่ ff0000 อย่างเดียว แต่ควรผสมอะไรเข้าไปบ้าง
      เมื่อเทอร์มินัลมีค่าเริ่มต้นที่สมเหตุสมผล โปรแกรมบรรทัดคำสั่งก็แค่ใช้สีมาตรฐาน 16 สีพอ ความพยายามจะใช้สี 24 บิตตรงนี้คล้ายกับการบอกว่า “เลิกหวังให้ฝั่งเทอร์มินัลมอบความปกติให้แล้ว” หรือ “ฉันรู้ดีที่สุด” และสุดท้ายผู้ใช้ต้องไปตั้งค่าโปรแกรม N ตัวทีละตัว ผมคิดว่าสิ่งที่ดีที่สุดคือไม่ควรกำหนดธีมไว้ในแอปบรรทัดคำสั่ง
      เว็บไซต์และฟอนต์ก็คล้ายกัน คอนเทนต์ควรจัดส่งเป็น HTML เพื่อให้ผู้ใช้ดูได้ในแบบที่ต้องการ และการจัดวางหน้าก็ควรไหลลื่น ไม่ใช่ยึดตายตัวเหมือนเลย์เอาต์นิตยสาร
      ซอฟต์แวร์เดสก์ท็อปก็คล้ายกัน Wayland compositor ควรจดจำตำแหน่งหน้าต่าง การที่โปรแกรม X แต่ละตัวบันทึกและกู้คืนตำแหน่งหน้าต่างของตัวเองนั้นเป็นเรื่องโง่ Wayland บอกว่าการรู้ข้อมูลสภาพแวดล้อมเป็นปัญหาด้านความปลอดภัย และผมเห็นด้วยกับข้อนั้น แต่ถ้าอย่างนั้นการจดจำนี้ก็เป็นงานของสภาพแวดล้อมเดสก์ท็อป และยังสามารถตัดโค้ดส่วนนั้นออกจากทุกแอปได้ด้วย
      คำถามว่า “ควรจัดการเรื่องนี้ตรงไหนในซอฟต์แวร์สแต็ก?” เป็นสิ่งที่เกิดซ้ำในหลายพื้นที่ เมื่อเลือกว่าจะวางไว้ที่ไหน ต้องตอบก่อนว่าเป้าหมายคืออะไร และคำตอบของผมมักเอนเอียงไปทางความเรียบง่ายและความดูแลรักษาง่ายเสมอ
    • สงสัยเหมือนกันว่าจริง ๆ แล้วการหลีกเลี่ยงเครื่องมือบรรทัดคำสั่งที่ใช้ escape sequence สีแบบ 8 บิตหรือ 24 บิตเป็นค่าเริ่มต้นนั้นยากแค่ไหน
      บทความของ Julia ก็พูดถึงแนวคิดนี้ แต่ไม่ได้ลงรายละเอียดถึงความลำบากที่เป็นรูปธรรม นอกจากนี้ยังสงสัยด้วยว่าพาเล็ตสีเทอร์มินัลเกี่ยวข้องแค่ สีพื้นฐาน 16 สี หรือไปแตะพื้นที่ RGB และโทนเทาด้วยหรือไม่ เพราะสีแบบ 8 บิตและ 16 บิตก็น่าจะปรับให้ตรงกับความต้องการด้านความอ่านง่ายได้เช่นกัน
  • ถ้าอยู่ในฐานะคนเลือกสี ก็น่าลองตรวจสีด้วย อัลกอริทึม APCA (Advanced Perception of Colour) ใหม่
    APCA มีแผนจะมาแทนวิธีคอนทราสต์แบบ x:y เดิมใน WCAG 3.0 ในอนาคต แต่อาจต้องใช้เวลาอีกหลายปี ว่ากันว่ามันคำนึงถึงขนาดฟอนต์ น้ำหนักตัวอักษร สีหน้า/สีหลัง ไปจนถึงแสงแวดล้อมและสภาพแวดล้อม รวมถึงการใช้งานที่ตั้งใจไว้ด้วย
    ถ้าเทอร์มินัลอีมูเลเตอร์ใช้เซ็นเซอร์วัดแสงของอุปกรณ์เพื่อปรับคอนทราสต์ให้เหมาะกับปัจจัยด้านสภาพแวดล้อมได้ ก็น่าจะดีทีเดียว

    • พาเล็ตสีเทอร์มินัลที่ใช้อยู่ตอนนี้ผมปรับเองแบบนี้ เพราะหา theme สำเร็จรูปที่ตอบสนอง ข้อกำหนดด้านคอนทราสต์ ส่วนตัวสำหรับสี ANSI ทั้งหมดไม่ได้เลย
  • มีคนบ้าสุดโต่งบางกลุ่มที่อยากปิดสีไปเลยด้วย[0] อยากลองเองเหมือนกัน แต่ก็ชอบสีสวย ๆ ด้วย
    [0] https://no-color.org/

    • :syntax off คือการตั้งค่า Vim เพียงอย่างเดียวของผม เพราะชุดสีของเทอร์มินัลถูกออกแบบโดยโปรแกรมเมอร์คอมพิวเตอร์ วิศวกรไฟฟ้า และคนที่ไม่รู้ว่าสิ่งสำคัญของสีไม่ใช่ตัวสีเอง แต่คือ ความสว่าง
    • พอคุ้นกับเทอร์มินัลขาวดำแล้ว จะเริ่มรู้สึกว่าสีส่วนใหญ่รกตาและดึงความสนใจ
      สงสัยว่ามีความสัมพันธ์กันไหมระหว่างคนที่ไม่อยากได้สีในเทอร์มินัล กับคนที่ใช้ตัวบล็อกโฆษณาแรง ๆ ในเบราว์เซอร์หรือใช้โหมดอ่านบ่อย ๆ
    • color sequence ขึ้นชื่อว่าไม่พกพาและก่อปัญหาได้ ตัวอย่างเช่น รายงาน pytest ที่มีสีทำให้เซสชัน Jupyter ตายได้
      เมื่อส่งเอาต์พุตผ่าน pipe สีจะกลายเป็นแค่ ภาระ โดยแทบไม่มีประโยชน์เลย ประเด็นหลักใกล้เคียงกับเรื่องการมีทางเลือกมากกว่า
    • ผมก็เป็นฝ่ายนั้นเหมือนกัน โดยเฉพาะตอนเขียนโค้ด ผมมองว่าการลงสีแทบทั้งหมดทำให้เสียสมาธิและให้ผลตรงข้าม
      ยิ่งสลับไปมาระหว่าง Linux กับ Windows ยิ่งแย่ การใช้สีเริ่มต้นของเครื่องมือจำนวนมากแทบใช้ไม่ได้ หรือทำให้ใช้งานไม่ได้จริง ๆ
      เครื่องมือบางตัวมีออปชัน --color=never และมีเครื่องมือจำนวนไม่น้อยที่เคารพ NO_COLOR แต่น่าเสียดายที่ไม่ใช่ทั้งหมด และแม้แต่เครื่องมือที่บอกว่าทำแบบนั้น บางครั้งก็สมมติว่าโหมดนั้นจะใช้เฉพาะกับ pipeline หรืออินเทอร์เฟซสำหรับโปรแกรมมิงเท่านั้น จึงเกิดพฤติกรรมแย่ ๆ สารพัด
    • ผมก็เริ่มไปทางนั้นเหมือนกัน ดู zenbones อยู่พักหนึ่ง แล้วสุดท้ายลงเอยที่ https://github.com/savq/melange-nvim
      มันมีแนวคิดพาเล็ตสีที่สอดคล้องกันในแง่ อุณหภูมิสี ที่มีความหมาย และเอนเอียงไปทางโทนอุ่นเพื่อให้ดวงตาที่ต้องมองแสงอมฟ้ามากเกินไปล้าน้อยลง มีพาเล็ตสีสำหรับ alacritty มาให้ด้วย
  • อยากใช้ ธีมสว่าง กับเทอร์มินัลมานานแล้ว แต่มีโปรแกรมมากเกินไปที่ใช้สีแบบ non-ANSI ที่ปรับเองโดยเหมาะกับพื้นหลังเทอร์มินัลสีเข้ม จึงต้องยอมแพ้ทุกครั้ง
    บางโปรแกรมตั้งค่าสีได้ แต่การไล่ตั้งค่าทุกโปรแกรมทีละตัวรู้สึกยุ่งยากเกินไป ตอนนี้เลยใช้พื้นหลังเทอร์มินัลสีเข้ม แต่เลือกธีม ANSI เองที่สีทั้งหมดมี contrast ratio เพียงพอตามเกณฑ์ของผม และผ่านการตรวจ contrast แบบ APCA/WCAG 3 ด้วย พอใจแล้ว :)

    • สำหรับคนที่มี high-order visual aberrations โหมดมืด ไม่ใช่ตัวเลือกตั้งแต่แรก ในทางกลับกัน สำหรับบางคนที่เป็นต้อกระจก โหมดสว่างก็อาจเป็นแบบนั้นได้
      ถ้าใช้ control sequence OSC 11 โปรแกรมจะตรวจจับสีพื้นหลังได้ แต่แทบไม่มีโปรแกรมไหนสนใจ โดยทั่วไปถ้าใครสักคนคิดว่าข้อความเตือนสีเหลืองดูเท่ เรื่องก็จบแค่นั้น
      เรื่องนี้นำไปสู่อีกปัญหาหนึ่ง มีเทอร์มินัลยอดนิยมบางตัวที่ตั้ง TERM=xterm256-color เป็นค่าเริ่มต้น ทั้งที่ไม่ได้เข้ากันได้กับ xterm
      แก้ไข: เพิ่งพบ xtermcontrol ซึ่งช่วย abstract การตรวจพื้นหลังในสคริปต์ได้ และมีอยู่ใน package manager หลัก ๆ ทั้งหมด
    • ช่วงหนึ่งเคยแกล้งทำเป็น เทอร์มินัล 16 สีที่ไม่รองรับ 256 สี เพื่อหลีกเลี่ยงนรกของการตั้งค่านี้ คิดว่าไม่มีสียังดีกว่าสีแย่ ๆ เลยลอง https://no-color.org/ ด้วย
      ช่วงนี้ยอมแพ้แล้ว และตั้งค่าแอปส่วนใหญ่ด้วยมือให้ใช้สี ANSI เช่น fzf มีสวิตช์ใน command line ส่วน Vim กับ Emacs ปล่อยไว้เป็นแอป non-ANSI แล้วตั้งค่าให้เข้ากับพาเล็ตสีที่ใช้ในเทอร์มินัลอื่น ๆ ถ้าต้องการก็ไปต่ออีกขั้นด้วยอย่าง vim-dim ได้
    • เทอร์มินัลจำนวนมาก เช่น konsole ของ trinity/tde3 ปรับ สีพื้นฐาน เองได้ จึงช่วยได้
    • บน iTerm ของ macOS และโปรแกรมที่ผมใช้ เช่น neovim ไม่เจอปัญหา และแม้แต่ค่าเริ่มต้นก็ดูใช้ได้
  • ใน Emacs มี frame-background-mode[0] ที่คนไม่ค่อยเจอ ซึ่งโดยพื้นฐานแล้วเป็นค่า light หรือ dark อย่างใดอย่างหนึ่ง
    เวลาสงสัยว่าทำไม Emacs ถึงเลือกสีแปลก ๆ ให้บางรายการ ส่วนใหญ่มักเป็นเพราะ frame-background-mode ผิด
    [0]https://doc.endlessparentheses.com/Var/frame-background-mode...

    • ปัญหารากฐานมักอยู่ที่เทอร์มินัลตั้งค่าตัวแปร COLORFGBG ไม่ได้
      สำหรับเทอร์มินัลพื้นหลังมืดตัวอักษรขาว ใช้ export COLORFGBG='15;0'
      สำหรับเทอร์มินัลพื้นหลังสว่างตัวอักษรดำ ใช้ export COLORFGBG='0;15'
    • ลิงก์ที่ดีกว่า: <https://www.gnu.org/software/emacs/manual/html_node/emacs/Fa...>
  • ใช้ พาเล็ตสี FlatUI ที่ปรับเล็กน้อยมาเกือบ 10 ปีแล้ว และแทบไม่เคยเจอสถานการณ์ที่เป็นปัญหาจริง ๆ
    ไฟล์ png: https://drive.google.com/file/d/1mkMESeGf7MNdKa-rPDx7Yf9BDit...
    ลิงก์ imgur: https://imgur.com/a/flatui-7mqVZAY
    อิงจาก: https://flatuicolors.com/palette/defo

    • ดูคล้ายกับธีม One Dark ที่จำได้ว่าน่าจะมาจากเอดิเตอร์ Atom
      ผมก็ใช้ธีมของตัวเองมาเกือบ 10 ปีแล้วเหมือนกัน ใช้งานได้ดีกับ iTerm, vim, Emacs, vscode ฯลฯ
  • ใช้ Apple Terminal มานาน และเมื่อก่อนเคยมีชุดพาเล็ตสีดี ๆ ชื่อ “Terminal Fructose” เลยใช้สีพื้นหลังต่างกันตามงานอยู่บ่อย ๆ Apple เองก็เคยบิวต์สิ่งนั้นเข้ามาเป็นธีมในช่วงหนึ่ง
    แต่ Apple ปล่อยปละการรองรับ Terminal มานาน ไม่รองรับเกิน 256 สี และยังขาดฟีเจอร์สมัยใหม่กว่า อีกทั้งไม่ค่อยเข้ากับชุดตั้งค่า Neovim+LazyVim ด้วย
    พยายามหาเทอร์มินัลที่ดีกว่า เลยสลับไปมาระหว่าง iTerm2, Kitty, Alacritty, Wezterm แต่ทั้งหมดดูทันสมัยกว่าก็จริง ทว่าไม่มีตัวเลือกพื้นฐานอย่าง “New Window with Profile ...” สำหรับเปิดหน้าต่างที่มีสีพื้นหลัง/ธีมต่าง ๆ ได้อย่างรวดเร็ว อย่างน้อยก็ถ้าไม่ต้องลงแรงงมอยู่บ้าง
    ตอนนี้ลงเอยกับ Wezterm โดยเหตุผลหลักคือมันทำงานบน Windows ได้ด้วย และแชร์การตั้งค่า wezterm.lua ได้ อนึ่ง Windows Terminal เองก็ถือว่าดีทีเดียว ถึงอย่างนั้นสำหรับงานเร็ว ๆ เช่นใช้ python3 เป็น REPL เพื่อคำนวณหรือทดสอบเลขฐาน 16/ฐาน 2 ก็ยังมักเปิด Apple Terminal อยู่ดี

    • iTerm มีฟีเจอร์นั้นตรง ๆ เลย
    • แปลกนะ ผมเลิกใช้ Apple Terminal แล้วไป iTerm2 เร็วมาก ก็เพราะมันรองรับ “new tab with profile” นี่แหละ
    • เหตุผลที่ยังใช้ Wezterm ต่อมีสองอย่าง คือแชร์การตั้งค่าข้ามหลายแพลตฟอร์มได้ง่าย และภาษาตั้งค่าเป็น Lua
      มีบางฟีเจอร์ใน iTerm2 ที่คิดถึงอยู่เหมือนกัน แต่ส่วนใหญ่เกี่ยวกับเมาส์ นอกเหนือจากนั้นก็ใช้เวลาตอนเย็นอยู่สองสามวันตั้งค่าให้ได้ตามต้องการ และหลังจากทำให้ cmd-n เปิดหน้าต่างใหม่จากไดเรกทอรีเริ่มต้น ไม่ใช่ไดเรกทอรีปัจจุบัน ก็ใช้อย่างพอใจมาตลอด
    • ถ้าอยากเพิ่ม “New Window with Profile...” ใน WezTerm น่าจะพอแฮ็กอะไรบางอย่างใส่ได้ทาง launch_menu [1] ที่เริ่มเชลล์ตัวอื่น หรือ augment-command-palette [2] ที่เพิ่มรายการเข้าไปใน command palette
      [1] https://wezfurlong.org/wezterm/config/lua/config/launch_menu...
      [2] https://wezfurlong.org/wezterm/config/lua/window-events/augm...
      ใช่ ต้องลงแรงงมอยู่บ้าง แต่การได้โปรแกรมฟีเจอร์เฉพาะมาก ๆ ให้เป็นไปตามแบบที่ต้องการเป๊ะ ๆ นี่แหละคือจุดสุดยอดของ ประสบการณ์แบบ WezTerm
    • Konsole ซึ่งเป็นเทอร์มินัลของ KDE รองรับสิ่งนี้ ทำได้จากเมนู หรือกดไอคอนแท็บใหม่ค้างไว้ เท่าที่รู้ใช้บน MacOS ได้ด้วย
  • ไม่ใช่แค่เทอร์มินัลเท่านั้น แม้แต่ป้ายนีออนหรือป้าย LED สีน้ำเงิน ก็ทรมานตาที่สุดในตอนกลางคืน
    มองจากไกล ๆ จะพร่ามัวและโฟกัสไม่ชัดเสมอ พอเห็นบริษัทใหญ่ ๆ ติดป้ายมหึมาด้วยไฟสีน้ำเงิน ก็อดทึ่งไม่ได้ว่าพวกเขาใช้เงินมากมายโดยไม่รู้ตัวด้วยซ้ำว่าคนอ่านไม่ออก

  • ตั้งค่าแล็ปท็อปให้สลับโหมดสว่าง/มืดอัตโนมัติตามวัฏจักรแสงอาทิตย์ไว้ แต่จำนวน แอปพลิเคชันที่แสดงผลสี แล้วพังเมื่อเปลี่ยนเป็นโหมดพื้นหลังสว่างตัวอักษรมืดนั้นน่าตกใจมาก
    ถ้าจะทำเครื่องมือ command-line แล้วจำเป็นต้องใช้สีจริง ๆ ก็ควรใช้แค่ ANSI 16 สี หรือไม่ก็ให้ผู้ใช้ปลายทางเปลี่ยนพาเล็ตสีได้