Không thể áp dụng độ sáng cho màu nền của thiết bị đầu cuối


7

Tôi có một vấn đề với màu sắc trong trình giả lập thiết bị đầu cuối của tôi. Tôi đang sử dụng LXTerminalnhư trình giả lập thiết bị đầu cuối và LXDEmôi trường máy tính để bàn của tôi.

Lệnh sau được cho là in văn bản màu đỏ trên nền màu xám:

printf "\n\033[1;31;40m"hello"\033[00m\n\n"

nhưng điều đó không làm việc Nền màu xám bị thiếu (văn bản màu đỏ là OK). Trên máy cũ của tôi ( Gnome/Gnome Terminal) mọi thứ đều hoạt động tốt

Tôi đã thử cài đặt một số trình giả lập thiết bị đầu cuối khác, nhưng vấn đề vẫn còn. Tôi thậm chí không chắc vấn đề này có liên quan đến trình giả lập thiết bị đầu cuối hay không. Trong Bảng điều khiển (CTRL + ALT + F1), màu xám nền không hoạt động trên cả hai máy)

Vấn đề này chỉ giới hạn ở nền màu xám. Tất cả các màu khác đều hoạt động tốt, ví dụ như sau đây in văn bản màu đỏ trên nền màu xanh lá cây.

printf "\n\033[1;31;42m"hello"\033[00m\n\n"

Tôi sẽ đánh giá cao sự giúp đỡ nào. Tôi thậm chí không biết bắt đầu xử lý sự cố ở đâu.


Không echo $TERMin gì?
terdon

@terdon Nó sẽ không làm cho bất kỳ sự khác biệt.
goldilocks

@goldilocks không phải là $TERMđọc để xác định cách xử lý các chuỗi thoát?
terdon

1
@terdon: không có, $TERMđược đọc bởi (n) lời nguyền / tiếng lóng /...- sử dụng chương trình để xác định trình tự thoát để gửi .
ninjalj

1
@goldilocks: konsolecó thể thực hiện quaTERM=konsole-256color tput setab 8; echo foobar; tput setab 0
ninjalj

Câu trả lời:


10

Có tám màu ANSI tiêu chuẩn, được hỗ trợ bởi mọi trình giả lập thiết bị đầu cuối. Hầu hết các trình giả lập thiết bị đầu cuối cũng có tám biến thể sáng của màu ANSI tiêu chuẩn.

Tuy nhiên, các giá trị màu thực tế mà mã thoát ánh xạ không được chuẩn hóa và trên thực tế, chúng thường thay đổi một chút giữa các trình giả lập đầu cuối. Vì vậy, nếu bạn thực hiện printf "\e[31;47mTest\n"in văn bản màu đỏ trên nền trắng, màu sắc thực tế của màu đỏ và trắng bạn nhận được có thể khác nhau tùy thuộc vào trình giả lập thiết bị đầu cuối bạn sử dụng.

Vì vậy, điều đó phần nào giải thích vấn đề: giá trị màu không chuẩn và LXTerminalcó thể có các giá trị mặc định khác cho bảng màu mà bạn không quen sử dụng. Nếu bạn nhìn xung quanh trong cài đặt, thông thường bạn có thể định cấu hình bảng màu thành bất cứ thứ gì bạn thích.

Vấn đề khác mà bạn gặp phải là những gì thuộc tính in đậm thực sự không được chuẩn hóa. Có ba khả năng: nó có thể làm cho phông chữ đậm, nó có thể làm cho màu nền trước sáng hơn hoặc cả hai có thể làm cho màu nền trước sáng hơn và làm cho phông chữ đậm.

Một lần nữa, hành vi mặc định ở đây khác nhau giữa các trình giả lập thiết bị đầu cuối và bạn thường có thể thay đổi nó nếu bạn có thể tìm thấy cài đặt phù hợp. Grep cho một cái gì đó đề cập đến 'đậm' hoặc 'sáng'.

Nếu bạn muốn sử dụng màu sáng, thì bạn có thể sử dụng mã thoát màu được gọi là aixterm thay vì đậm. Đây không phải là tiêu chuẩn, nhưng chúng được hỗ trợ trong mọi trình giả lập thiết bị đầu cuối hiện đại mà tôi biết. Không giống như đậm, chúng luôn sử dụng màu sáng, cộng với chúng có thể được sử dụng để hiển thị màu nền sáng.

Vì vậy, ví dụ, nếu bạn muốn in văn bản màu đỏ sáng trên nền trắng sáng, bạn sẽ làm điều này : printf "\e[91;107mTest\n".

Để tham khảo, đây là bảng gồm tất cả các mã thoát màu:

|    ANSI |    ANSI |    ANSI    |                | Aixterm | Aixterm 
|   Color | FG Code | BG Code    | Bright Color   | FG Code | BG Code 
+---------+---------+--------    +----------------+---------+-------- 
|   Black |      30 |      40    |   Bright Black |      90 |     100 
|     Red |      31 |      41    |     Bright Red |      91 |     101 
|   Green |      32 |      42    |   Bright Green |      92 |     102 
|  Yellow |      33 |      43    |  Bright Yellow |      93 |     103 
|    Blue |      34 |      44    |    Bright Blue |      94 |     104 
| Magenta |      35 |      45    | Bright Magenta |      95 |     105 
|    Cyan |      36 |      46    |    Bright Cyan |      96 |     106 
|   White |      37 |      47    |   Bright White |      97 |     107 

thực tế, vấn đề không giới hạn ở những "mã thoát" này. Tôi có cùng một vấn đề với joe editor. Trong gnome-terminal, tôi có thể thấy nền màu xám. Trong LXTerminalđó là mất tích.
Martin Vegter

Và bạn đã đúng về màu sắc thực tế khác nhau giữa các trình giả lập thiết bị đầu cuối khác nhau. Khi tôi mở chỉ huy nửa đêm LXTerminalgnome-terminal, màu xanh trông rất khác. Nhưng trở lại vấn đề ban đầu của tôi: nền màu xám LXTerminalkhông chỉ là màu khác với màu gnome-terminalmà còn bị thiếu hoàn toàn.
Martin Vegter

1
Bạn có ý nghĩa gì mà nền xám bị thiếu? Nó có thể ở đó, nhưng không thể nhìn thấy vì nó cùng màu với nền của bạn. Về mặt kỹ thuật không có màu xám trong ANSI, chỉ có màu đen hoặc trắng. Vì vậy, có thể bạn có màu nền của bạn được đặt thành màu đen và màu đen ANSI được ánh xạ thành màu đen LXTerminalnhưng được ánh xạ sang màu xám gnome-terminal. Tôi không sử dụng LXTerminal, nhưng tôi cá là nếu bạn nhìn vào cài đặt và thay đổi bất kỳ màu 'đen' nào thành 'xám' thì nó sẽ hiển thị.
Matt

Bạn hoàn toàn đúng. Khi tôi thay đổi màu nền của tôi LXTerminalthành một thứ khác ngoài màu đen, tôi có thể thấy printf "\n\033[1;31;40m"hello"\033[00m\n\n"văn bản đó in trên nền đen. Vì vậy, những gì gnome-terminaldiễn giải là màu xám, LXTerminalgiải thích là màu đen. Có cách nào để hiển thị màu xám LXTerminal, giống như trong gnome-terminal?
Martin Vegter

1
Trên thực tế, aixterm là SGR 90-97 và 100-107. Nền sáng cho đậm là từ các hệ thống khác (không phải bản gốc cho Linux, nhưng được sử dụng ở đó).
Thomas Dickey

5

Các 1thuộc tính vào đầu 1;31;40lượt về (aka. "Sáng") Chế độ "đậm", nhưng một số thiết bị đầu cuối chỉ áp dụng điều này để màu foreground. Tôi không biết lý do gì (và việc thay đổi biến $ TERM không tạo ra sự khác biệt), vì chúng hỗ trợ 16 màu ở phía trước. 1 0 (từ 40: 4 = nền, 0 = màu) thực sự là màu đen, nhưng "đen sáng" là màu xám. Đây là hai giải pháp:

  • Màu 7 (màu trắng) có thể sẽ chuyển sang màu xám chứ không phải màu trắng (đối với màu trắng thực sự, bạn cần "màu trắng sáng", nghĩa là nền bạn thực sự không thể có là màu trắng).

  • Bạn sẽ có thể sử dụng thiết bị đầu cuối gnome trong LXDE nếu bạn muốn. Chỉ cần cài đặt nó và bắt đầu với gnome-terminal(tôi tin đó là tên lệnh của nó). Sau đó, bạn sẽ phải định cấu hình bất kỳ trình khởi chạy nào để sử dụng thay vì thiết bị đầu cuối lx.

1 Đây là dự đoán của tôi: Lưu ý rằng cài đặt đậm áp dụng độ sáng cho màu nền trước thêm phần nhấn mạnh đậm. Do đó, bạn không thể sử dụng màu nền trước mà không cần tô đậm. Có lẽ trở lại khi các thiết bị đầu cuối đơn sắc là phổ biến, chỉ đơn giản là in đậm để nhấn mạnh, ví dụ: \\033[1mBlah blah\\033[0mlà phổ biến - và trên thực tế, điều này vẫn sẽ hoạt động, nhưng nó cũng sẽ làm cho màu nền trước của bạn sáng. Nếu chúng tôi cho rằng điều này không mong muốn vì điều này cũng làm sáng nền (vì nó chỉ được coi là đậm), thì chúng tôi chắc chắn rằng việc triển khai đã không làm điều đó. Ồ tốt


Tôi đã cài đặt gnome-terminalvà màu sắc được hiển thị chính xác. Nó có nghĩa là vấn đề này là cụ thể LXTerminal? Có cách nào để khắc phục điều này? Tôi muốn sử dụng LXTerminal, nếu vấn đề này có thể được giải quyết.
Martin Vegter

2
Vấn đề không cụ thể đối với LXTerminal; thực tế gnome-terminalcó lẽ là thiết bị đầu cuối duy nhất thực hiện những gì bạn muốn - Tôi đã là người dùng linux được 15 năm và đã sớm biết về các chuỗi ANSI vì lời nhắc; nó luôn như thế này Tôi có thể có thể tìm ra lý do tại sao bằng cách nghiên cứu thông số kỹ thuật ANSI chính thức và / hoặc lội qua nguồn, nhưng điều đó sẽ đòi hỏi một khoảng thời gian rất không xác định;) Tôi không tìm thấy bất cứ điều gì hy vọng sau khi duyệt web, vì vậy bạn là câu hỏi hay nhưng ai đó đã biết cũng có thể xuất hiện vào ngày hôm sau hoặc lâu hơn ...
goldilocks

1

Đây là một mẹo bạn có thể sử dụng với một số trình giả lập thiết bị đầu cuối. Nó sẽ cung cấp cho bạn màu nền sáng bằng cách sử dụng thuộc tính video đảo ngược (7) để chọn màu nền trước sáng, sau đó hoán đổi nó với màu nền.

echo -e "\e[1;32;7mText on a bright green background"

Điều hấp dẫn là mặc dù hiện tại bạn có thể có 16 màu nền, nhưng giới hạn của 8 màu hiện được áp dụng cho tiền cảnh / văn bản thay thế. Và để thêm rắc rối, trong khi thuộc tính video đảo ngược đang hoạt động, bạn phải đặt màu văn bản bằng cách sử dụng mã thuộc tính cho màu nền!


1
phương pháp đảo ngược là phương pháp duy nhất hoạt động trong mọi thiết bị đầu cuối mà tôi đã thử nghiệm: win xp, win7 (mintty, cmd cygwin, conemu cygwin), debian (xfce, xterm)echo -e "\e[1;33;40;7m TEST2 \e[0m"
Badr Elmer

0

Với 47=background whitethay vì 40=background blackbạn có được màu trắng không đậm làm nền.

]# printf "\033[0;30;47m"hello"\033[00m\n"
hello (black on grey)
]# printf "\033[1;30;47m"hello"\033[00m\n"
hello (darkgrey on grey)
]# printf "\033[1;37;47m"hello"\033[00m\n"
hello (white on grey)
]# printf "\033[0;37;47m"hello"\033[00m\n"
hello (INVISIBLE grey on grey)

Theo mặc định, kết quả màu đen đậm có màu xám đen. Màu trắng bình thường thực sự là màu xám, vì màu trắng đậm là màu trắng.


Vòng lặp này in hai cột với tất cả các kết hợp màu trên nền đen và màu trắng.

for ((i=30; i<=47; i++))
do
    echo -en  "\e[${i}mHello\e[0m";
    echo -e "\e[1;${i}mHello\e[0m";
done

Nó bắt đầu với màu đen vô hình và màu tối trên nền đen, nhưng 17 dòng còn lại trông rất đẹp và hiển thị toàn bộ bảng màu của bảng điều khiển.

(38 và 39 nên được bỏ qua, nhưng để đơn giản, tôi chỉ chạy từ 30 đến 47)


Aceemtd A. đề cập đến tám màu sắc và thiếu các tiêu chuẩn.

Sáu màu 31-36 (đỏ đến lục lam) được xác định rõ. Đen (30) và Trắng (37) cũng có, nhưng các biến thể táo bạo của chúng ít hơn, đặc biệt là nền (40 và 47).


Tôi chỉ lưu ý: trong xterm, văn bản màu trắng bình thường hiển thị trên nền màu xám, nhưng trong bảng điều khiển linux thì không. (dòng cuối cùng, với i = 47) (cho đến 30 phút trước, tập lệnh dừng ở 46, vì tôi không muốn có các biến thể không thể đọc được)

Ở cả hai nơi, khi được chọn bằng chuột, nó sẽ điều chỉnh một cách khéo léo và có thể đọc được khi đảo ngược.

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.