Lập trình truy cập vào màu nền xterm hiện tại?


13

Tôi muốn thiết lập các màu nhắc trong .bashrctùy thuộc vào màu mà nó đang sử dụng cho nền trước và nền.

Ví dụ, dấu nhắc màu xanh nếu nền sáng và màu be nếu trời tối.

Có cách nào để tìm hiểu các thiết lập hiện tại trong một tập lệnh không?

Câu trả lời:


22

Email trở lại từ Thomas Dickey (người bảo trì xterm) có cái này. Đặc biệt lưu ý phần về ?. Tham chiếu Ps = 4đến OSC Ps ; Pt STvị trí OSC(tiền tố "Điều khiển hệ điều hành") ESC ]ST(hậu tố "Chuỗi kết thúc chuỗi") là \(dấu gạch chéo ngược). Đây 4là một trong những tiểu ban có thể có của OSC.

Đối với toàn bộ bảng màu, có thể được đặt / truy xuất bằng cách sử dụng phần mở rộng màu 88/256. Trong ctlseqs.txt, nó được tóm tắt tại đây:

  Ps = 4 ; c ; spec -> Change Color Number c to the color
specified by spec.  This can be a name or RGB specification as
per XParseColor.  Any number of c/spec pairs may be given.
The color numbers correspond to the ANSI colors 0-7, their
bright versions 8-15, and if supported, the remainder of the
88-color or 256-color table.

If a "?" is given rather than a name or RGB specification,
xterm replies with a control sequence of the same form which
can be used to set the corresponding color.  Because more than
one pair of color number and specification can be given in one
control sequence, xterm can make more than one reply.

Một chút sau này trong các tài liệu có nhiều lệnh con OSC, Ps = 10Ps = 11, và những người khác.

Ps = 1 0  -> Change VT100 text foreground color to Pt.
Ps = 1 1  -> Change VT100 text background color to Pt.

Ví dụ - điều này truy vấn nền bằng cách sử dụng Ps = "11"(từ ngay phía trên) và Pt = "?", cắm vào OSC Ps ; Pt ST. Trong tiếng vang, \033đang được sử dụng để thoát và \\cho dấu gạch chéo ngược cuối cùng.

echo -en "\033]11;?\033\\"

Đầu ra:

^[]11;rgb:0000/0000/0000^[\ 

Cảnh báo: Màu được trả về không phản ánh liệu video đảo ngược, như -rv, có được bật hay không và thu thập thông tin qua ~ 260 màu có sẵn thông qua OSC 4 ; c ; ? STkhông hiển thị bất kỳ màu nào cả hai đều theo nền VÀ thay đổi với video đảo ngược. Vì nhiều người dùng đặt nền tối bằng cách chỉ sử dụng xterm -rv, điều này làm phức tạp việc xác định xem nền có thực sự tối hay không. Hầu hết các màu không điều chỉnh theo -rv, một trong hai.

Một tập lệnh để thực hiện truy vấn đầy đủ và thực sự nắm bắt trả lời từ xterm:

#!/bin/bash
success=false
exec < /dev/tty
oldstty=$(stty -g)
stty raw -echo min 0
col=11      # background
#          OSC   Ps  ;Pt ST
echo -en "\033]${col};?\033\\" >/dev/tty  # echo opts differ w/ OSes
result=
if IFS=';' read -r -d '\' color ; then
    result=$(echo $color | sed 's/^.*\;//;s/[^rgb:0-9a-f/]//g')
    success=true
fi
stty $oldstty
echo $result
$success

1
Wow ... một phản hồi sau hai năm ... cảm ơn bạn. Tôi hoàn toàn không hiểu lời giải thích nhưng ví dụ này không làm gì cho tôi ... không có gì.
Biến khổ sở

Heh. Tôi đang chạy lại nó trong một xterm gần đây - một xterm thực tế - lần này với tất cả các tài nguyên X của tôi bị loại bỏ (có nghĩa là nó mang lại tất cả "f" cho màu thay vì tất cả "0"). Sử dụng / bin / echo hoặc echo dựng sẵn của bash hoạt động tốt. Ví dụ tôi đã thử là sao chép / dán trực tiếp từ bài viết trên. Môi trường của tôi là Ubuntu 11.10 (một dẫn xuất Linux / Debian). Tôi không có một hệ điều hành khác tiện dụng để kiểm tra.
Alex North-Keys

Tùy thuộc vào cách nhắc nhở của bạn được định cấu hình, có khả năng nó sẽ hạ cánh trên đầu của xterm để nhét đầu vào vào thiết bị đầu cuối của bạn để đáp ứng với truy vấn của bạn. Từ quan điểm của shell của bạn, câu trả lời của xterm trông giống như bạn, đang gõ.
Alex North-Keys

1
Hmm, thiết bị đầu cuối gnome trong Ubuntu 12.04 tuyên bố là tương thích xterm, nhưng không in lại bất cứ thứ gì. Tại sao vậy?
Nik Reiman

1
Bây giờ đây là thiết bị đầu cuối tinh khiết voodoo. Câu trả lời tuyệt vời.
Qix - MONICA ĐƯỢC PHÂN PHỐI

0

loại

đặt cài đặt vào tệp ~ / .Xdefaults của bạn:

xterm*foreground: blue
xterm*background: white

trong shell của bạn, bạn chỉ cần grep các giá trị:

awk '/xterm\*foreground:(.*)/ { print $2 }' < .Xdefaults

mặt khác, thật khó để có được một số giá trị nội bộ của xterm.


Tôi thậm chí không sử dụng X :) Tôi đang sử dụng rxvt từ cygwin chạy mà không có máy chủ X. Ngoài ra, tôi muốn có thể sử dụng các màu khác nhau trên các máy chủ khác nhau và cho các tác vụ khác nhau, điều này đòi hỏi tôi phải truy vấn thuật ngữ cho các cài đặt.
Biến khốn khổ

tốt, bạn đã không chỉ định hệ điều hành của mình :)
akira

xin lỗi vì điều đó. Lý do tôi không chỉ định là vì tôi đã mong đợi giải pháp dựa trên việc lặp lại một số chuỗi ma thuật và lấy lại một số thông tin trên thiết bị xuất chuẩn.
Biến khổ sở

tốt, những gì bạn "echo" thường nằm trong shell (bash, zsh), nó không chuyển đến xterm (ngoại trừ trong bước cuối cùng khi hiển thị đầu ra của các lệnh).
akira

-1 awk là công cụ sai cho công việc.
g33kz0r

-1

Thật ra tôi nghĩ bạn muốn điều này:

% xrdb -query

Điều đó sẽ liệt kê các cài đặt cho bạn. Xem thêm:

http://docstore.mik.ua/orelly/unix3/upt/ch06_08.htm

Để sửa đổi thời gian chạy, sử dụng:

% echo "some*setting: somevalue" | xrdb -merge

-queryliệt kê tất cả các nguồn lực. chỉ định tài nguyên không hoạt động trên Ubuntu của tôi.
akira

tiếng vang "bất cứ điều gì" | xrdb -merge
g33kz0r

đọc lại câu hỏi: OP muốn đặt màu của KHUYẾN MÃI theo các cài đặt của xterm. OP không muốn thay đổi xresource.
akira

Xem bình luận của anh ấy để trả lời của bạn. Anh ta muốn "truy vấn thuật ngữ [sic]". Vì vậy, anh ta muốn xrdb -query
g33kz0r

nếu bạn muốn cụ thể như vậy: anh ta muốn truy vấn rxvt mà không cần chạy xserver trên windows (điều này là có thể) và xrdb -querychỉ cung cấp cho bạn danh sách tất cả các tài nguyên .. mà bạn phải awk / grep một lần nữa để đến tiền cảnh. và đó là những gì tôi đã thừa nhận. xrdb -mergelà hoàn toàn không chính thức ở đây vì OP không muốn sửa đổi xresource nhưng sự xuất hiện của bashprompt.
akira
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.