Làm thế nào để xác định màu hiện tại của đầu ra giao diện điều khiển?


14

Tôi biết rằng, nếu một thiết bị đầu cuối màu có sẵn, người ta có thể tô màu đầu ra của nó bằng các ký tự thoát .

Nhưng có khả năng để tìm ra, màu sắc mà đầu ra hiện đang được hiển thị là? Hoặc tốt hơn, văn bản sẽ có màu gì, nếu tôi xuất nó ngay bây giờ?

Tôi yêu cầu không phá vỡ bất kỳ cài đặt màu nào trước đó, khi sử dụng các ký tự thoát này. Ký tự thoát 'màu nền trước mặc định' đang lấy thông tin từ bảng màu, thay vì màu văn bản trước khi tôi thay đổi.


Nhìn vào các biến termcap và terminfo có vẻ như không thể. Ví dụ, bạn có thể nhận được số lượng màu mà thiết bị đầu cuối của bạn hỗ trợ echotc Cohoặc echoti colors, nhưng đơn giản là không có biến nào lưu trữ định nghĩa mã màu hiện tại.
jimmij

@jimmij Mình nghĩ vậy và hy vọng, mình đã bỏ lỡ điều gì đó. Nếu bạn chắc chắn về điều đó là không thể, thì hãy biến nó thành câu trả lời và cuối cùng tôi sẽ chấp nhận nó, nếu không có gì khác xảy ra. Cảm ơn vì đã dành thời gian cho tôi.
Minix

Câu trả lời:


10

Nói chung, có được màu sắc hiện tại là không thể. Việc xử lý trình tự điều khiển của một thiết bị đầu cuối xảy ra "bên trong" thiết bị đầu cuối, bất cứ nơi nào xảy ra. Với một trình giả lập thiết bị đầu cuối như xtermhoặc được tích hợp vào nhân hệ điều hành cung cấp các thiết bị đầu cuối ảo kernel, trạng thái bên trong của trình giả lập, bao gồm cả khái niệm về "biểu hiện đồ họa" hiện tại (nghĩa là màu sắc và thuộc tính), có trên máy chính nó và có thể truy cập trên lý thuyết. Nhưng đối với một thiết bị đầu cuối thực sự, thông tin này nằm ở một số vị trí RAM trên một máy riêng biệt được kết nối thông qua một liên kết nối tiếp.

Điều đó nói rằng, một số thiết bị đầu cuối bao gồm một cơ chế để đọc thông tin như là một phần của giao thức đầu cuối của chúng, được gửi qua liên kết nối tiếp đó. Chúng cung cấp các chuỗi điều khiển mà một chương trình có thể gửi đến thiết bị đầu cuối, khiến nó gửi lại thông tin về trạng thái bên trong của nó, như là đầu vào của thiết bị đầu cuối. mikeservđã cho bạn thấy các chuỗi điều khiển mà xtermtrình giả lập thiết bị đầu cuối đáp ứng. Nhưng đây là cụ thể xterm. Các trình giả lập thiết bị đầu cuối tích hợp trong nhân Linux và các hạt nhân BSD khác nhau là các loại thiết bị đầu cuối khác nhau, chẳng hạn, và hoàn toàn không thực hiện bất kỳ chuỗi điều khiển nào như vậy. Điều tương tự cũng xảy ra với cả gia đình của các thiết bị đầu cuối thực sự.

Các thiết bị đầu cuối DEC VT525 thực hiện cơ chế đọc ra, nhưng có một tập hợp các chuỗi điều khiển không có mối quan hệ nào với các thiết bị được sử dụng bởi xterm. Một người gửi chuỗi DECRQSS (Lựa chọn hoặc Cài đặt Yêu cầu) để yêu cầu hiển thị đồ họa hiện tại và thiết bị đầu cuối phản hồi bằng cách gửi DECRPSS (Chọn hoặc Cài đặt Báo cáo). Đặc biệt:

  1. Máy chủ gửi: DCS $ q mST (DECRQSS với phần chức năng điều khiển của SGR làm cài đặt)
  2. Thiết bị đầu cuối trả lời: DCS 0 $ r 0 ; 3 3 ; 4 4 m ST (DECRPSS với các tham số và phần chức năng điều khiển của chuỗi điều khiển SGR đặt màu nền trước và màu nền hiện tại)

Tất nhiên, việc đọc kỹ câu hỏi của bạn cho thấy rằng bạn đang vẫy một quả chuối phủ sô cô la tại các hệ thống tiền tệ châu Âu đó một lần nữa. Những gì bạn thực sự đang cố gắng thực hiện, trong đó bạn đã chọn một giải pháp và sau đó hỏi làm thế nào để thực hiện một phần của giải pháp đó, sẽ duy trì trạng thái trước đó trong khi bạn viết một số đầu ra bị lỗi. Không chỉ có trình tự điều khiển DEC VT để thực hiện việc này, còn có trình tự thiết bị đầu cuối bảng điều khiển SCO được nhận dạng bởi xtermcác trình giả lập thiết bị đầu cuối tích hợp hạt nhân khác nhau và mục nhập termcap / terminfo cho bạn biết chúng là gì cho thiết bị đầu cuối của bạn.

Các mục termcap là scrc. Các mục terminfo là save_cursorrestore_cursor . Các tên có phần gây hiểu nhầm là có hiệu lực (mặc dù chúng hoạt động như một cảnh báo rằng bạn đang dựa vào một cái gì đó thực tế hơn là de jure ). Các trình tự điều khiển DECSC, DECRC, SCOSC và SCORC thực tế cũng lưu và khôi phục biểu hiện đồ họa hiện tại.

Cho rằng bài viết mà bạn đã chỉ là tất cả về việc tạo các chuỗi điều khiển từ các tập lệnh shell, lệnh mà bạn đang hiện đang tìm kiếm là tput.

đọc thêm


Câu trả lời chính xác. Vui mừng tôi đã trở lại cho nó. Cảm ơn rất nhiều.
Minix

@Minix - ngoài scrc, bạn có thể cũng muốn nhìn vào bộ đệm thay thế nếu hỗ trợ thiết bị đầu cuối của bạn nó. Và vâng, đây là một câu trả lời tuyệt vời. Minix, cũng có thể xem xét điều này: cách sử dụng / dev / fb0 như một bàn điều khiển từ không gian người dùng . Các noshbộ anh ấy đề nghị có của riêng mình.
mikeerv 20/2/2015

@mikeerv Tôi sẽ xem, cảm ơn vì các liên kết :)
Minix

2
Nhận thấy điều này "không có mối quan hệ với những người được sử dụng bởi xterm" - tuy nhiên, DECRQSS được xterm hỗ trợ trong một thời gian khá lâu. Phần có phản hồi SGR bao gồm ngày màu đến năm 1996.
Thomas Dickey

2
Xem Đọc thêm , trong tài liệu trình tự điều khiển của xterm, trong đó chỉ ra rằng tài liệu VT520 / etc không khả dụng khi xterm bắt đầu cung cấp màu trong DECRQSS(chậm khoảng 7 năm ...).
Thomas Dickey

10

Trong một xtermbạn có thể nhận được mã màu RGB hiện tại được báo cáo bằng cách thay đổi lối thoát thay đổi màu thành truy vấn. Sử dụng ESC ] Ps m- nhưng thêm một ?dấu hỏi. Từ các tài liệu :

  • Nếu a "?"được cung cấp thay vì tên hoặc thông số RGB, hãy xtermtrả lời bằng chuỗi điều khiển có cùng dạng có thể được sử dụng để đặt màu động tương ứng. Bởi vì nhiều hơn một cặp số màu và thông số kỹ thuật có thể được đưa ra trong một chuỗi điều khiển, xtermcó thể thực hiện nhiều hơn một câu trả lời.
    • P s = 1 0 → Thay đổi màu nền trước của văn bản VT100 thành P t.
    • P s = 1 1 → Thay đổi màu nền văn bản VT100 thành P t.
    • P s = 1 2 → Thay đổi màu con trỏ văn bản thành P t.
    • P s = 1 3 → Thay đổi màu nền trước của chuột thành P t.
    • P s = 1 4 → Thay đổi màu nền chuột thành P t.
    • P s = 1 5 → Thay đổi màu nền trước của Tektronix thành P t.
    • P s = 1 6 → Thay đổi màu nền của Tektronix thành P t.
    • P s = 1 7 → Thay đổi màu nền nổi bật thành P t.
    • P s = 1 8 → Thay đổi màu con trỏ Tektronix thành P t.
    • P s = 1 9 → Thay đổi màu nền trước nổi bật thành P t.

Tôi có nghi ngờ nghiêm trọng nếu điều này có khả năng hoạt động trong một trình giả lập thiết bị đầu cuối khác, nhưng trong trường xtermhợp nếu bạn chạy ...

printf '\033]11;?\007'

... xtermsẽ đẩy lùi vào bộ đệm đầu vào của thiết bị đầu cuối của bạn một chuỗi như sau ...

11;rgb:ffff/ffff/ffff

... cho nền hoặc cho nền trước:

printf '\033]10;?\007'

10;rgb:0000/0000/0000

Vì vậy, khi tôi chạy printf '\033]10;rgb:8f8f/8f8f/8f8f8f\007, tất cả văn bản trong thiết bị đầu cuối trước đó là "bình thường" chuyển sang màu xanh nhạt. Sau đó, chạy printf '\033]10;rgb:bfbfbf/bfbfbf/bfbfbf\007'biến tất cả các văn bản màu xanh nhạt trở lại "bình thường". Làm cách nào để sử dụng giá trị này để chỉ thay đổi màu của văn bản di chuyển về phía trước?
Fourpastmidnight

@fourpastmidnight: có thể là clearđầu tiên?
mikeerv

Tôi nghĩ rằng tôi không hiểu tài liệu. Nó nói rõ ràng "P s = 1 0 -> thay đổi màu nền trước VT100", và đó là những gì nó dường như đang làm. ;) Nhưng đó không phải là điều tôi mong đợi. Tôi có thể cần sử dụng giá trị RGB được lấy từ "P s = 1 0; Pt =?" với một lệnh thoát khác để đạt được những gì tôi muốn.
Fourpastmidnight

Ok, vì vậy, printf '\033]10;?\007'truy vấn xterm cho màu nền trước hiện tại của thiết bị đầu cuối. Nếu thiết bị đầu cuối của bạn được bắt đầu với "bình thường" (ví dụ 7 là màu nền trước), nhưng bạn chạy tput setaf 3trước khi chạy printflệnh, printflệnh trên vẫn trả về "bình thường" - và điều đó đúng, bởi vì đó là màu nền trước của thiết bị đầu cuối của bạn. Những gì tôi đã hy vọng là một cách để lấy lại màu hiện tại của vị trí con trỏ hiện tại để tôi có thể lưu nó lại để "khôi phục" nó sau - theo OP.
Fourpastmidnight

1
@fourpastmidnight - bạn đã theo liên kết trong câu trả lời ở đây chưa? Ngoài ra, Thomas Dickey - (ông đã bình luận về câu trả lời khác cho câu hỏi này) là người xtermduy trì và là một thành viên tích cực ở đây. (liên kết đến trang web của anh ấy - xtermtài liệu thoát của nó rất rộng - và về cơ bản là tài liệu tham khảo tiêu chuẩn cho bất kỳ lập trình viên nào khác muốn viết một thiết bị đầu cuối)
mikeerv
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.