สีในเทอร์มินัลเป็นเรื่องยุ่งยาก
(jvns.ca)- ปัญหาเรื่องสีในเทอร์มินัลไม่ใช่เรื่องรสนิยมเท่านั้น แต่ใกล้เคียงกับ การขาดมาตรฐานและความแตกต่างของการติดตั้งใช้งาน ทำให้เอาต์พุตคำสั่งเดียวกันอาจอ่านยากได้ตามชุดของเทอร์มินัล ธีม และแอปที่ใช้
- มีการใช้ทั้ง สี 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 ansibatจะใช้สี 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 -runbufferเปิด 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
เครื่องมือทำตารางสีและธีมยอดนิยม
- rootloops.sh เป็นเครื่องมือสำหรับสร้างตารางสี
- บทความที่ควรอ่านประกอบคือ “let’s create a terminal color scheme”
- ตารางสียอดนิยมที่ถูกกล่าวถึงในคำตอบบน Mastodon มีดังนี้
ปัญหาที่ยังเหลืออยู่
- จุดที่หลายโปรแกรมมาบรรจบกัน เช่น ชุด
tmux, SSH และ Vim อาจทำให้เกิดปัญหาสีเพิ่มเติม - การเลือกตารางสีที่ดีก็เป็นเรื่องยากในตัวเอง
- ผู้ใช้ที่มีภาวะการมองเห็นสีผิดปกติอาจหาตารางสีที่เหมาะสมได้ยาก
- หากสีพื้นหลังใกล้กับสีเคอร์เซอร์หรือสีพื้นที่ที่เลือกมากเกินไป ก็อาจหาตำแหน่งได้ยาก
- การหาสีที่ทำงานได้ดีในทุกโปรแกรมเป็นเรื่องยาก และอาจเกิดการชนกันได้เหมือนกรณี
ngrok
- โปรแกรมที่คาดหวัง “ลุคคลาสสิก” แบบเฉพาะจากสี ANSI พื้นฐาน เช่น Nethack หรือ Midnight Commander อาจดูไม่คุ้นตาในธีมอย่าง Solarized
- วิธีรับมือหนึ่งคือเปลี่ยนพาเลต ANSI ก่อนเรียกใช้โปรแกรม
- เช่น รีแมปสีเหลืองให้เป็นสีเหลืองที่สว่างขึ้นก่อนเรียกใช้ Nethack
- สำหรับผู้ใช้ที่แค่อยากให้สีทำงานได้ดีโดยอัตโนมัติ การตั้งค่าด้วยมือจำนวนมากถือเป็นภาระ ดังนั้นค่าเริ่มต้นที่สมเหตุสมผลและฟีเจอร์อย่าง minimum contrast จึงสำคัญ
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
ผมเคยเจอปัญหาแบบนี้และอีกมากมายตอนพยายามทำ ธีมสีสว่าง สำหรับระบบให้ดีจริง ๆ และมีสองเรื่องที่น่าสนใจเป็นพิเศษ
พอมองย้อนกลับไปก็เป็นเรื่องที่แน่นอนอยู่แล้ว แต่ที่น่าประหลาดใจคือธีมสว่างจะดูต่างกันแบบละเอียดอ่อนมากกว่าธีมมืดเมื่อเปลี่ยนหน้าจอ แม้การตั้งค่าฮาร์ดแวร์และซอฟต์แวร์จะทำให้สีที่แสดงออกมาแตกต่างกัน แต่การเปลี่ยนแปลงที่เน้นบริเวณสว่างจะถูกรับรู้ได้เด่นกว่าการเปลี่ยนแปลงในบริเวณมืดมาก
อีกอย่างคือบางครั้งต้องถอยลงไปใช้สภาพแวดล้อมที่รองรับฟอนต์และสีสันสวยงามได้จำกัด เช่นคอนโซลของ Linux หรือ BSD ซึ่งอาจทำให้
fdหรือexa/lsd/whateverใช้งานลำบากหรือถึงขั้นใช้ไม่ได้ โดยเฉพาะถ้าแมปตัวหลังไว้กับlsก็ยิ่งน่ารำคาญ หลังจากลองผิดลองถูกอยู่นาน ผมตั้งค่า fbterm เพื่อให้ได้ฟีเจอร์เทอร์มินัลที่พอใช้ได้แม้ไม่มี X แต่ fbterm ก็มีปัญหาเฉพาะตัวอยู่เหมือนกัน เวลาเซ็ตชุดสีของ Vim ควรเตรียม ธีมสำรอง สำหรับคอนโซลที่ความสามารถจำกัดไว้ หรือไม่ก็ฝึกพิมพ์คำสั่ง Vim แบบไม่ต้องมองให้มาก ๆ :Dแก้ไข: ไม่ใช่สำหรับงานจริงจัง แต่เป็นหน้าจอ fbterm ที่ปรับสไตล์แล้วเพื่อแสดงให้เห็นว่าทำอะไรได้บ้างแม้ไม่มี X: https://i.imgur.com/RbDRgtD.png
ดังนั้นเวลาปรับค่าแสงและคอนทราสต์ให้เหมาะสม จึงใช้เวลาพอสมควรไปกับการปรับไฮไลต์ให้ดู “พอดีเป๊ะ” ผมไม่ได้อัดภาพดิจิทัล แต่คิดว่าหลักการเดียวกันน่าจะใช้ได้
น่าเสียดายที่เฟรมเวิร์กเครื่องมือบรรทัดคำสั่ง “สมัยใหม่” ซึ่งมักเขียนด้วย JavaScript มีแนวโน้มจะละเลยเรื่องนี้
https://www.gnu.org/software/gettext/manual/html_node/The-TE...
ยังมีการตั้งค่าให้จุดข้อมูลมีเอฟเฟกต์ “แสงฟุ้ง” จาง ๆ สีเดียวกัน ทำให้ดูเหมือนจุดเรืองแสงด้วย เมื่อมองจากมุมความอิ่มตัวของสี หรือก็คืออัตราส่วนสัญญาณต่อสัญญาณรบกวนตลอดทั้งสเปกตรัม ก็สมเหตุสมผลที่พื้นหลังสีดำจะดีกว่า
ใช้สีต่างกันประมาณ 10 สีได้แทบไม่มีปัญหา อีกทั้งสีเหลืองอยู่ระหว่างสีแดงกับสีเขียว สีส้มอยู่ระหว่างสีแดงกับสีเหลือง จึงมีข้อดีในการสื่อ ข้อมูลลำดับ/ระยะห่าง ทำให้แบ่งย่อยและตีความได้ง่ายว่าสองสีอยู่ใกล้กันแค่ไหน
จริง ๆ แล้วไม่ได้มองว่ายากขนาดนั้น
ขั้นที่ 1: เทอร์มินัลอีมูเลเตอร์ส่วนใหญ่มีพาเล็ตสีเริ่มต้นที่แย่มาก ก็แค่เปลี่ยนมัน ส่วนตัวชอบ Solarized โดยเฉพาะธีมมืด แต่ธีมสว่างก็ใช้ได้ แม้ไม่ใช่ Solarized ก็มีธีมมากมายที่ทำให้อ่านสีใด ๆ ได้บนพื้นหลังเริ่มต้น
ขั้นที่ 2: ควรหลีกเลี่ยงเครื่องมือบรรทัดคำสั่งที่ใช้ escape sequence สีแบบ 8 บิตหรือ 24 บิตเป็นค่าเริ่มต้น เรื่องนี้อาจถกเถียงกันได้ แต่ส่วนตัวมองว่าไม่เป็นมิตรต่อผู้ใช้ ผมเลือกพาเล็ตสีเทอร์มินัลที่ดีที่สุดให้ตรงกับความต้องการด้านความอ่านง่ายของตัวเองไว้แล้ว การที่นักพัฒนาคิดว่าตัวเองเป็นนักออกแบบจำแลงแล้วมาเขียนทับมันไม่ได้ช่วยอะไรเลย เครื่องมืออาจมีตัวเลือกให้เปิดธีมภายในได้ แต่ควรเป็นสิ่งที่ผู้ใช้เลือกเอง ไม่ใช่ค่าเริ่มต้น
ในฐานะคนที่ใช้ชีวิตส่วนใหญ่อยู่ในเทอร์มินัล แค่รักษากฎสองข้อนี้ก็สร้างสภาพแวดล้อมเทอร์มินัลที่สม่ำเสมอและอ่านง่ายได้แทบไม่ต้องตั้งค่าเพิ่ม ปัญหาจริง ๆ คือเรายอมให้บรรดานักพัฒนาใช้ escape code สีแบบ 8 บิตและ 24 บิตกันมากเกินไป
หลายปีผ่านไป ผมได้ข้อสรุปว่าฟีเจอร์ใหม่ ๆ ต้องถูกนำไปวางไว้ต่อหน้าผู้ใช้ และค่าเริ่มต้นที่ดีต้องถูกผลักดันอย่างแข็งแรง ไม่เช่นนั้นฟีเจอร์แทบจะไม่ถูกใช้
สีแบบ 8 บิตและ 24 บิตเป็นฟีเจอร์ที่ใช้งานแบบเลือกได้อยู่แล้ว และก็ตั้งค่าได้ด้วย ถ้าเป็นโปรแกรมเทอร์มินัลที่ทำงานได้ดี ตัวแปรสภาพแวดล้อม TERM และ COLORTERM จะเป็นตัวตัดสินว่าจะใช้สีเหล่านั้นหรือไม่
แอปพลิเคชันจำนวนมากคาดหวังว่าข้อความ “bright black” จะมองเห็นได้บนพื้นหลัง มีตัวอย่างมากมายที่นี่: https://github.com/altercation/solarized/issues/220
พาเล็ตสีอื่น ๆ แทบทั้งหมดจะแสดง “bright black” เป็นสีเทาที่อ่านได้บนพื้นหลังสีดำ
เช่น pamix ตั้งพื้นหลังเป็นสีดำ ส่วนแถบสถานะของ tmux หรือ ngrok ก็คล้ายกัน แล้วก็ทำให้ต้องตกลงไปใน โพรงกระต่าย เพื่อจัดการกับมัน
ทั้งสองอย่างบ่งชี้ว่าโซลูชันควรอยู่ที่เทอร์มินัล โปรแกรมเทอร์มินัลควรมีสีเริ่มต้นที่สมเหตุสมผลตั้งแต่แรก สีน้ำเงินควรเป็นสีน้ำเงินที่แยกออกได้ และควรคำนึงถึงความบกพร่องในการมองเห็นสีที่พบได้บ่อยด้วย เช่น สีแดงล้วนบนพื้นหลังสีดำอ่านยาก ดังนั้นอย่าใช้แค่
ff0000อย่างเดียว แต่ควรผสมอะไรเข้าไปบ้างเมื่อเทอร์มินัลมีค่าเริ่มต้นที่สมเหตุสมผล โปรแกรมบรรทัดคำสั่งก็แค่ใช้สีมาตรฐาน 16 สีพอ ความพยายามจะใช้สี 24 บิตตรงนี้คล้ายกับการบอกว่า “เลิกหวังให้ฝั่งเทอร์มินัลมอบความปกติให้แล้ว” หรือ “ฉันรู้ดีที่สุด” และสุดท้ายผู้ใช้ต้องไปตั้งค่าโปรแกรม N ตัวทีละตัว ผมคิดว่าสิ่งที่ดีที่สุดคือไม่ควรกำหนดธีมไว้ในแอปบรรทัดคำสั่ง
เว็บไซต์และฟอนต์ก็คล้ายกัน คอนเทนต์ควรจัดส่งเป็น HTML เพื่อให้ผู้ใช้ดูได้ในแบบที่ต้องการ และการจัดวางหน้าก็ควรไหลลื่น ไม่ใช่ยึดตายตัวเหมือนเลย์เอาต์นิตยสาร
ซอฟต์แวร์เดสก์ท็อปก็คล้ายกัน Wayland compositor ควรจดจำตำแหน่งหน้าต่าง การที่โปรแกรม X แต่ละตัวบันทึกและกู้คืนตำแหน่งหน้าต่างของตัวเองนั้นเป็นเรื่องโง่ Wayland บอกว่าการรู้ข้อมูลสภาพแวดล้อมเป็นปัญหาด้านความปลอดภัย และผมเห็นด้วยกับข้อนั้น แต่ถ้าอย่างนั้นการจดจำนี้ก็เป็นงานของสภาพแวดล้อมเดสก์ท็อป และยังสามารถตัดโค้ดส่วนนั้นออกจากทุกแอปได้ด้วย
คำถามว่า “ควรจัดการเรื่องนี้ตรงไหนในซอฟต์แวร์สแต็ก?” เป็นสิ่งที่เกิดซ้ำในหลายพื้นที่ เมื่อเลือกว่าจะวางไว้ที่ไหน ต้องตอบก่อนว่าเป้าหมายคืออะไร และคำตอบของผมมักเอนเอียงไปทางความเรียบง่ายและความดูแลรักษาง่ายเสมอ
บทความของ Julia ก็พูดถึงแนวคิดนี้ แต่ไม่ได้ลงรายละเอียดถึงความลำบากที่เป็นรูปธรรม นอกจากนี้ยังสงสัยด้วยว่าพาเล็ตสีเทอร์มินัลเกี่ยวข้องแค่ สีพื้นฐาน 16 สี หรือไปแตะพื้นที่ RGB และโทนเทาด้วยหรือไม่ เพราะสีแบบ 8 บิตและ 16 บิตก็น่าจะปรับให้ตรงกับความต้องการด้านความอ่านง่ายได้เช่นกัน
ถ้าอยู่ในฐานะคนเลือกสี ก็น่าลองตรวจสีด้วย อัลกอริทึม APCA (Advanced Perception of Colour) ใหม่
APCA มีแผนจะมาแทนวิธีคอนทราสต์แบบ x:y เดิมใน WCAG 3.0 ในอนาคต แต่อาจต้องใช้เวลาอีกหลายปี ว่ากันว่ามันคำนึงถึงขนาดฟอนต์ น้ำหนักตัวอักษร สีหน้า/สีหลัง ไปจนถึงแสงแวดล้อมและสภาพแวดล้อม รวมถึงการใช้งานที่ตั้งใจไว้ด้วย
ถ้าเทอร์มินัลอีมูเลเตอร์ใช้เซ็นเซอร์วัดแสงของอุปกรณ์เพื่อปรับคอนทราสต์ให้เหมาะกับปัจจัยด้านสภาพแวดล้อมได้ ก็น่าจะดีทีเดียว
มีคนบ้าสุดโต่งบางกลุ่มที่อยากปิดสีไปเลยด้วย[0] อยากลองเองเหมือนกัน แต่ก็ชอบสีสวย ๆ ด้วย
[0] https://no-color.org/
:syntax offคือการตั้งค่า Vim เพียงอย่างเดียวของผม เพราะชุดสีของเทอร์มินัลถูกออกแบบโดยโปรแกรมเมอร์คอมพิวเตอร์ วิศวกรไฟฟ้า และคนที่ไม่รู้ว่าสิ่งสำคัญของสีไม่ใช่ตัวสีเอง แต่คือ ความสว่างสงสัยว่ามีความสัมพันธ์กันไหมระหว่างคนที่ไม่อยากได้สีในเทอร์มินัล กับคนที่ใช้ตัวบล็อกโฆษณาแรง ๆ ในเบราว์เซอร์หรือใช้โหมดอ่านบ่อย ๆ
เมื่อส่งเอาต์พุตผ่าน pipe สีจะกลายเป็นแค่ ภาระ โดยแทบไม่มีประโยชน์เลย ประเด็นหลักใกล้เคียงกับเรื่องการมีทางเลือกมากกว่า
ยิ่งสลับไปมาระหว่าง Linux กับ Windows ยิ่งแย่ การใช้สีเริ่มต้นของเครื่องมือจำนวนมากแทบใช้ไม่ได้ หรือทำให้ใช้งานไม่ได้จริง ๆ
เครื่องมือบางตัวมีออปชัน
--color=neverและมีเครื่องมือจำนวนไม่น้อยที่เคารพ NO_COLOR แต่น่าเสียดายที่ไม่ใช่ทั้งหมด และแม้แต่เครื่องมือที่บอกว่าทำแบบนั้น บางครั้งก็สมมติว่าโหมดนั้นจะใช้เฉพาะกับ pipeline หรืออินเทอร์เฟซสำหรับโปรแกรมมิงเท่านั้น จึงเกิดพฤติกรรมแย่ ๆ สารพัดมันมีแนวคิดพาเล็ตสีที่สอดคล้องกันในแง่ อุณหภูมิสี ที่มีความหมาย และเอนเอียงไปทางโทนอุ่นเพื่อให้ดวงตาที่ต้องมองแสงอมฟ้ามากเกินไปล้าน้อยลง มีพาเล็ตสีสำหรับ alacritty มาให้ด้วย
อยากใช้ ธีมสว่าง กับเทอร์มินัลมานานแล้ว แต่มีโปรแกรมมากเกินไปที่ใช้สีแบบ non-ANSI ที่ปรับเองโดยเหมาะกับพื้นหลังเทอร์มินัลสีเข้ม จึงต้องยอมแพ้ทุกครั้ง
บางโปรแกรมตั้งค่าสีได้ แต่การไล่ตั้งค่าทุกโปรแกรมทีละตัวรู้สึกยุ่งยากเกินไป ตอนนี้เลยใช้พื้นหลังเทอร์มินัลสีเข้ม แต่เลือกธีม ANSI เองที่สีทั้งหมดมี contrast ratio เพียงพอตามเกณฑ์ของผม และผ่านการตรวจ contrast แบบ APCA/WCAG 3 ด้วย พอใจแล้ว :)
ถ้าใช้ control sequence OSC 11 โปรแกรมจะตรวจจับสีพื้นหลังได้ แต่แทบไม่มีโปรแกรมไหนสนใจ โดยทั่วไปถ้าใครสักคนคิดว่าข้อความเตือนสีเหลืองดูเท่ เรื่องก็จบแค่นั้น
เรื่องนี้นำไปสู่อีกปัญหาหนึ่ง มีเทอร์มินัลยอดนิยมบางตัวที่ตั้ง
TERM=xterm256-colorเป็นค่าเริ่มต้น ทั้งที่ไม่ได้เข้ากันได้กับ xtermแก้ไข: เพิ่งพบ
xtermcontrolซึ่งช่วย abstract การตรวจพื้นหลังในสคริปต์ได้ และมีอยู่ใน package manager หลัก ๆ ทั้งหมดช่วงนี้ยอมแพ้แล้ว และตั้งค่าแอปส่วนใหญ่ด้วยมือให้ใช้สี ANSI เช่น fzf มีสวิตช์ใน command line ส่วน Vim กับ Emacs ปล่อยไว้เป็นแอป non-ANSI แล้วตั้งค่าให้เข้ากับพาเล็ตสีที่ใช้ในเทอร์มินัลอื่น ๆ ถ้าต้องการก็ไปต่ออีกขั้นด้วยอย่าง vim-dim ได้
ใน Emacs มี
frame-background-mode[0] ที่คนไม่ค่อยเจอ ซึ่งโดยพื้นฐานแล้วเป็นค่าlightหรือdarkอย่างใดอย่างหนึ่งเวลาสงสัยว่าทำไม Emacs ถึงเลือกสีแปลก ๆ ให้บางรายการ ส่วนใหญ่มักเป็นเพราะ frame-background-mode ผิด
[0]https://doc.endlessparentheses.com/Var/frame-background-mode...
สำหรับเทอร์มินัลพื้นหลังมืดตัวอักษรขาว ใช้
export COLORFGBG='15;0'สำหรับเทอร์มินัลพื้นหลังสว่างตัวอักษรดำ ใช้
export COLORFGBG='0;15'ใช้ พาเล็ตสี FlatUI ที่ปรับเล็กน้อยมาเกือบ 10 ปีแล้ว และแทบไม่เคยเจอสถานการณ์ที่เป็นปัญหาจริง ๆ
ไฟล์ png: https://drive.google.com/file/d/1mkMESeGf7MNdKa-rPDx7Yf9BDit...
ลิงก์ imgur: https://imgur.com/a/flatui-7mqVZAY
อิงจาก: https://flatuicolors.com/palette/defo
ผมก็ใช้ธีมของตัวเองมาเกือบ 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 อยู่ดีมีบางฟีเจอร์ใน iTerm2 ที่คิดถึงอยู่เหมือนกัน แต่ส่วนใหญ่เกี่ยวกับเมาส์ นอกเหนือจากนั้นก็ใช้เวลาตอนเย็นอยู่สองสามวันตั้งค่าให้ได้ตามต้องการ และหลังจากทำให้
cmd-nเปิดหน้าต่างใหม่จากไดเรกทอรีเริ่มต้น ไม่ใช่ไดเรกทอรีปัจจุบัน ก็ใช้อย่างพอใจมาตลอด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
ไม่ใช่แค่เทอร์มินัลเท่านั้น แม้แต่ป้ายนีออนหรือป้าย LED สีน้ำเงิน ก็ทรมานตาที่สุดในตอนกลางคืน
มองจากไกล ๆ จะพร่ามัวและโฟกัสไม่ชัดเสมอ พอเห็นบริษัทใหญ่ ๆ ติดป้ายมหึมาด้วยไฟสีน้ำเงิน ก็อดทึ่งไม่ได้ว่าพวกเขาใช้เงินมากมายโดยไม่รู้ตัวด้วยซ้ำว่าคนอ่านไม่ออก
ตั้งค่าแล็ปท็อปให้สลับโหมดสว่าง/มืดอัตโนมัติตามวัฏจักรแสงอาทิตย์ไว้ แต่จำนวน แอปพลิเคชันที่แสดงผลสี แล้วพังเมื่อเปลี่ยนเป็นโหมดพื้นหลังสว่างตัวอักษรมืดนั้นน่าตกใจมาก
ถ้าจะทำเครื่องมือ command-line แล้วจำเป็นต้องใช้สีจริง ๆ ก็ควรใช้แค่ ANSI 16 สี หรือไม่ก็ให้ผู้ใช้ปลายทางเปลี่ยนพาเล็ตสีได้