2 điểm bởi GN⁺ 2024-01-31 | 1 bình luận | Chia sẻ qua WhatsApp
  • Để hiển thị đúng các theme như Solarized trong Emacs chạy trên terminal, điều quan trọng không chỉ là bản thân màu 24-bit mà là terminal, terminfo, tmux và mosh đều phải hiểu cùng một khả năng màu sắc xuyên suốt toàn bộ chuỗi
  • Màu RGB được dùng rộng rãi dưới dạng ESC[38;2;<r>;<g>;<b>m, nhưng cú pháp dùng dấu hai chấm gần với chuẩn hơn và cú pháp dùng dấu chấm phẩy đã lan rộng trong triển khai thực tế cùng tồn tại, khiến tính tương thích trở nên phức tạp
  • xterm-256colorxterm-direct lần lượt quảng bá bảng màu 256 màu và 16.777.216 màu, nhưng mô hình terminfo thiên về bảng màu không thể biểu diễn màu RGB trực tiếp một cách gọn gàng
  • Trong môi trường thực tế, có thể cần các giá trị TERM thay thế như mục -direct của ncurses-term, tmux-direct, dòng mosh 1.4 và vscode-direct, và một số lớp vẫn chỉ chấp nhận kiểu dùng dấu chấm phẩy
  • Để dùng ổn định các tính năng terminal hiện đại, chỉ TERM và terminfo là chưa đủ; cần một cách biểu diễn riêng có thể cập nhật nhanh hơn theo tên và phiên bản terminal

Vì sao Emacs trên terminal cần màu 24-bit

  • Emacs trong môi trường đồ họa tự động hỗ trợ màu 24-bit, nên có thể hiển thị đúng các theme như Solarized và phông chữ
  • Khi dùng cùng theme đó trong terminal, biểu đạt màu bị hạn chế nên màn hình có thể trông kém đẹp hơn
  • Các terminal phổ biến đã hỗ trợ màu 24-bit từ lâu, nhưng để chương trình dùng được thì cả phát hiện tính năng lẫn cấu hình đều phải khớp
  • Mục tiêu có hai phần
    • Tìm cách bật hỗ trợ truecolor trong môi trường terminal hiện tại
    • Xem vấn đề màu sắc của Emacs liên hệ thế nào với các chuẩn terminal từ thập niên 1970~1990

Lịch sử mã escape ANSI và mở rộng màu sắc

  • Các terminal phần cứng đời đầu dùng những hệ mã điều khiển khác nhau, nên để tạo phần mềm có tính di động cần có chuẩn hóa ANSI
  • ANSI escape codes đã tồn tại từ thập niên 1970, và với màu sắc thì SGR (Select Graphics Rendition) là phần cốt lõi
    • đậm hoặc độ sáng
    • nghiêng
    • nhấp nháy
    • màu chữ và màu nền
    • các thuộc tính hiển thị ký tự khác
  • Ban đầu màu sắc là màu 3-bit tương ứng với 8 đỉnh của khối lập phương RGB
    • gồm đen, trắng, các màu cơ bản cộng và các màu cơ bản trừ
  • Sau đó bit màu sáng hoặc đậm được thêm vào, mở rộng thành 16 màu
    • “bright black” tương ứng với xám đậm
  • Năm 1999, Todd Larason thêm bản vá hỗ trợ 256 màu vào xterm
    • lấy mẫu khối màu RGB 6x6x6
    • dải thang xám 24 mức
    • cũng có biến thể 88 màu, hiếm nhưng vẫn còn được hỗ trợ

Con đường hình thành cú pháp màu 24-bit

  • Màu 8-bit và màu 24-bit được thiết lập trên terminal tương thích theo các dạng sau
    • ESC[38;5;<n>m: đặt màu số n trong bảng màu làm màu chữ
    • ESC[38;2;<r>;<g>;<b>m: đặt giá trị RGB r, g, b làm màu chữ
  • Các số 52 gắn với chế độ màu mở rộng trong ISO 8613-6, tức ITU T.416
    • 2: màu trực tiếp trong không gian RGB
    • 5: màu theo chỉ mục
  • Dòng thời gian chuẩn hóa như sau
    • Thập niên 1970: ANSI chuẩn hóa các chuỗi escape của terminal, dẫn tới ANSI X3.64 và ECMA-48
    • 1979: bản ECMA-48 lần 2 gán SGR 30~37 và 40~47 cho màu chữ và màu nền 3-bit
    • 1984: bản ECMA-48 lần 3 đưa vào khái niệm màu chữ và màu nền mặc định, gán 39 và 49
    • 1991: bản ECMA-48 lần 5 để 38 và 48 cho “chuẩn hóa tương lai”, kèm gợi ý tới ISO 8613-6
    • 1993: ISO 8613-6 định nghĩa 38 và 48 là chế độ màu chữ và nền mở rộng
  • Về phân tách tham số con, dùng dấu hai chấm gần chuẩn hơn, nhưng các triển khai thực tế lại chấp nhận rộng rãi dấu chấm phẩy
    • ESC[38;5;3m có thể bị terminal không hiểu SGR 38 diễn giải như các tham số riêng 38, 5, 3
    • FAQ của xterm do Thomas Dickey viết giải thích rằng bản sao ITU T.416 lúc đó rất đắt, và việc tách giá trị RGB bằng dấu chấm phẩy như các tham số SGR khác là một sai lầm
  • Dòng thời gian liên quan như sau
    • 1999: Thomas Dickey gộp bản vá 256 màu của Todd Larason vào xterm, đưa theo cú pháp dấu chấm phẩy mơ hồ
    • 2006: Konsole hỗ trợ 256 màu và truecolor 24-bit bằng cùng cú pháp dấu chấm phẩy như xterm
    • 2012: xterm được sửa để chấp nhận cả cú pháp dấu hai chấm gần chuẩn hơn
    • 2016: console tích hợp của Windows 10 hỗ trợ mã escape ANSI và màu 24-bit, nhưng dùng cú pháp dấu chấm phẩy
    • 2019: Windows Terminal cũng hỗ trợ mã escape ANSI, nhưng dùng cú pháp dấu chấm phẩy
    • 2022: Microsoft công bố chuyển hệ sinh thái từ subsystem console kiểu VGA cũ sang mô phỏng terminal ANSI
    • 2022: Konsole hỗ trợ cú pháp dấu hai chấm tương thích chuẩn

terminfo biểu diễn khả năng màu như thế nào

  • terminfo cung cấp cơ sở dữ liệu khả năng của terminal và khả năng sinh chuỗi escape phù hợp
  • Biến môi trường TERM chỉ tới bản ghi terminfo mà chương trình sẽ dùng, và cũng được truyền tự động qua kết nối ssh
  • toe hiển thị danh sách các bản ghi terminfo đã cài, còn infocmp dùng để kiểm tra khả năng của một bản ghi cụ thể
  • Có ba khả năng quan trọng liên quan đến màu
    • colors: số màu terminal hỗ trợ
    • setaf: đặt màu chữ
    • setab: đặt màu nền
  • xterm-256colorsetaf tạo ra chuỗi khác nhau tùy số màu
    • 0~7: dùng tham số ANSI 30~37 của SGR
    • 8~15: dùng các màu sáng 90~97 không chuẩn
    • lớn hơn nữa: dùng bảng màu 256 màu dạng 38;5;<n>
  • xterm-direct là mục terminfo cho RGB 24-bit, quảng bá colors là 16.777.216
    • tắt ccc, nghĩa là không thể gán giá trị RGB mới cho chỉ mục màu
    • cũng không có các mục liên quan tới đổi màu lúc chạy như initc, oc, rs1
    • setafsetab dùng dạng 38:2::... dựa trên dấu hai chấm

Giới hạn của mô hình màu trực tiếp trong terminfo

  • Mô hình lập trình của terminfo và ncurses về cơ bản xoay quanh mục bảng màu
    • có N mục bảng màu
    • mỗi mục có giá trị RGB mặc định
    • mô hình giả định terminal có thể thay đổi các giá trị này
  • Terminal kiểu -direct biểu diễn màu 24-bit bằng cách giả như có 16.777.216 mục bảng màu
    • mỗi mục tương ứng với khối RGB 8:8:8
    • các giá trị này không thể thay đổi
  • Để tương thích, cách làm xterm-direct dùng 7 sắc xanh đậm nhất cho tương thích với 8 màu ANSI cơ bản
    • không gồm màu đen
    • đây là cơ chế để tránh việc chương trình cũ giả định ý nghĩa của setaf rồi in ra những màu xanh đậm gần như không nhìn thấy
  • Vì vậy cách -direct và cách -256color không tương thích với nhau
    • chương trình phải biết rằng 256 màu là màu chỉ mục còn 16.777.216 màu là màu trực tiếp
    • cũng có ngoại lệ là phải tránh 7 sắc xanh đậm nhất đó
  • Trong một vấn đề liên quan tới termwiz, chương trình kỳ vọng bảng màu xterm-256color nhưng thực tế lại in ra các màu xanh đậm khó đọc
    • issue đó còn mở vào thời điểm bài viết, nhưng @quark-zju đã đưa bản sửa vào nên hiện termwiz hoạt động hợp lý
  • Điểm cốt lõi nằm gần với giới hạn của terminfo hơn là ở bản thân terminal
    • các terminal hỗ trợ màu 24-bit có vẻ cũng hỗ trợ bảng màu 256 màu của xterm và thay đổi động giá trị RGB
    • terminfo không đủ để mô tả chính xác và nhanh nhạy hệ sinh thái terminal emulator hiện đại

Thiết lập TERM và tính tương thích với dấu chấm phẩy

  • Vì rất nhiều chương trình dùng terminfo nên giá trị TERM phải được thiết lập đúng
  • Dù muốn thống nhất theo cú pháp SGR dùng dấu hai chấm, nhiều môi trường vẫn chỉ hỗ trợ cú pháp dấu chấm phẩy
    • Conhost, console tích hợp của Windows
    • một số hành vi trong Mintty và môi trường Cygwin
    • Mosh
    • PuTTY
    • phiên bản Konsole đi kèm Ubuntu 22.04 LTS
  • Các mục terminfo được ghép từ các khối xây dựng
  • Khi tìm theo xterm+indirect, vscode-direct có vẻ là lựa chọn phù hợp nhất
    • vì nhắm tới terminal của Microsoft nên được xem là đủ gần với Windows Terminal và Windows Console
    • chưa kiểm toán mọi tính năng, nhưng nó hoạt động
  • Trên nhiều server, các mục terminfo -direct có thể chưa được cài
    • trên đa số hệ thống, cơ sở dữ liệu terminfo mặc định nằm trong gói ncurses-base
    • các mục terminal mở rộng cần gói ncurses-term
  • Trong khi viết bài, ncurses đã thêm mục terminfo winconsole, nhưng nó không hỗ trợ màu 24-bit và vẫn chưa được phát hành trong bất kỳ phiên bản ncurses nào

Cách Emacs phát hiện truecolor

  • Emacs có tài liệu về cách phát hiện hỗ trợ truecolor trên TTY
  • Trong M-x eval-expression, chạy (display-color-cells) để kiểm tra Emacs có nhận ra 16.777.216 màu hay không
  • Tài liệu Emacs cũng bàn tới giới hạn terminfo của chế độ -direct
    • terminal có khả năng RGB có thể coi #000001 tới #000007 là màu chỉ mục chứ không phải RGB trực tiếp
    • đây là để giữ tương thích ngược với các ứng dụng không biết direct color
    • nếu thành vấn đề, có thể dùng định nghĩa terminal tùy chỉnh có setb24, setf24
  • Emacs trước tiên tìm các chuỗi setf24setb24, nếu không có thì dùng RGB như khả năng thay thế
  • Các mục terminfo trên hệ thống đã kiểm tra không có setf24

Trong terminal lồng nhau, mọi lớp đều phải khớp

  • Quy trình làm việc phổ biến là lồng nhiều lớp terminal
    • mở terminal emulator đồ họa trên desktop cục bộ
    • kết nối tới máy từ xa hoặc VM bằng mosh
    • khởi động tmux
    • thêm terminal bên trong Emacs, Asciinema, GNU Screen v.v.
  • Mỗi lớp tự triển khai máy trạng thái chuỗi escape ANSI của riêng mình
  • Để màu 24-bit hoạt động, mọi lớp phải hiểu chuỗi escape được sinh ra từ terminfo của TERM bên trong, rồi truyền chính xác ra ngoài theo terminfo tương ứng
  • Vì thế phần mềm liên quan phải đủ mới
    • Ubuntu LTS hiện tại cung cấp mosh 1.3, nên cần bật mosh-dev PPA
  • TERM trong từng lớp cũng phải chính xác
    • bên trong tmux dùng tmux-direct
    • mosh không có terminfo chuẩn nên phải chọn giá trị đủ gần

Cấu hình theo từng môi trường

  • Terminal emulator đồ họa

    • hầu hết terminal đặt TERM mặc định phù hợp hoặc cho phép người dùng ghi đè
    • Konsole có tùy chọn chọn giá trị TERM
  • ssh

    • ssh truyền giá trị TERM vào shell mới
    • nếu host từ xa có cùng bản ghi terminfo thì cấu hình sẽ tương đối đơn giản
  • tmux

    • khi chạy tmux, TERM có thể bị đặt thành screen
    • có thể sửa bằng cách đổi terminal mặc định trong ~/.tmux.conf
    set -g default-terminal "tmux-direct"
    
    • cũng có thể cân nhắc chỉ đặt tmux-direct khi TERM bên ngoài hỗ trợ màu 24-bit, nếu không thì giữ screen hoặc tmux-256color
  • mosh

    • mosh mới hỗ trợ màu 24-bit, nhưng tự quảng bá chỉ 8 màu hoặc 256 màu
    • vì vậy người dùng phải tự đặt TERM phù hợp
    • mosh hướng tới tương thích xterm nhưng với SGR 38 và 48 thì chỉ hỗ trợ cú pháp dấu chấm phẩy
    • TERM=xterm-direct không hoạt động
    • vscode-direct được dùng như phương án thay thế gần nhất với xterm-direct
    • không có biến tiện dụng nào để báo shell đang chạy dưới mosh, nên đã viết script detect-mosh.rs và gọi nó trong .bashrc
    • cách làm là kiểm tra xem tiến trình shell có phải là tiến trình con của mosh-server hay không
    • chưa chắc việc biên dịch Rust trên đường đăng nhập có phù hợp với host hiệu năng thấp hay không

Kết quả cuối cùng và các vấn đề còn lại

  • Sau khi cấu hình, ngay cả Emacs bên trong tmux và mosh cũng hiển thị theme bằng màu 24-bit
  • Có thể tóm gọn các vấn đề còn lại thành ba ý
    • các terminal vẫn chưa hoàn toàn thống nhất về cú pháp và tính năng
    • terminfo là con đường chuẩn để tra cứu tính năng
    • terminfo thì hạn chế, đôi khi không chính xác, và các bản phát hành mới cũng không thường xuyên

Hướng đi sau terminfo

  • Nếu phần mềm muốn tận dụng đầy đủ các tính năng terminal hiện đại, nó cần vượt ra ngoài terminfo
  • Một số hướng khả thi gồm
    • tiếp tục dùng biến TERM được hỗ trợ rộng rãi
    • không chỉ phụ thuộc vào terminfo cũ của hệ điều hành hay bản phân phối, mà cho phép chương trình tự biết khả năng terminal một cách độc lập
    • đưa thông tin về terminal emulator khoảng 10 năm gần đây vào một thư viện được cập nhật thường xuyên, theo tên và phiên bản
    • không còn bao gồm hỗ trợ cho các terminal phần cứng đã quá khó sử dụng
    • vẫn hỗ trợ file terminfo do OS cung cấp và định dạng file terminfo, nhưng có giao thức để biết thông tin nào là mới hơn
    • thêm TERMVERSION tùy chọn để phân biệt khác biệt tính năng theo phiên bản như Konsole 2022 và Konsole 2023
    • biểu diễn rõ ràng, không mơ hồ các tính năng hiện đại như màu 24-bit, hoạt ảnh bảng màu 256 màu, liên kết URL, Kitty graphics protocol
  • Cũng có thể có cách tương thích ngược cho chương trình cũ
    • một chương trình chạy từ .bashrc dùng TERMTERMVERSION để tạo file terminfo nhị phân trong $HOME/.terminfo/
    • tạo ra các khả năng màu 24-bit rõ ràng như RGB, setf24, setb24
    • với chương trình không hiểu RGB, coi như chúng giả định bảng màu 256 màu và giữ colors#0x100, initc, oc

1 bình luận

 
GN⁺ 2024-01-31
Các ý kiến trên Hacker News
  • Lục lọi terminfo có cảm giác như soi chữ tượng hình bằng một ngọn đuốc lập lòe trong hầm mộ sâu
    Nghĩ đến việc một ứng dụng terminal chứa bao nhiêu độ phức tạp thì thấy lạ thật, và càng biết ơn hơn các nhà phát triển terminal như iTerm và Kitty
    Tôi có gom các hàm đặt màu tab trong iTerm+zsh ở đây: https://gist.github.com/aclarknexient/84ebe33c1879f921685304...
    So với cách ngày xưa dùng telnet để kết nối HTTP hay SMTP, bản thân văn bản thì đơn giản, nhưng phía hiển thị văn bản đó lại là một ứng dụng phức tạp hỗ trợ đủ loại tính năng

    • Khi dùng terminal tự viết, ban đầu tôi quyết định không bận tâm đến terminfo mà giả làm rxvt, và chấp nhận các vấn đề phát sinh
      Hiện giờ lựa chọn đó khả thi vì thực tế chỉ có mỗi tôi là người dùng terminal ấy, nhưng các terminal hiện đại hỗ trợ khá nhiều tập con chung, nên đỡ đau hơn chuyện ứng dụng không nhận ra giá trị TERM lạ rồi rối lên
      Tất nhiên, nếu bạn không thường SSH vào các hệ thống mới thì vấn đề này ít quan trọng hơn
    • Sẽ rất hay nếu có thể chia sẻ ảnh chụp màn hình cho thấy màu tab thực sự được áp dụng
    • Phần mềm tôi nhớ nhất trên Mac là iTerm
      Nó không phải trình giả lập terminal nhanh nhất, nhưng về ngoại hình thì áp đảo, đẹp nhất
  • Việc chỉnh bảng màu 16 màu cho từng ứng dụng terminal dễ hơn so với việc khớp chính xác mã terminal ở phía ứng dụng
    Tôi đặt màu rxvt-unicode trong ~/.Xdefaults, rồi trong theme Emacs .el thì chọn tên màu khác nhau tùy theo có hiển thị đồ họa hay không, sau đó áp dụng cho nhiều face
    Tiện thể, output ls có màu cũng trông đẹp hơn. Bảng 16 màu mặc định thường quá bão hòa và có độ tương phản kém

    • Đúng là (if (display-graphic-p) mới là điểm mấu chốt
      Emacs hỗ trợ đầu ra đồ họa thực sự; trên X11/Cocoa/Win32, Esc hoạt động đúng là Esc, có thể dùng các binding Ctrl+Shift hay Cmd, dùng đồng thời nhiều phông chữ, hiển thị ảnh, đổi hình dạng con trỏ, v.v.
      Nó giống như một cỗ máy thời gian đưa bạn đến năm 1989, tức 20 năm sau vậy
    • Trên các màn hình TTL ngày xưa, không thể làm hơn thế nên màu mới bão hòa như vậy
      Đường đỏ chỉ có thể là đỏ mạnh hoặc tắt, và khi thêm đường intensity thì thành đỏ 100%, kiểu như thế
    • Nếu đưa sequence vào DIRCOLORS, ls cũng thực sự hỗ trợ màu 24-bit
    • Tôi cũng chỉnh bảng 16 màu của Terminology trong file INI theo theme ưa thích, để dùng cùng một phong cách trong console và ứng dụng terminal (vim)
    • Tôi dùng gần như cùng cách
      Màu mặc định quá tối so với nền tối, nên tôi đã tăng độ chói của tất cả màu
  • Nếu tác giả biết export COLORTERM=truecolor thì có lẽ đã đỡ vất vả hơn nhiều
    Nó cũng xuất hiện trong chú thích về phát hiện truecolor của tài liệu Emacs được liên kết và trong ảnh chụp Konsole, nhưng có khả năng đã biến mất bên trong nhiều lớp terminal multiplexer
    Đặt giá trị này sẽ giúp ứng dụng hiểu ngay rằng bạn muốn truecolor, nhờ đó có thể bỏ qua phần khó, và cũng không cần cơ sở dữ liệu terminfo

    • Đúng. Câu chuyện này lẽ ra cũng nên đưa cả những thử-sai như COLORTERM và khả năng terminfo RGB vào
      Tuy vậy, không phải chương trình nào cũng tôn trọng COLORTERM, nên từng có thời tôi unset COLORTERM trong .bashrc khi là linux | screen*, còn các trường hợp khác thì export COLORTERM=truecolor
      Screen ngày nay hỗ trợ màu 24-bit, nên có lẽ đó là cấu hình từ thời Ubuntu 18
    • Hoặc cứ dùng GUI Emacs ưa thích cùng với tramp hay sshfs là được
    • Đúng. Đi theo con đường terminfo thì chỉ có sự điên rồ chờ đợi
      Một phần cũng vì maintainer của ncurses khá bảo thủ, còn các nhà phát triển terminal mới thì muốn tiến nhanh
    • Cơ sở dữ liệu terminfo chỉ trở nên không cần thiết kể từ Emacs 28
      Với các bản Emacs cũ hơn, vẫn cần cơ sở dữ liệu terminfo
    • COLORTERM cũng khá kỳ lạ
      Phần lớn trường hợp không cần định nghĩa nó, nhưng nếu COLORTERM=truecolor được đặt trong một phiên screen thì màn hình bỗng trở nên rất kỳ quặc, còn xóa biến môi trường đó đi thì lại bình thường
  • Khi tương tác với Emacs, không nhất thiết phải dùng terminal
    Có thể dùng frontend đồ họa cho MacOS, Windows, X.org, Wayland
    Emacs đồ họa, nếu tắt toolbar, trông quá giống Emacs chạy trong terminal đến mức người không biết Emacs dễ nhầm cửa sổ Emacs đồ họa trên máy đồng nghiệp là cửa sổ terminal
    Trong khảo sát người dùng Emacs, 80% trả lời rằng họ dùng frontend đồ họa

    • Phản biện lại, nếu muốn dùng terminal mà không chịu sự cồng kềnh của một GUI đầy đủ, chỉ riêng xterm-mouse-mode cũng đã có được 80% lợi ích
      Thêm mouse, xterm-mouse-mode, mouse-wheel-mode, các thiết lập cuộn, v.v. là dùng khá ổn, còn auto-save-default thì cứ để nil theo ý Chúa
    • Không chạy Emacs bên trong terminal emulator. Emacs chính là terminal emulator
      Mọi chương trình terminal đều chạy trong buffer shell-mode của Emacs đồ họa, và chỉ những chương trình hiếm hoi cần điều khiển toàn màn hình mới dùng term-mode
      Nó không phải nhiều tính năng nhất hay nhanh nhất, nhưng có thể di chuyển như các buffer khác và xử lý liền mạch cùng nội dung đang chỉnh sửa
      Nếu không mở được Emacs đồ họa trên máy từ xa, thì chỉnh sửa file từ xa bằng tramp, hoặc chạy một server Emacs headless rồi kết nối bằng emacsclient đồ họa
    • Nhận xét hay
      Tôi chưa từng nghĩ rằng người khác có thể cho rằng tôi chạy Emacs trong terminal
      Emacs đồ họa tốt hơn nhiều, nhưng việc trên terminal nó vẫn hoạt động và trông giống khoảng 90% cũng vẫn rất tuyệt
    • Tôi dùng Emacs nền X và protocol của nó hiệu quả
      Cảm giác nhẹ như terminal chứ không giống VNC
      Có các lợi thế như font, dùng đồng thời nhiều font khác nhau, menu, chuột, màu sắc, nhiều frame/cửa sổ
      Nếu chạy phần đồ họa ở local và truy cập hệ thống từ xa bằng tramp, thực tế có thể chỉnh sửa cả file cấu hình của router Linux từ xa gần như chỉ có busybox, kèm đủ loại tiện ích
    • Rốt cuộc có hai lý do khiến tôi luôn quay lại Emacs chạy trên terminal
      Tôi đã dùng X11 lúc có lúc không từ thập niên 90, nhưng với font thì đến giờ vẫn chỉ ở mức tìm kiếm rồi tình cờ thấy một lệnh chạy được và giữ nguyên không đụng tới nữa
      Hiệu năng hiển thị của hầu hết chương trình terminal vẫn nhanh hơn rõ rệt so với cấu hình X11 thường phải dùng trong môi trường doanh nghiệp
  • Ngày nay chỉ cần cài Emacs mới nhất, mở một terminal hỗ trợ xterm 24-bit, rồi chạy emacs -nw
    Nếu sau khi áp theme mà trông ổn thì xong; nếu không, thêm export COLORTERM=truecolor vào .bashrc, .zshrc, .fishrc, v.v., rồi reload shell hoặc chỉ chạy riêng dòng đó và khởi động lại emacs -nw
    Bài này làm như thể phải đào sâu vào terminfo, nhưng thường thì không cần. 10 năm trước thì có thể, chứ giờ thì không
    Tôi vừa kiểm tra nhanh lại trên iTerm của MacOS và Alacritty, Kitty, Gnome Terminal của Linux; ngày nay hỗ trợ xterm 24-bit khá phổ biến

  • Hôm nay tôi mới biết rằng ngay cả Command Prompt của Windows 10 cũng hỗ trợ chuỗi escape ANSI chuẩn
    Màu 24-bit cũng hoạt động tốt
    Chạy echo ^[[48;2;255;0;0mHello^[[0m thì Hello sẽ được in với nền đỏ RGB(255,0,0), còn ^[[0m đưa màu về như cũ
    ^[ phải nhập bằng CTRL-[, không được gõ riêng ^[

    • Nếu không muốn đưa trực tiếp ký tự không in được vào dòng lệnh, có thể dùng escape code \x1b hoặc alias \e cùng với lệnh nhận escape code
      Ví dụ có thể viết như echo -e '\e[48;2;255;0;0mHello\e[0m'
      Tuy nhiên trong script, echo -e không chuẩn và echo thường cũng khác nhau ở các trường hợp biên, nên tốt hơn là luôn dùng printf '\e[48;2;255;0;0mHello\e[0m\n'
    • Đừng quên thêm DEVICE=C:\DOS\ANSI.SYS vào file C:\CONFIG.SYS
  • Điểm hay nhất của Emacs so với vim/neovim là nó có hỗ trợ GUI hạng nhất, chứ không chỉ là một terminal emulator nằm trong cửa sổ
    Tôi biết có gVim và rất nhiều frontend neovim nửa vời, nhưng cách chạy mặc định của Emacs là GUI thật sự, và tôi thích điều đó
    Terminal cũng ổn, nhưng có quá nhiều di sản lịch sử và giới hạn, nhiều chỗ trong thời đại này không còn hợp lý
    Nếu vấn đề là chạy Emacs trên server từ xa thì đã có TRAMP và emacsclient

    • Điểm hay khi chạy mọi thứ trong terminal là bất cứ thứ gì hiện trong terminal đều có thể sao chép được
      Thật bực khi một ứng dụng GUI không cho sao chép văn bản đang hiển thị, khiến phải gõ lại bằng tay
    • Không đúng. Neovim có nhiều frontend native, và ngay từ đầu đã được thiết kế để cho phép cấu trúc như vậy
      https://github.com/neovim/neovim/wiki/Related-projects#gui
    • Hoàn toàn đồng ý
      Tôi rất thích modal editing và vim, nhưng khó chịu nổi kiểu giải pháp nửa vời mà editor trong terminal mang lại
      Đã có nền tảng đồ họa phong phú thì tại sao lại không dùng?
    • Phụ thuộc rất nhiều vào workflow
      Ví dụ tôi gần như chỉ dùng vim để chỉnh sửa file, còn các công cụ bên ngoài như git, linter, formatter, debugger, thao tác cây file thì quay lại shell để dùng
      Vì vậy ứng dụng chính của tôi vốn đã là terminal emulator, và trong workflow này việc không có GUI chuyên dụng gần như không quan trọng
  • Thật ra mình muốn Emacs của mình trông như thế này hơn: https://imgur.com/a/h0jA1ro
    Nói vậy thôi chứ mình đùa đấy. Cool Retro Term chỉ dùng khi thuyết trình thôi
    Xem ra Emacs của mình mặc định chạy màu 24-bit: https://imgur.com/a/BM5OTxp
    Chỉ có điều tô sáng cú pháp hơi chướng mắt

    • https://muppetlabs.com/~mikeh/crt_emacs.png
      Cool Retro Term rất tuyệt, và mình cũng muốn thử dùng nó trong bài thuyết trình
    • Mình thật sự rất thích Cool Retro Term, nhưng tiếc là dự án gần như bị bỏ bê và có nhiều vấn đề trên MacOS
      Cá nhân mình thấy các terminal phong cách retro khác không đẹp bằng
    • Mình thực sự đang dùng hiệu ứng CRT được tùy biến nhẹ trong Windows Terminal
  • Việc nhốt tiêu chuẩn phía sau mức giá đắt như vậy thật sự đáng xấu hổ
    Mọi người phải lách đủ cách để khỏi phải mua, và chuyện này có thể dẫn đến những kết quả như thế này
    Nếu là tiêu chuẩn thì phải có thể tiếp cận được. Thời còn chỉ phát hành dưới dạng sách thì thu phí in ấn có thể còn hợp lý, nhưng thật khó tin là một file PDF sơ sài lại có giá 200 đô la

  • Mình đã viết bản vá màu 24-bit cho xterm, nhưng đến hôm nay mới biết cách chạy ncurses với xterm-direct
    Dù mình đã dùng thư viện terminal tự viết bằng Lisp, việc có một đường dự phòng bằng ncurses vẫn hữu ích
    Cảm ơn Mr. Dickey đã trả lời câu hỏi trên Stack Overflow và cảm ơn Chad đã nêu chuyện này ra