hỗ trợ tmux, HẠN và 256 màu


48

Giới thiệu

Câu hỏi của tôi xuất phát từ sự cần thiết phải hiểu lý do tại sao bây giờ tôi (sau nhiều thử nghiệm) Terminaltmux hỗ trợ 256 màu và tput colorsnói với tôi rằng chỉ có 8 trong số chúng.


Lý lịch

Hãy bắt đầu từ đầu.

Tôi đang sử dụng hộp Ubuntu , Guake , tmux , Vim và tôi thích chủ đề Solarized . Chúng trông khá khủng khiếp, vì vậy tôi quyết định kích hoạt hỗ trợ 256 màu và chơi một chút.

Hãy xem điều gì xảy ra với Terminal của tôi . tput colorscho biết có 8 màu. Cá nhân tôi đặt chúng thành màu tím, bên trái và tất nhiên bên phải chúng tôi có 2 màu xanh khác nhau. $TERMnói xterm. (Để có màu lstôi eval này trong của tôi .bashrc.)

nhập mô tả hình ảnh ở đây

Vim cũng có vẻ ổn, mặc dù thực tế là tôi gọi nó bằng 256cờ trong môi trường không hỗ trợ 256 màu .

set t_Co=256
let g:solarized_termcolors=256
colorscheme solarized

Anh chàng duy nhất phàn nàn về không gian màu giảm là tmux . Gọi điện tmuxcung cấp kết quả "sai" dự kiến.

nhập mô tả hình ảnh ở đây

Nhưng gọi tmuxbằng -2cờ làm cho mọi thứ hoạt động tốt, kỳ diệu .

nhập mô tả hình ảnh ở đây

Bây giờ điều duy nhất mà tôi hiểu -2là tương đương với export TERM=screen-256color( nguồn ).

Guake hành xử tương tự với Terminal và cả hai đều trả lời xtermcho câu hỏi echo $TERM.


Câu hỏi

Về cơ bản, có ai hiểu tại sao mọi thứ hoạt động ngay cả khi nó không nên?

  • Tôi có buồn bã rằng tôi phàn nàn tại sao mọi thứ hoạt động? Có lẽ.
  • Có một lý do tốt hơn? Chắc chắn: Tôi muốn sửa sự xuất hiện của các hộp Ubuntu khác trong văn phòng của mình và tôi muốn hiểu tại sao mọi thứ hoạt động hoặc không hoạt động.

Thí nghiệm bổ sung

Chạy tập lệnh này (sửa đổi một chút) trên tôi xtermcung cấp kết quả sau: 256 màu, nhưng chỉ có 16 màu được hiển thị chính xác.

nhập mô tả hình ảnh ở đây

Sau đó, thay đổi hồ sơ của thiết bị đầu cuối, 16 màu này cũng thay đổi.

nhập mô tả hình ảnh ở đây

Nhiều bài kiểm tra đang theo sau.

Từ trái sang phải, từ trên xuống dưới, chúng ta có chủ đề màu Solarized , dircolor ansi-dark256darksau đó là phối màu mặc định ( Tango ) dircolor ansi-dark256dark.

nhập mô tả hình ảnh ở đây

Quan sát : trên lý thuyết, bảng màu dircolor ansi-darktrên Solarized phải phù hợp chặt chẽ với dircolor 256dark. Điều này không rõ ràng xảy ra cho các tập tin được liệt kê cụ thể. Thay vào đó, điều này khá xảy ra khi trong thư mục làm việc có các thư mục , tệp văn bảncác liên kết tượng trưng . Kết luận : không chú ý nhiều như đã được trả tiền trong khi mã hóa 256darkmàu sắc.


Kết luận sơ bộ

xtermhỗ trợ 256 màu, bất chấp những gì tput colorsnói. Các chương trình có thể tham khảo ansibảng màu (người dùng có thể tùy chỉnh) hoặc xác định màu sắc của chúng, chọn từ tổng số 256 màu.


1
Đọc câu trả lời này và các ý kiến ​​dưới đây. Nó có trả lời câu hỏi của bạn không? Ngoài ra hãy xem kịch bản này để nhận được số lượng màu thực sự được hỗ trợ.
terdon

Hừm ... Tôi vẫn hơi bối rối ... Nhưng, tôi đoán tôi ít nhất hiểu rằng đó tput colorslà một bài kiểm tra không đáng tin cậy. Bạn có thể kiểm tra kết luận sơ bộ của tôi ?
Đã kết thúc

2
Tôi đọc câu trả lời của Gilleś là tput colorschỉ có thể trả về một giá trị và trong các thiết bị đầu cuối hỗ trợ bất kỳ 2,8,16,88 hoặc 256 màu, chỉ có giá trị đầu tiên (8 trong trường hợp của bạn) được trả về. Để có được giá trị thực sự, hãy sử dụng tập lệnh từ bình luận cuối cùng của tôi. Điều đó trở lại là gì?
terdon

Kiểm tra các thử nghiệm bổ sung của tôi ở trên :)
Vào

Ah, xin lỗi, xấu của tôi.
terdon

Câu trả lời:


33

Có một số thông tin về hỗ trợ 256 màu trong Câu hỏi thường gặp về tmux .

Rất tiếc, việc phát hiện số lượng màu mà thiết bị đầu cuối hỗ trợ không đơn giản vì những lý do lịch sử. Xem Kiểm tra có bao nhiêu màu trình giả lập thiết bị đầu cuối của tôi hỗ trợ để giải thích. Điều này có nghĩa rằng

  • tmux không thể xác định một cách đáng tin cậy liệu thiết bị đầu cuối có hỗ trợ hơn 8 màu hay không;
  • tmux không thể giao tiếp một cách đáng tin cậy đến ứng dụng mà nó hỗ trợ hơn 8 màu.

Khi bạn ở trong tmux, thiết bị đầu cuối bạn tương tác là tmux. Nó không hỗ trợ tất cả các chuỗi điều khiển của xterm. Cụ thể, nó không hỗ trợ OSC 4 ; …chuỗi điều khiển để truy vấn hoặc đặt giá trị màu. Bạn cần sử dụng nó trong khi trực tiếp chạy trong xterm, bên ngoài tmux.

Nếu bạn chạy tmux -2, thì tmux bắt đầu với hỗ trợ 256 màu, ngay cả khi nó không nghĩ rằng thiết bị đầu cuối của bạn hỗ trợ 256 màu (khá phổ biến).

Theo mặc định, tmux tự quảng cáo là screenkhông có hỗ trợ 256 màu. Bạn có thể thay đổi giá trị TERMtrong .tmux.confđể biểu thị hỗ trợ 256 màu:

set -g default-terminal "screen-256color"

Bạn có thể sử dụng TERM=xterm-256colorhoặc TERM=screen-256colortrên Ubuntu. Các giá trị này sẽ chỉ gây rắc rối nếu bạn đăng nhập vào một máy từ xa không có mục termcap / terminfo cho các tên này. Bạn có thể sao chép các mục vào thư mục chính của bạn trên máy từ xa; điều này hoạt động với hầu hết các triển khai terminfo hiện đại.

# From the Ubuntu machine to a machine that doesn't have *-256color terminfo entries
ssh somewhere.example.com mkdir -p .terminfo/s .terminfo/x
scp -p /lib/terminfo/s/screen-256color somewhere.example.com:.terminfo/s/
scp -p /lib/terminfo/x/xterm-256color somewhere.example.com:.terminfo/x/

Tôi đánh giá cao lời giải thích, nhưng tôi không chắc nó nhắm vào câu hỏi của tôi .. Chà, tôi đồng ý rằng câu hỏi của tôi khá rộng, nhưng tôi không tập trung đặc biệt vào tmux . Thật ra, tmux là chàng trai duy nhất cư xử phù hợp với mong đợi. Điều bí ẩn hơn nhiều là làm thế nào tôi xtermcó thể chỉ cho tôi 256 màu mặc dù tput colorsđang nói 8. Tôi đoán câu trả lời cho câu hỏi cụ thể này đã được @terdon giải quyết trong các bình luận của mình cho chính câu hỏi.
Đã kết thúc

@Atcold Đó là một câu hỏi dài, nhưng theo như tôi có thể nói tôi đã trả lời nó. Các phần không liên quan đến tmux được bao phủ bởi câu trả lời mà terdon và tôi liên kết với (và tôi đã viết). Câu hỏi của bạn sẽ là một bản sao của câu hỏi đó nếu nó không dành cho khía cạnh tmux. Bạn mong đợi gì hơn từ một câu trả lời?
Gilles 'SO- đừng trở nên xấu xa'

1
@Gilles , tôi không muốn nói xấu. Tôi đã cố gắng công nhận cho @terdon điều "câu trả lời được chấp nhận", mặc dù anh ấy đề cập đến câu trả lời của bạn trong một câu hỏi khác. Mặc dù vậy, set -g default_terminal "screen-256color"lệnh này không đủ để kích hoạt 256 màu trong tmux . Bạn cần alias tmux='export TERM=screen-256color; /usr/bin/tmux'( tham khảo ).
Đã kết thúc vào

@Atcold Không, bí danh không cần thiết (tôi đã thử nghiệm). Hơn nữa, bí danh này sẽ không có ý nghĩa: nó giả vờ rằng nó đang chạy bên trong màn hình hoặc tmux. Tuy nhiên, bạn cần phải chạy tmux -2theo đoạn trước của tôi, nếu tmux không nghĩ thiết bị đầu cuối hiện tại của bạn hỗ trợ 256 màu, vì vậy alias tmux='tmux -2'sẽ có ý nghĩa.
Gilles 'SO- ngừng trở nên xấu xa'

2
@Atcold Câu trả lời của U & L có TERM=xterm-256color tmux, không hợp lý TERM=screen-256color tmux. tmux -2là tốt hơn bởi vì nó hoạt động ngay cả khi screen-256colorkhông có trong cơ sở dữ liệu terminfo cục bộ.
Gilles 'SO- ngừng trở thành ác quỷ'

20

Tôi ấn tượng về cách các câu trả lời được định dạng và chi tiết phong phú (và câu hỏi!). Mặc dù họ cung cấp thông tin và giải pháp có giá trị về các công cụ bạn đã đề cập, nhưng họ cung cấp rất ít thông tin chi tiết về những gì đang diễn ra , và quan trọng nhất là tại sao mọi thứ (phần nào) hoạt động cho một số công cụ mà họ cho là không nên.

Vì vậy, đây là một số hiểu biết về các câu hỏi cơ bản của bạn:

  • Những gì một thiết bị đầu cuối hỗ trợ và những gì nó báo cáo là những thứ khác nhau. Ví dụ, thiết bị đầu cuối Gnome có khả năng hiển thị 256 màu, nhưng nó tự thông báo cho môi trường (thông qua $TERMbiến) dưới dạng xtermtrình giả lập (8 màu).

  • Các công cụ như tputtheo bất cứ điều gì TERMđược đặt thành: tput colorscó thể in 8, trong khi env TERM=xterm-256color tput colorssẽ in 256, bất kể thiết bị đầu cuối của bạn có thực sự hỗ trợ các khả năng đó hay không.

  • vimcũng theo TERMmặc định, nhưng như bạn đã nói với nó để sử dụng 256 màu (thông qua cờ hoặc set t_Co=256), nó sẽ sử dụng 256 màu. Và nó hoạt động vì thiết bị đầu cuối của bạn thực sự hỗ trợ điều đó.

  • tmux, giống như Gnome Terminal, theo mặc định cũng báo cáo là thiết bị đầu cuối 8 màu. Nhưng, không giống như Gnome Terminal, nó chỉ kích hoạt khả năng 256 màu nếu bạn sử dụng -2cờ, điều này cũng khiến nó tự báo cáoxterm-256colortrình giả lập tương thích.

  • xterm, như trong phần mềm giả lập thiết bị đầu cuối cho X11 , chắc chắn hỗ trợ 256 màu. Nhưng xtermnhư trong TERM=xtermlà một "tiêu chuẩn" 8 màu. Nó có nghĩa là khả năng của bản gốc xterm . Khi nó được nâng cấp để hỗ trợ 256 màu, một thời gian dài trước đây, nó đã đặt ra xterm-256colorthuật ngữ cho điều đó.

Vì vậy, tất cả đi xuống:

  • Những khả năng nào thiết bị đầu cuối của bạn thực sự hỗ trợ (và được kích hoạt để làm như vậy)

  • Làm thế nào nó báo cáo các khả năng như vậy với môi trường thông qua TERM

  • Làm thế nào các công cụ giải thích TERMvà điều chỉnh bản thân cho phù hợp.

  • Như bạn có thể suy luận từ những điều trên, tránh mắc kẹt export TERM=xterm-256colortrong ~/.bashrccác kịch bản của bạn và như vậy . Vì các tệp đó được thực thi bất kể thiết bị đầu cuối bạn thực sự sử dụng, nó sẽ làm cho tất cả các thiết bị đầu cuối của bạn, bao gồm các kết nối từ xa từ Windows với Putty, thiết bị đầu cuối bảng điều khiển Linux, v.v., tự báo cáo là tương thích xterm-256color. Điều này có thể đúng với một số nhưng chắc chắn không phải cho tất cả. Ví dụ: gettybảng điều khiển linux mà bạn truy cập CTRL+ALT+1..6không có.

  • Thiết bị đầu cuối phải tự báo cáo là "tiêu chuẩn" mà chúng tương thích nhất. Nếu bạn biết họ có thể xử lý 256 màu, hãy định cấu hình chúng để quảng cáo như vậy.

Cuối cùng nhưng không kém phần quan trọng, một cách đọc tuyệt vời TERMvà 256 màu là:

http://blog.sanctum.geek.nz/term-strings/

http://blog.sanctum.geek.nz/256-colour-terminals/


Một hoặc hai kịch bản ví dụ sẽ là bổ sung tốt cho câu trả lời này.
Elijah Lynn

5

Tôi sẽ cung cấp một câu trả lời bổ sung chỉ giải quyết các thí nghiệm bổ sung của bạn khi chúng liên quan đến màu thư mục được năng lượng mặt trời .

Thiết lập

Chúng tôi có cùng màu đầu ra từ tập lệnh thử nghiệm. Sự khác biệt duy nhất là tôi đã sử dụng lxterminaltrên Openbox với độ mỏng , xcompmgr và không có DM. Do đó, tôi không thể dễ dàng thiết lập bảng màu tùy chỉnh như bạn đã làm vì trình giả lập thiết bị đầu cuối đó không cung cấp các cài đặt đó trong GUI và không có chủ đề cụ thể nào cho nó (chúng chỉ tồn tại cho một vài trình giả lập thiết bị đầu cuối). Vì vậy, tôi chỉ sử dụng một số mờ, các thiết bị đầu cuối chưa được trang trí và màu xanh lam đó là màu nền trước với nền Gentoo màu xanh . Vì tôi không thể sử dụng các phiên bản ansi của các tệp màu, tôi đã tập trung hoàn toàn vào việc nhận kết quả với dircolors.256darkphiên bản đơn giản "đã xuống cấp".

Tôi đã sử dụng cấu hình có liên quan sau đây và phông chữ trung bình inconsolata :

echo $TERM
xterm

.bashrc:
eval `dircolors /path/to/dircolors.256dark`

.vimrc:
set t_Co=256
let g:solarized_termcolors=256
syntax enable
set background=dark
colorscheme solarized

.tmux.conf:
nothing at all related to colors!
start tmux with "tmux -2"

Chất màu

Hình ảnh bên dưới cho thấy những gì xảy ra cả bên trong và bên ngoài tmux với các cài đặt này. Thứ ba đầu tiên bên trái cho thấy các cửa sổ lxterminal không được trang trí xếp chồng lên nhau theo chiều dọc (3). Phía bên phải bạn có một tmux lắp ráp cho thấy các chương trình giống hệt như nhau (3) Tôi cũng đã bao gồm một solarized xterm1 cho thấy nano bằng cách sử dụng tập tin .Xresources bao gồm trong gói đầy đủ (và lấy mẫu nó với xrdb -load ~/.Xresources):

nhập mô tả hình ảnh ở đây vui lòng nhấp chuột phải / xem hình ảnh để kiểm tra ở độ phân giải đầy đủ

Thiết bị đầu cuối ở góc trên cùng bên trái hiển thị màu thư mục mặc định. Chỉ cần dưới đây là suy thoái solarized phiên bản. Ngoại trừ màu hồng trên nền màu xanh cho .ccác tệp tôi đã thêm, nó giống hệt với những gì được mong đợi từ điều này (xem hình ảnh bên dưới để tham khảo). So với các mặc định, nó xây dựng thêm trên các thuộc tính mở rộng, ví dụ như đậm / sáng / đảo ngược, v.v. và màu sắc rõ ràng là khác nhau. Việc chuyển nhượng màu mặc định cho .txttập tin trong nhiều phân phối là màu xanh lá cây, nhưng nó phải là màu xám thay vì khi solarized . Một ansi tập render một file .txt như màu xanh lá cây là một trong hai không hiển thị chính xác hay không render gì cả. Các kết quả phía bên tay phải mà bạn đã hiển thị là kết quả chính xác (256dark) liên quan đến tham chiếu sau:

nhập mô tả hình ảnh ở đây bản đồ tham chiếu dircolors "xuống cấp"

Quan sát

Với cấu hình tôi đã sử dụng, kết quả xuất hiện giống hệt bên trong và bên ngoài tmux (tôi đã đảo ngược nhận xét (#) trong vi nhưng nếu không thì plugin hoạt động như bình thường và bộ ghép kênh không ảnh hưởng đến điều này). Fonts đóng một vai trò rất lớn trong solarized tính năng định nghĩa, và một phông chữ tốt là cần thiết để tối đa hóa trải nghiệm. Các solarized thư mục màu sắc bằng cách sử dụng 256dark tập tin phù hợp với tài liệu tham khảo và không đòi hỏi cấu hình mô phỏng thiết bị cụ thể.


Phần kết luận

Trên thực tế, việc hiển thị ansi của các màu của thư mục hoàn toàn khác với các mặt trời bị suy giảm (256dark). Nhiều đến mức dưới tập tin ansi .txt có màu xanh. Một cái không thể được sử dụng để xác nhận kết xuất của cái khác. Cả hai giải pháp cần cấu hình khác nhau và tạo ra kết quả hoàn toàn khác nhau.


"Tôi không hiểu kết luận của bạn về việc không chú ý nhiều đến mã hóa 256dark trong khi thực tế nó là tệp màu duy nhất mang lại danh sách thư mục năng lượng mặt trời?" Sự nhầm lẫn của tôi xuất phát từ thực tế là tôi đang xem xét ansi-darkđầu ra chính xác (vì nó sử dụng phiên bản không xuống cấp). Sau đó, nếu bạn lấy tham chiếu đầu ra của 256dark, thì bạn có suy nghĩ đảo ngược.
Vào

"Với cấu hình tôi đã sử dụng, kết quả xuất hiện giống hệt nhau bên trong và bên ngoài tmux" Chắc chắn, nếu bạn đang sử dụng 256 màu, thì dĩ nhiên, chúng sẽ hiển thị giống như bất cứ nơi nào bạn có hỗ trợ 256 màu. "Không rõ giải pháp ansi sẽ cung cấp thêm gì trong bối cảnh này ..." Kết quả sẽ có được Solarized thực sự của họ (thay vì xấp xỉ).
Vào

Tôi hiểu. Tôi đã không nghiên cứu phần ansi thực sự vì vậy tôi không thể biết bạn đến từ đâu. Trong mọi trường hợp tôi thấy Q của bạn khá cho phép cảm ơn bạn. Có lẽ tôi sẽ sử dụng vi nhiều hơn bây giờ mà tôi thấy nó khá lol. Về kết quả ansi, thực sự bây giờ tôi đã thấy nó trông như thế nào ... họ chỉ giới thiệu điều đó cho màu dir ở đây . Tại sao h. họ có mã hóa khác nhau không ... Ý tôi là tôi thấy .txt màu xanh lá cây ... màu xám gần với màu xanh lá cây như thế nào? Tôi không hiểu dự án của họ một cách nghiêm túc.

Vâng, tôi đã liên lạc với cá nhân tác giả và câu trả lời là "đó là tùy chỉnh cá nhân của anh ấy, vì anh ấy thích cách đó". Tôi không nói nên lời ... Tôi rất vui vì Q của tôi đã giúp ai đó :)
Vào
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.