2 điểm bởi GN⁺ 2024-10-04 | 1 bình luận | Chia sẻ qua WhatsApp
  • Vấn đề màu sắc terminal gần với việc thiếu tiêu chuẩn và khác biệt trong triển khai hơn là sở thích, nên cùng một đầu ra lệnh cũng có thể trở nên khó đọc tùy theo tổ hợp terminal, theme và ứng dụng
  • 16 màu ANSI cơ bản, 256 màu và màu hex 24-bit được dùng song song, nhưng số màu sẽ thực sự hiển thị thành màu nào lại khác nhau tùy terminal emulator
  • Các xung đột tương phản như chữ xanh dương/nền đen, vàng sáng/nền trắng, ánh xạ màu xám của Solarized hay màu nền của ngrok xuất hiện khi giả định của chương trình lệch với theme của người dùng
  • Cách xử lý được chia thành nhiều lớp như đặt lại palette, base16-shell, LS_COLORS, NO_COLOR=true, --color=always, unbuffer, và hỗ trợ màu 24-bit của Vim/Neovim
  • Tính năng minimum contrast của iTerm2, tabby, kitty, Ghostty và Windows Terminal không phải lời giải hoàn hảo, nhưng giúp giảm nguy cơ xuất hiện đầu ra không thể đọc được

Màu ANSI và khác biệt giữa các terminal

  • Terminal thường có 16 màu ANSI gồm đen, đỏ, xanh lá, vàng, xanh dương, magenta, cyan, trắng và phiên bản sáng của từng màu
  • Chương trình chỉ định màu bằng cách xuất ANSI escape code
    • Ví dụ có thể chỉ định số màu tiền cảnh bằng dạng \033[38;5;{num}m
  • Vấn đề là không có tiêu chuẩn nhất quán về việc số màu ANSI tương ứng với màu hex thực tế nào
    • Mỗi terminal emulator tự chọn màu
    • Ngay cả bảng màu ANSI escape code trên Wikipedia cũng cho thấy khác biệt lớn giữa các triển khai
  • Vì khác biệt này, màu xanh dương mà ls dùng cho thư mục có thể khó nhìn trên nền đen
  • Tổ hợp vàng sáng với nền trắng cũng gần như không thể đọc, và các màu khác như xanh lá sáng cũng có thể gặp vấn đề tương tự

Cách đặt lại bảng màu

  • Nếu không thích màu ANSI mặc định hoặc gặp vấn đề tương phản, có thể xử lý bằng cách đặt lại palette
  • Thiết lập trong terminal emulator

    • Hầu hết terminal emulator hiện đại đều cung cấp tính năng đặt lại màu
    • Một số đi kèm sẵn các theme mặc định
    • Terminal emulator càng phổ biến thì có thể càng có nhiều theme để chọn
  • Thiết lập bằng shell script

    • Có thể thay đổi bảng màu của terminal emulator bằng cách xuất ANSI escape code
    • Script Solarized Light của base16-shell dùng các quy ước escape code khác nhau cho nhiều terminal
    • Script cố chọn kiểu escape code phù hợp theo biến môi trường TERM
    • Cách dùng shell script giúp dễ giữ cùng một cấu hình màu dù đổi terminal emulator
    • Tuy vậy không phải terminal emulator nào cũng hỗ trợ thay đổi palette theo cách này, và kể cả có hỗ trợ thì kết quả vẫn có thể hơi khác nhau

256 màu, màu 24-bit và theme theo công cụ

  • Nhiều terminal hỗ trợ 3 cách chỉ định màu
    • 16 màu ANSI
    • 256 màu mở rộng
    • Màu hex 24-bit như #ffea03
  • fd dùng escape code như ^[[38;5;48m trong đầu ra để chỉ định màu tiền cảnh số 48
    • Màu này có thể trông như xanh chanh, vốn không có trong bảng màu terminal thông thường
    • Nó có thể có độ tương phản kém với bảng màu đang dùng
  • bat cũng dùng màu theo cách tương tự, nhưng đầu ra mặc định có vẻ được thiết kế để hoạt động trên nhiều theme terminal khác nhau
  • Một số công cụ terminal hiện đại như fd, bat, delta hỗ trợ theme tùy biến riêng
    • Theme mặc định có thể xung đột với nền terminal
    • Bù lại, cách này cho phép kiểm soát theme của đầu ra công cụ chi tiết hơn là chỉ chọn trong 16 màu ANSI
  • Dùng bat --theme ansi sẽ khiến bat dùng các màu ANSI được đặt trong bảng màu terminal thông thường

Xung đột với Solarized và base16

  • Solarized Light có thể cho ánh xạ màu bright khác nhau tùy cách triển khai
  • Theme Solarized Light mặc định của iTerm ánh xạ các màu 9~14, tức “bright blue”, “bright red” v.v., sang dải màu xám như thiết kế Solarized gốc
    • Nếu ls dùng màu bright cho thư mục và tệp thực thi, chúng có thể hiện thành màu xám
  • base16 Solarized Light có thể được dùng như một biến thể giữ màu bright là màu thực, thay vì chuyển sang xám
  • Khác biệt này có vẻ là hệ quả của việc Solarized gốc được thiết kế để bảng màu Vim Solarized có thể dùng màu xám
  • base16-shell đặt các màu 16~21 để cung cấp thêm màu cho base16-vim
    • Khi ngrok cố đặt nền thành màu 16 “black”, nếu màu đó đã bị ánh xạ lại thành cam sáng thì nền sẽ trông rất kỳ lạ
    • Kiểu xung đột này dễ xảy ra khi chương trình chỉ định màu nền ANSI còn người dùng ánh xạ lại màu đó sang ý nghĩa khác

Giảm vấn đề tương phản bằng minimum contrast

  • Một số terminal có tính năng minimum contrast để tự động điều chỉnh màu khi độ tương phản giữa tiền cảnh và nền không đủ
  • iTerm2, tabby, kitty với text_fg_override_threshold, Ghostty và Windows Terminal đều có tính năng này
  • Nếu đặt minimum contrast trong iTerm thành 40, cả những đầu ra khó đọc như xung đột màu nền của ngrok cũng sẽ dễ đọc hơn
  • Khi cấu hình màu bị sai hoặc chương trình xung đột với theme, minimum contrast là một cơ chế an toàn thực tế để giảm các vấn đề về khả năng đọc ngoài ý muốn

TERM, pipe và tắt màu

  • Nếu hệ thống bạn SSH vào không hỗ trợ giá trị biến môi trường TERM từ máy cục bộ, màu có thể không hoạt động đúng
  • Hệ thống dùng cơ sở dữ liệu terminfo, và nếu giá trị TERM không có trong cơ sở dữ liệu đó thì rất khó biết cách xuất màu phù hợp cho terminal
  • Dù không có môi trường tái hiện được, một câu trả lời trên Stack Overflow gợi ý dùng dạng TERM=xterm ssh thay vì chỉ ssh
  • Khi nối lệnh bằng pipe, đôi khi màu sẽ bị tắt
    • fd | less có thể in ra không có màu
    • Nói chung việc chỉ xuất văn bản thuần, không có escape code, khi chuyển cho công cụ như grep là điều hữu ích
  • Nếu muốn giữ màu, có thể dùng unbuffer fd | less -r
    • unbuffer mở một tty để lệnh nghĩ rằng nó đang ghi ra TTY
    • Nó cũng giải quyết vấn đề đầu ra bị buffer khi ghi vào pipe
  • Một số lệnh như fd có cờ --color=always để luôn xuất màu

Tắt hoặc đổi màu của ls

  • Một số người không muốn ls xuất màu
    • vì màu xanh dương khó đọc trên nền đen
    • hoặc vì không muốn chỉnh bảng màu terminal
    • hoặc đơn giản vì màu sắc không giúp ích
  • Có nhiều lựa chọn
    • Có thể tắt màu bằng ls --color=never
    • Có thể tùy biến màu mà ls dùng bằng biến môi trường LS_COLORS
    • Một số chương trình hỗ trợ NO_COLOR=true, và no-color.org có danh sách
  • Ví dụ, đặt LS_COLORS="fi=0:di=0:ln=0:pi=0:so=0:bd=0:cd=0:or=0:ex=0" ls sẽ đưa style màu của nhiều loại tệp về 0

Những thay đổi trong Vim và Neovim

  • Việc cấu hình màu của Vim trước đây có nhiều vấn đề vì phải khớp bảng màu terminal với bảng màu Vim
  • Trong terminal, cách cấu hình bảng màu của Vim nhìn chung có 2 kiểu
    • Ánh xạ class màu của Vim vào số màu ANSI
    • Để bảng màu dùng trực tiếp màu hex 24-bit như #faea99
  • Cách đây 20 năm, terminal hỗ trợ màu hex 24-bit chưa phổ biến và Vim cũng chưa hỗ trợ dùng màu 24-bit trong terminal
  • Vim đã thêm hỗ trợ màu 24-bit vào năm 2016
  • Neovim 0.10 phát hành vào tháng 5/2024, và trên terminal có hỗ trợ màu 24-bit thì termguicolors được bật mặc định
  • Nếu năm 2024 bạn không định dùng terminal không hỗ trợ màu 24-bit, thì gánh nặng phải đồng bộ bảng màu terminal với bảng màu Vim gần như không còn nữa
  • Thay đổi này cũng làm giảm nhu cầu để base16-shell phải thiết lập đặc biệt các màu 16~21 nhằm tích hợp với Vim
    • Nếu bỏ phần đó đi, có thể tránh được các xung đột như nền cam của ngrok

Trải nghiệm dùng base16 và giới hạn của nó

  • Dùng base16-shell cùng base16-vim giúp dễ đồng bộ màu giữa terminal và Vim
  • Có thể cấu hình bằng cách thêm vài dòng vào thiết lập fish và vài dòng vào .vimrc
  • base16 không phải cách phù hợp cho tất cả mọi người
    • Số theme tích hợp sẵn còn hạn chế và có thể không có theme bạn thích
    • Theme Solarized base16 đặt màu bright ANSI giống màu thường, điều này có thể gây vấn đề cho những trường hợp cần bright phải khác biệt
    • Cách đặt màu 16~21 để cung cấp thêm màu cho base16-vim có thể không cần thiết trong môi trường chỉ dùng terminal hỗ trợ màu 24-bit
    • Việc đặt màu 16~21 có thể gây vấn đề trên các terminal không hỗ trợ 256 màu như Linux framebuffer terminal
  • Có một community fork của base16 là tinted-theming

Công cụ tạo bảng màu và theme phổ biến

Những vấn đề vẫn còn tồn tại

  • Ở các điểm giao nhau giữa nhiều chương trình như tổ hợp tmux, SSH và Vim, vẫn có thể phát sinh thêm vấn đề màu sắc
  • Việc chọn được một bảng màu tốt bản thân nó cũng đã khó
    • Người dùng bị rối loạn sắc giác có thể khó tìm được bảng màu phù hợp
    • Nếu màu nền quá gần với màu con trỏ hoặc vùng chọn, sẽ khó xác định vị trí
    • Rất khó tìm ra màu hoạt động tốt trong mọi chương trình, và vẫn có thể có xung đột như trường hợp của ngrok
  • Các chương trình vốn trông “cổ điển” dựa trên màu ANSI mặc định như Nethack hay Midnight Commander có thể nhìn lạ khi dùng theme như Solarized
  • Một cách xử lý là đổi bảng màu ANSI ngay trước khi chạy chương trình
    • Ví dụ có thể ánh xạ lại màu vàng sang một sắc vàng sáng hơn trước khi chạy Nethack
  • Với người dùng chỉ muốn màu sắc hoạt động ổn ngay từ đầu, quá nhiều thiết lập thủ công là gánh nặng, nên các giá trị mặc định hợp lý và tính năng như minimum contrast là rất quan trọng

1 bình luận

 
GN⁺ 2024-10-04
Các ý kiến trên Hacker News
  • Khi cố tạo một theme màu sáng đúng nghĩa cho hệ thống, tôi đã gặp tất cả những vấn đề này và còn nhiều vấn đề khác; đặc biệt có hai điều khá thú vị
    Nghĩ lại thì là hiển nhiên, nhưng tôi đã ngạc nhiên khi thấy theme sáng trông thay đổi tinh tế hơn nhiều so với theme tối khi chuyển giữa các màn hình. Phần cứng và thiết lập phần mềm đúng là tạo ra khác biệt trong đầu ra màu sắc, nhưng các thay đổi tập trung ở vùng sáng được cảm nhận lớn hơn nhiều so với các thay đổi ở vùng tối
    Ngoài ra, có lúc phải hạ xuống những môi trường bị hạn chế về phông chữ và hỗ trợ màu sắc hào nhoáng như console Linux hoặc BSD; khi đó fd hay exa/lsd/whatever có thể trở nên bất tiện hoặc gần như không dùng được, đặc biệt nếu bạn đã map cái sau thành ls thì càng phiền. Sau một thời gian dài mày mò, tôi đã cấu hình fbterm để có chức năng terminal ổn ngay cả khi không có X, nhưng fbterm cũng có vấn đề riêng. Khi thiết lập bảng màu Vim, bạn nên chuẩn bị một theme thay thế cho console nghèo tính năng, hoặc luyện gõ lệnh Vim thật nhiều mà không cần nhìn :D
    Chỉnh sửa: không phải để làm việc nghiêm túc, nhưng đây là màn hình fbterm đã được styling để cho thấy có thể làm được gì khi không có X: https://i.imgur.com/RbDRgtD.png

    • Việc theme sáng trông khác biệt tinh tế hơn giữa các màn hình không có gì đáng ngạc nhiên. Tôi làm in ảnh đen trắng analog trên phim, và ai cũng biết mắt người nhận ra các thay đổi sắc độ nhỏ ở vùng sáng của bản in tốt hơn nhiều so với ở vùng tối
      Vì vậy, khi chỉnh phơi sáng và độ tương phản phù hợp, tôi dành khá nhiều thời gian để điều chỉnh sao cho vùng highlight trông “vừa đúng”. Tôi không in kỹ thuật số, nhưng có lẽ nguyên lý tương tự cũng áp dụng
    • Thông thường, ta phải có thể dựa vào biến TERM được cấu hình đúng, và các tiện ích dòng lệnh cũng phải tôn trọng những khả năng có thể suy ra từ biến TERM
      Đáng tiếc là các framework công cụ dòng lệnh “hiện đại”, vốn thường được viết bằng JavaScript, lại có xu hướng bỏ qua điều này
      https://www.gnu.org/software/gettext/manual/html_node/The-TE...
    • Gần đây, trong biểu đồ Excel, tôi đã cố hiển thị một số lượng lớn chuỗi dữ liệu bằng các màu khác nhau, và lựa chọn tốt nhất để dễ phân biệt nhiều màu là màu cầu vồng phổ đơn sắc trên nền đen
      Cũng có một thiết lập tạo hiệu ứng “quầng sáng” nhẹ cùng màu cho các điểm dữ liệu, khiến chúng trông như các điểm phát sáng. Xét từ góc độ độ bão hòa màu, tức tỷ lệ tín hiệu trên nhiễu của toàn bộ phổ, nền đen hợp lý hơn
      Có thể dùng khoảng 10 màu khác nhau gần như không gặp vấn đề. Ngoài ra, nó còn có ưu điểm truyền tải thông tin thứ tự/khoảng cách, như vàng nằm giữa đỏ và xanh lá, cam nằm giữa đỏ và vàng, nên dễ chia nhỏ và diễn giải hai màu gần nhau đến mức nào
    • Dù có phông chữ đẹp và theme màu dễ nhìn, chỉ cần một nền khiến một số ký tự khó đọc là hỏng hết
  • Thật ra tôi không thấy việc đó khó đến vậy
    Bước 1: Hầu hết trình giả lập terminal có bảng màu mặc định rất tệ, nên chỉ cần đổi đi là được. Cá nhân tôi thích Solarized, đặc biệt là theme tối, nhưng theme sáng cũng ổn. Dù không phải Solarized, vẫn có nhiều theme cho phép đọc được bất kỳ màu nào trên nền mặc định
    Bước 2: Nên tránh các công cụ dòng lệnh mặc định dùng escape sequence màu 8-bit hoặc 24-bit. Điều này có thể gây tranh cãi, nhưng cá nhân tôi xem đó là hành vi thù địch với người dùng. Tôi đã chọn sẵn bảng màu terminal tốt nhất phù hợp với yêu cầu dễ đọc của mình, nên việc lập trình viên tự coi mình như một nhà thiết kế nửa mùa rồi ghi đè lên nó chẳng giúp ích gì. Có thể cung cấp tùy chọn bật theme trong công cụ, nhưng đó phải là lựa chọn, không phải mặc định
    Với một người dành phần lớn cuộc đời trong terminal, chỉ cần giữ hai quy tắc này là có thể tạo ra môi trường terminal nhất quán, dễ đọc mà hầu như không phải cấu hình. Vấn đề thật sự là chúng ta quá dễ dãi với việc các lập trình viên dùng mã escape màu 8-bit và 24-bit

    • Điều này liên quan đến vấn đề giá trị mặc định tốt. Nếu người dùng phải cấu hình, trước hết họ phải biết rằng có thể cấu hình, rồi còn phải thực sự làm việc đó. Đây là một rào cản lớn, và chỉ rất ít người vượt qua được
      Qua nhiều năm, tôi đi đến kết luận rằng tính năng mới phải được đưa ra ngay trước mắt người dùng, còn các giá trị mặc định tốt phải được thúc đẩy mạnh mẽ. Nếu không, tính năng hầu như sẽ không được dùng
      Màu 8-bit và 24-bit vốn đã là tính năng dùng tùy chọn và cũng có thể cấu hình. Với một chương trình terminal hoạt động đúng, các biến môi trường TERMCOLORTERM sẽ quyết định có dùng những màu đó hay không
    • Đặc biệt Solarized Dark không thật sự phù hợp cho việc dùng terminal. Vì tác giả đã đặt “bright black” gần như cùng màu với nền
      Nhiều ứng dụng kỳ vọng văn bản “bright black” sẽ nhìn thấy được trên nền. Có nhiều ví dụ ở đây: https://github.com/altercation/solarized/issues/220
      Gần như mọi bảng màu khác đều biểu diễn “bright black” thành màu xám có thể đọc được trên nền đen
    • Dù có theme cho phép đọc bất kỳ màu nào trên nền mặc định, vẫn có những ứng dụng chỉ định cả màu chữ lẫn màu nền
      Ví dụ pamix đặt nền thành đen, thanh trạng thái tmux hay ngrok cũng tương tự. Thế là bạn lại rơi vào hang thỏ để xử lý chuyện đó
    • Trước hết cần hỏi “cách xử lý tốt nhất là gì?”, và ở đây phải định nghĩa tốt là gì. Cá nhân tôi thích nguyên tắc rằng cấu hình tùy biến của người dùng nên nằm ở một nơi, còn tác động lên chương trình nên tối thiểu, chẳng hạn xét về số dòng code
      Cả hai đều gợi ý rằng giải pháp nên nằm ở terminal. Bản thân chương trình terminal phải có màu mặc định hợp lý; màu xanh dương phải nhận ra được là xanh dương, và cũng phải tính đến các dạng rối loạn sắc giác phổ biến. Ví dụ đặt màu đỏ thuần trên nền đen sẽ khó đọc, nên đừng chỉ dùng ff0000, tốt hơn là pha thêm dù chỉ một chút
      Khi terminal có giá trị mặc định hợp lý, chương trình dòng lệnh chỉ cần dùng 16 màu tiêu chuẩn. Ở đây, việc cố dùng màu 24-bit gần như có nghĩa là “tôi đã từ bỏ việc để phía terminal cung cấp sự bình thường” hoặc “tôi biết rõ nhất”, và cuối cùng người dùng phải cấu hình riêng N chương trình. Không định nghĩa theme bên trong ứng dụng dòng lệnh là cách tốt nhất theo tôi
      Tôi cũng nhìn website và phông chữ theo cách tương tự. Nội dung nên được cung cấp bằng HTML để người dùng có thể xem theo cách họ muốn, và bố cục trang cũng nên chảy linh hoạt, không cố định như bố cục tạp chí
      Phần mềm desktop cũng tương tự. Wayland compositor nên ghi nhớ vị trí cửa sổ. Việc từng chương trình X tự lưu và khôi phục vị trí cửa sổ của mình là ngớ ngẩn. Wayland nói rằng biết thông tin môi trường là vấn đề bảo mật, và tôi đồng ý với điểm đó, nhưng như vậy việc ghi nhớ ấy sẽ là nhiệm vụ của môi trường desktop. Cũng có thể loại bỏ phần code đó khỏi mọi ứng dụng
      Câu hỏi “nên xử lý việc này ở đâu trong software stack?” lặp lại ở nhiều lĩnh vực. Khi chọn đặt nó ở đâu, trước hết phải trả lời mục tiêu là gì, và câu trả lời của tôi luôn nghiêng về sự đơn giản và khả năng bảo trì
    • Tôi tò mò thực tế việc tránh các công cụ dòng lệnh mặc định dùng escape sequence màu 8-bit hoặc 24-bit khó đến mức nào
      Bài viết của Julia cũng nhắc đến ý tưởng này, nhưng không đi vào những vất vả cụ thể. Liên quan đến đó, tôi cũng tò mò liệu bảng màu terminal chỉ xử lý 16 màu cơ bản, hay còn đụng tới cả vùng RGB và thang xám. Vì có lẽ màu 8-bit và 16-bit cũng có thể được điều chỉnh cho phù hợp với yêu cầu dễ đọc
  • Nếu ở vị trí chọn màu, bạn nên thử kiểm tra màu bằng thuật toán APCA mới (Advanced Perception of Colour)
    APCA dự kiến sẽ thay thế phương thức độ tương phản x:y hiện tại trong WCAG 3.0, nhưng có thể còn mất vài năm nữa. Nghe nói nó xét đến cỡ chữ, độ đậm, tiền cảnh/nền, thậm chí cả ánh sáng và môi trường xung quanh, cũng như mục đích sử dụng dự kiến
    Sẽ khá hay nếu trình giả lập terminal có thể dùng cảm biến ánh sáng của thiết bị để tối ưu độ tương phản theo các yếu tố môi trường

    • Bảng màu terminal tôi đang dùng là do tôi tự điều chỉnh như vậy. Vì tôi không tìm được theme có sẵn nào thỏa mãn yêu cầu độ tương phản cá nhân cho tất cả màu ANSI
  • Cũng có những người cực đoan thật sự muốn tắt hẳn màu sắc[0]. Tôi cũng muốn tự thử, nhưng cũng thích màu đẹp
    [0] https://no-color.org/

    • :syntax off là cấu hình Vim duy nhất của tôi. Vì các bộ màu terminal được thiết kế bởi lập trình viên máy tính, kỹ sư điện, và những người không biết rằng điều quan trọng ở màu sắc không phải là bản thân màu, mà là độ sáng
    • Khi đã quen với terminal đơn sắc, bạn sẽ bắt đầu thấy phần lớn màu sắc gây phân tán và thu hút sự chú ý không cần thiết
      Tôi tự hỏi liệu có mối tương quan nào giữa những người không muốn màu trong terminal và những người dùng trình chặn quảng cáo mạnh trên trình duyệt hoặc thường dùng chế độ đọc hay không
    • Các chuỗi màu không có tính di động và nổi tiếng là gây vấn đề. Ví dụ có trường hợp báo cáo pytest có màu làm chết phiên Jupyter
      Khi chuyển output qua pipe, màu sắc trở thành gánh nợ mà không đem lại lợi ích nào. Điểm cốt lõi gần với quyền lựa chọn hơn
    • Tôi cũng thuộc nhóm đó. Đặc biệt khi lập trình, tôi thấy gần như mọi kiểu tô màu đều gây phân tán và phản tác dụng
      Việc qua lại giữa Linux và Windows còn làm tệ hơn. Cách nhiều công cụ dùng màu mặc định gần như không dùng được, hoặc thực sự khiến chúng không dùng được
      Một số công cụ cung cấp tùy chọn --color=never, và khá nhiều công cụ tôn trọng NO_COLOR. Đáng tiếc là không phải tất cả; ngay cả những công cụ nói là có hỗ trợ cũng đôi khi giả định chế độ đó chỉ được dùng cho pipeline hoặc giao diện lập trình. Vì vậy mới sinh ra đủ loại hành vi khó chịu
    • Tôi cũng đang đi theo hướng đó. Sau khi xem zenbones, cuối cùng tôi chọn https://github.com/savq/melange-nvim
      Nó có khái niệm bảng màu nhất quán với nhiệt độ màu có ý nghĩa, và nghiêng về tông ấm để mắt đỡ mỏi hơn khi phải nhìn quá nhiều ánh xanh. Nó cũng đi kèm bảng màu cho alacritty
  • Từ lâu tôi đã muốn dùng theme sáng cho terminal, nhưng quá nhiều chương trình dùng màu tùy chỉnh không phải ANSI được tối ưu cho nền terminal tối, nên lần nào tôi cũng bỏ cuộc
    Một số chương trình cho phép cấu hình màu, nhưng cấu hình từng chương trình một thì quá phiền. Vì vậy hiện tại tôi dùng nền terminal tối, nhưng tự chọn một theme ANSI trong đó mọi màu đều có tỷ lệ tương phản đủ tốt theo tiêu chuẩn của tôi và cũng vượt qua kiểm tra tương phản APCA/WCAG 3. Tôi hài lòng :)

    • Với những người có quang sai thị giác bậc cao, dark mode ngay từ đầu đã không phải là một lựa chọn. Ngược lại, với một số người bị đục thủy tinh thể, light mode cũng có thể như vậy
      Dùng chuỗi điều khiển OSC 11 thì chương trình có thể biết màu nền, nhưng hầu như không chương trình nào quan tâm. Thường thì chỉ cần ai đó nghĩ thông báo cảnh báo màu vàng trông ngầu là mọi chuyện dừng ở đó
      Điều này lại dẫn đến một vấn đề khác. Có những terminal phổ biến không tương thích xterm nhưng mặc định đặt TERM=xterm256-color
      Chỉnh sửa: Tôi vừa phát hiện xtermcontrol; nó có thể trừu tượng hóa việc kiểm tra nền trong script và có trong tất cả các trình quản lý gói lớn
    • Có một thời gian tôi giả vờ dùng terminal 16 màu không hỗ trợ 256 màu để tránh địa ngục cấu hình này. Vì nghĩ không có màu còn tốt hơn màu tệ, tôi cũng đã thử https://no-color.org/
      Gần đây tôi bỏ cuộc và cấu hình thủ công hầu hết ứng dụng để dùng màu ANSI. Ví dụ như fzf có switch dòng lệnh cho việc này. Tôi chỉ để Vim và Emacs là ứng dụng không ANSI, rồi cấu hình chúng khớp với bảng màu dùng trong phần còn lại của terminal. Nếu muốn, có thể đi xa hơn một bước với thứ như vim-dim
    • Nhiều terminal, ví dụ konsole của trinity/tde3, cho phép tự điều chỉnh màu mặc định, điều này rất hữu ích
    • Với iTerm trên macOS và các chương trình tôi dùng, ví dụ neovim, tôi không gặp vấn đề gì, và ngay cả trạng thái mặc định cũng trông ổn
  • Emacs có frame-background-mode[0] khá khó phát hiện, về cơ bản là một trong hai giá trị light hoặc dark
    Khi bạn thắc mắc vì sao Emacs lại chọn màu kỳ lạ cho một mục nào đó, thường là do frame-background-mode bị sai
    [0]https://doc.endlessparentheses.com/Var/frame-background-mode...

  • Tôi đã dùng bảng màu FlatUI có chỉnh sửa nhẹ trong gần 10 năm, và thực tế rất hiếm khi gặp tình huống có vấn đề
    Tệp png: https://drive.google.com/file/d/1mkMESeGf7MNdKa-rPDx7Yf9BDit...
    Liên kết imgur: https://imgur.com/a/flatui-7mqVZAY
    Dựa trên: https://flatuicolors.com/palette/defo

    • Trông giống theme One Dark mà tôi nhớ là xuất phát từ trình soạn thảo Atom
      Tôi cũng đã dùng theme của mình gần 10 năm. Nó hoạt động tốt trong iTerm, vim, Emacs, vscode, v.v.
  • Tôi đã dùng Apple Terminal từ lâu, và trước đây từng có một bộ bảng màu khá ổn tên là “Terminal Fructose”, nên tôi hay dùng các màu nền khác nhau cho từng loại công việc. Đến một thời điểm nào đó Apple cũng đã tích hợp nó dưới dạng theme
    Nhưng Apple đã bỏ bê việc hỗ trợ Terminal, không hỗ trợ quá 256 màu và cũng thiếu các tính năng hiện đại hơn. Nó cũng không hợp lắm với cấu hình Neovim+LazyVim
    Tôi đã thử qua iTerm2, Kitty, Alacritty, Wezterm để tìm một terminal tốt hơn; tất cả đều hiện đại hơn, nhưng dường như không có tùy chọn “New Window with Profile ...” cơ bản để mở nhanh các cửa sổ với nhiều màu nền/theme khác nhau. Ít nhất là nếu không phải mày mò đôi chút thì không có
    Hiện giờ tôi đã ổn định với Wezterm, lý do chính là nó chạy được cả trên Windows và có thể chia sẻ cấu hình wezterm.lua. Nhân tiện, Windows Terminal thực ra cũng khá ổn. Dù vậy, với những việc nhanh như dùng python3 làm REPL để tính toán hoặc thử hệ thập lục phân/nhị phân, tôi vẫn thường mở Apple Terminal

    • iTerm có đúng chức năng đó
    • Lạ nhỉ. Tôi đã bỏ Apple Terminal rất nhanh để chuyển sang iTerm2 chính vì nó hỗ trợ “new tab with profile”
    • Tôi tiếp tục dùng Wezterm vì hai lý do. Có thể dễ dàng chia sẻ cấu hình trên nhiều nền tảng, và ngôn ngữ cấu hình là Lua
      Có vài tính năng ở iTerm2 mà tôi thấy nhớ, nhưng phần lớn liên quan đến chuột. Ngoài ra, sau vài buổi tối cấu hình theo ý muốn, và sau khi làm cho cmd-n mở cửa sổ mới ở thư mục mặc định thay vì thư mục hiện tại, tôi đã dùng nó khá hài lòng
    • Nếu muốn thêm “New Window with Profile...” vào WezTerm, có lẽ có thể hack gì đó vào launch_menu [1] để khởi chạy shell khác, hoặc augment-command-palette [2] để thêm mục vào command palette
      [1] https://wezfurlong.org/wezterm/config/lua/config/launch_menu...
      [2] https://wezfurlong.org/wezterm/config/lua/window-events/augm...
      Đúng là cần mày mò một chút. Nhưng việc lập trình đúng một tính năng rất cụ thể theo đúng cách mình muốn chính là đỉnh cao của trải nghiệm rất WezTerm
    • Konsole, terminal của KDE, hỗ trợ việc này. Có thể làm từ menu hoặc nhấn giữ biểu tượng tab mới. Tôi biết là nó cũng dùng được trên MacOS
  • Không chỉ terminal, mà cả biển neon hay bảng hiệu LED, màu xanh dương cũng là màu mỏi mắt nhất vào ban đêm
    Nhìn từ xa thì lúc nào cũng nhòe và không lấy nét được. Khi thấy các công ty lớn treo những bảng hiệu khổng lồ bằng đèn xanh dương, tôi thấy lạ là họ chi rất nhiều tiền mà còn không nhận ra rằng mọi người không đọc được

  • Tôi đã đặt laptop tự động chuyển giữa chế độ sáng/tối theo chu kỳ ánh sáng ban ngày, và số lượng ứng dụng xuất màu bị hỏng khi chuyển sang chế độ nền sáng chữ tối nhiều đến đáng ngạc nhiên
    Nếu làm công cụ dòng lệnh mà nhất thiết phải dùng màu, thì nên chỉ dùng ANSI 16 màu, hoặc cho phép người dùng cuối thay đổi bảng màu