Wiem, że jeśli dostępny jest kolorowy terminal, to można go pokolorować za pomocą znaków zmiany znaczenia .
Ale czy istnieje możliwość ustalenia, który kolor jest obecnie wyświetlany? Lub lepiej, jaki byłby kolor tekstu, gdybym go teraz wydrukował?
Proszę nie zmieniać poprzednich ustawień kolorów podczas używania tych znaków zmiany znaczenia. Znak zmiany domyślnego koloru pierwszego planu pobiera informacje ze schematu kolorów, a nie kolor tekstu, zanim go zmieniłem.
colors
console
escape-characters
Minix
źródło
źródło
echotc Co
lubechoti colors
, ale po prostu nie ma zmiennej, która przechowuje aktualną definicję kodu koloru.Odpowiedzi:
Ogólnie rzecz biorąc, uzyskanie obecnych kolorów jest niemożliwe. Przetwarzanie sekwencji kontrolnej terminala odbywa się „wewnątrz” terminala, gdziekolwiek to się dzieje. W przypadku emulatora terminala, takiego jak
xterm
wbudowany w jądro systemu operacyjnego, które zapewnia wirtualne terminale jądra, wewnętrzny stan emulatora, w tym jego pojęcie bieżącego „renderowania graficznego” (tj. Koloru i atrybutów), znajduje się na komputerze i jest teoretycznie dostępny. Ale dla prawdziwego terminala informacja ta znajduje się w pewnej lokalizacji RAM na fizycznie oddzielnej maszynie połączonej przez łącze szeregowe.To powiedziawszy, niektóre terminale zawierają mechanizm odczytu takich informacji jako część ich protokołu terminala, który jest wysyłany przez to łącze szeregowe. Zapewniają sekwencje kontrolne, które program może wysłać do terminala, co powoduje, że wysyła on informacje o swoim stanie wewnętrznym jako dane wejściowe terminala.
mikeserv
pokazał sekwencje kontrolne, na którexterm
odpowiada emulator terminala. Ale są one specyficzne dlaxterm
. Wbudowane emulatory terminali w jądrze Linuksa i różne jądra BSD są na przykład różnymi typami terminali i nie implementują żadnych takich sekwencji kontrolnych. To samo dotyczy całych rodzin prawdziwych terminali.Terminale DEC VT525 implementują mechanizm odczytu, ale mają zestaw sekwencji kontrolnych, które nie mają związku z tymi, które są używane przez
xterm
. Jeden wysyła sekwencję DECRQSS (Żądanie wyboru lub ustawienia), aby zażądać bieżącej interpretacji grafiki, a terminal odpowiada, wysyłając DECRPSS (Wybór lub ustawienie raportu). Konkretnie:$
q
m
ST (DECRQSS z częścią funkcji kontrolnej SGR jako ustawienie)0
$
r
0
;
3
3
;
4
4
m
ST (DECRPSS z parametrami i częścią funkcji kontrolnej sekwencji kontrolnej SGR, która ustawia bieżące kolory pierwszego planu i tła)Oczywiście uważne przeczytanie twojego pytania pokazuje, że znów wymachujesz bananem w czekoladzie w tych europejskich systemach walutowych. To, co tak naprawdę próbujesz zrobić, dla którego wybrałeś rozwiązanie, a następnie zapytałeś, jak wykonać część tego rozwiązania, to zachowanie poprzedniego stanu podczas pisania kolorowych wyników. Do tego celu służy nie tylko sekwencja kontrolna DEC VT, ale także sekwencja terminali konsoli SCO, rozpoznawana przez
xterm
różne emulatory terminali wbudowane w jądro, oraz wpis termcap / terminfo, który mówi ci, jakie są dla twojego terminala.Wpisy termcap to
sc
irc
. Wpisy terminfo tosave_cursor
irestore_cursor
. Nazwy są nieco mylące ze względu na działanie (chociaż działają jako ostrzeżenie, że polegasz na czymś, co jest de facto, a nie de jure ). Rzeczywiste sekwencje sterujące DECSC, DECRC, SCOSC i SCORC również zapisują i przywracają bieżące odwzorowanie grafiki.Biorąc pod uwagę, że wskazany artykuł dotyczy generowania sekwencji sterujących ze skryptów powłoki, polecenie, którego teraz szukasz, to
tput
.Dalsza lektura
źródło
sc
arc
, możesz też zajrzeć do bufora alternatywnego jeśli wsporniki końcowe niego. I tak, to świetna odpowiedź. Minix, może też spójrz na to: jak używać / dev / fb0 jako konsoli z przestrzeni użytkownika .nosh
Apartament zaleca on nie jest jego własnym.DECRQSS
(około 7 lat opóźnienia ...).W jednym
xterm
można uzyskać bieżące kody kolorów RGB zgłaszane przez zmianę zmiany zmiany koloru na zapytanie. UżyjESC ] Ps m
- ale dodaj?
znak zapytania. Z dokumentów :"?"
podano a, a nie nazwę lub specyfikację RGB,xterm
odpowiada sekwencją kontrolną o tej samej formie, której można użyć do ustawienia odpowiedniego koloru dynamicznego. Ponieważ w jednej sekwencji kontrolnejxterm
można podać więcej niż jedną parę numeru koloru i specyfikacji, można uzyskać więcej niż jedną odpowiedź.Mam poważne wątpliwości, czy może to działać w innym emulatorze terminali, ale w
xterm
przypadku uruchomienia ......
xterm
wypchnie z powrotem do bufora wejściowego terminala sekwencję podobną do następującej ...... w tle lub na pierwszym planie:
źródło
printf '\033]10;rgb:8f8f/8f8f/8f8f8f\007
, cały tekst w terminalu, który wcześniej był „normalny”, zmienił kolor na jasnoniebieski. Następnie uruchomienieprintf '\033]10;rgb:bfbfbf/bfbfbf/bfbfbf\007'
zmienia jasnoniebieski tekst z powrotem na „normalny”. Jak użyć tej wartości, aby zmienić tylko kolor tekstu przesuwającego się do przodu?clear
pierwszy?printf '\033]10;?\007'
pyta xterm o bieżący kolor pierwszego planu terminala. Jeśli twój terminal został uruchomiony z „normalnym” (np. 7 jako kolor pierwszego planu), ale uruchamiasztput setaf 3
przed uruchomieniemprintf
polecenia,printf
powyższe polecenie nadal zwraca „normalny” - i to prawda, ponieważ to jest obecny kolor pierwszego planu twojego terminala. To, na co liczyłem, to sposób na odzyskanie bieżącego koloru bieżącej pozycji kursora, abym mógł go zapisać, aby później „przywrócić” - zgodnie z OP.xterm
opiekunem i jest tutaj aktywnym członkiem. (link znajduje się na jego stronie internetowej -xterm
dokumenty ucieczki są obszerne - i zasadniczo standardowe odniesienia dla każdego innego programisty, który chce napisać terminal)