Programowy dostęp do bieżącego koloru tła xterm?

13

Chciałbym ustawić kolory podpowiedzi w .bashrczależności od kolorów używanych na pierwszym planie i tle.

Na przykład niebieski monit, jeśli tło jest jasne, a beżowy, jeśli jest ciemny.

Czy istnieje sposób na sprawdzenie bieżących ustawień w skrypcie?

Nędzna zmienna
źródło

Odpowiedzi:

22

Wiadomość zwrotna od Thomasa Dickeya (opiekuna xterm) ma to. Zwróć uwagę w szczególności na część o ?. Ps = 4Oznacza OSC Ps ; Pt STgdzie OSC( „Kontrola system operacyjny” prefiksu) jest ESC ]a ST( „sznur terminator” przyrostek) jest \(ukośnikowe). Jest 4to jedna z możliwych komend OSC.

Dla całej palety, którą można ustawić / pobrać za pomocą rozszerzenia kolorów 88/256. W ctlseqs.txt jest to podsumowane tutaj:

  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.

Nieco później w docs więcej podpoleceniami OSC, Ps = 10i Ps = 11, i inne.

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

Przykład - odpytuje to tło za pomocą Ps = "11"(od góry) i Pt = "?"podłączonego do OSC Ps ; Pt ST. W echu \033jest używany do ucieczki i \\do ostatniego odwrotnego ukośnika.

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

Wynik:

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

Ostrzeżenie: zwracany kolor nie odzwierciedla, czy -rvwłączone jest odtwarzanie wideo wstecznego, np. Przeszukiwanie ~ 260 dostępnych kolorów za pomocą OSC 4 ; c ; ? STnie pokazuje żadnego, że oba podążają za tłem ORAZ zmieniają się wraz z wideo wstecznym. Ponieważ wielu użytkowników ustawia ciemne tło za pomocą just xterm -rv, komplikuje to ustalenie, czy tło jest rzeczywiście ciemne, czy nie. Większość kolorów też się nie dostosowuje -rv.

Skrypt wykonujący pełne zapytanie i przechwytujący odpowiedź z 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
Alex North-Keys
źródło
1
Wow ... odpowiedź po dwóch latach ... dziękuję. Nie do końca zrozumiałem wyjaśnienie, ale przykład nic dla mnie nie robi ...
Nędzna Zmienna
Heh Ponownie uruchamiam go w całkiem nowym Xtermie - rzeczywistym Xtermie - tym razem ze wszystkimi moimi zasobami X pozbawionymi (co oznacza, że ​​daje wszystkie „f” dla kolorów zamiast wszystkich „0”). Korzystanie z wbudowanego echa / bin / echo lub bash działa dobrze. Przykład, który próbowałem, został skopiowany / wklejony bezpośrednio z powyższego postu. Moje środowisko to Ubuntu 11.10 (pochodna Linux / Debian). Nie mam innego przydatnego systemu operacyjnego do przetestowania.
Alex North-Keys
W zależności od konfiguracji monitu, istnieje szansa, że ​​wyląduje on na szczycie próby xterm wprowadzenia danych do terminala w odpowiedzi na zapytanie. Z perspektywy twojej powłoki odpowiedź xterm po prostu wygląda jak ty, pisząc.
Alex North-Keys
1
Hmm, terminal gnome w Ubuntu 12.04 twierdzi, że jest kompatybilny z Xterm, ale niczego nie drukuje. Dlaczego?
Nik Reiman,
1
Teraz to jest czysta voodoo terminalu. Doskonała odpowiedź.
Qix - MONICA BYŁ SZYBKO ZADANY
0

rodzaj

umieść ustawienia w pliku ~ / .Xdefaults:

xterm*foreground: blue
xterm*background: white

w swojej powłoce po prostu grep wartości:

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

w przeciwnym razie bardzo trudno jest uzyskać pewne wewnętrzne wartości xterm.

akira
źródło
Nawet nie używam X :) Używam rxvt z cygwin, który działa bez serwera X. Poza tym chciałbym mieć możliwość używania różnych kolorów na różnych hostach i do różnych zadań, co wymaga zapytania terminala o ustawienia.
Nędzna zmienna
cóż, nie określiłeś swojego systemu operacyjnego :)
akira
przepraszam za to. Nie podałem powodu, ponieważ spodziewałem się, że rozwiązanie będzie oparte na echu magicznych ciągów i odzyskaniu pewnych informacji na standardowym wyjściu.
Nędzna zmienna
cóż, to, co „echo” zwykle pozostaje w powłoce (bash, zsh), nie przechodzi ono do Xtermu (z wyjątkiem ostatniego kroku, jeśli chodzi o wyświetlanie wyniku poleceń).
akira
-1 awk jest niewłaściwym narzędziem do pracy.
g33kz0r,
-1

Właściwie myślę, że chcesz tego:

% xrdb -query

Spowoduje to wyświetlenie ustawień dla Ciebie. Zobacz też:

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

Aby zmodyfikować środowisko wykonawcze, użyj:

% echo "some*setting: somevalue" | xrdb -merge
g33kz0r
źródło
-querywyświetla wszystkie zasoby. Określenie zasobu nie działa na moim Ubuntu.
akira
echo „cokolwiek” | xrdb -merge
g33kz0r
ponownie przeczytaj pytanie: OP chce ustawić kolory BASH PROMPT zgodnie z ustawieniami xterm. OP nie chce zmieniać xresources.
akira
Zobacz jego komentarz do twojej odpowiedzi. Chce „zapytać o termincal [sic]”. Dlatego chce xrdb -query
g33kz0r
jeśli chcesz być konkretny: chce zapytać rxvt bez działającego xservera w systemie Windows (co jest możliwe) i xrdb -querypo prostu daje ci listę wszystkich zasobów .. które musisz ponownie przebudzić / grep, aby dostać się na pierwszy plan. i to już przyznałem. xrdb -mergejest całkowicie nie na temat tutaj, ponieważ OP nie chce modyfikować xresources, ale wygląd bashprompt.
akira