Színek mélykonzolban és terminálemulátorban

 ( poliverzum | 2008. március 2., vasárnap - 10:48 )

Sziasztok, az a kérdésem, hogy ha valamit ki akarok íratni (mondjuk printf-fel) a terminálra, akkor miként tudom változtatni annak a szövegnek a színét? Gondolom, kéne legyen rá valami színkódszerűség...

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

Nem mély az a kozol, egyszerűen csak konzol.

Bár lehet, hogy a jobb hűtés érdekében te a pincében tartod, akkor tényleg mély.

Amúgy a válasz: szabványos escape szekvenciákkal.

http://www.google.com/search?client=opera&rls=en&q=bash+text+colors&sourceid=opera&ie=utf-8&oe=utf-8
http://www.google.com/search?client=opera&rls=en&q=colors+on+console&sourceid=opera&ie=utf-8&oe=utf-8

ansi escape sequence-ekkel
pl.:
^[[31;1mpiros^[[0m

arra vigyazz, hogy ^[ nem ket karakter, hanem egy literalis escape
igy viszed be: ctrl-v esc

--
Unix, Perfectly "natural" after five or ten years.

Igen, hát efféle szekvenciákat sokat láttam már - a baj az, hogy nem értem, mit jelent! Az odáig világos, hogy az első karakter egy Esc - asszem 27 a kódja talán decimálisan, de ha nem az is mindegy, annak utána tudok nézni. Hanem az utána következő mindenfélét nem értem! Ugye, az én csekélyértelmű medvebocs-fejemnek az lenne a logikus, hogy az Esc azt jelentse, hogy valami speciális parancsot küldünk - utána jöjjön valami, ami azt mondja, hogy most konkrétan színkódot adok meg (és nem mondjuk kurzormozgatást vagy konzolcsengő bekapcsolást), aztán jön a szín kódja, aztán a kiiratandó szöveg, ami egészen addig megtartja ezt a színét, míg csak nem mondunk neki valami más színkódot!

No és ebből úgy látom odáig oké, hogy az Esc speciális parancsot vezet be; utána azonban egymerő káosznak tűnik számomra az egész, főleg 2 okból: mi a fene az az "m" karakter az elején?! És a végén?! Nézegettem pár gobo-szkriptet, amik színesen írnak ezt-azt, de még abból sem értem, mert mindig más kódokkal zárják le a színes szöveg sorozatát! Holott már azt sem értem, minek azt lezárni, mert ha lezárjuk, utána milyen színnel fog írni a masina, ha egyszer nem adtunk meg neki újabb színkódot?!

Szóval ez nekem momentán magas. Pedig itt kifejezetten még nem is az angol szöveg nem-magyarságával van bajom, mert aránylag könnyű, de az egésznek a logikája tök homály előttem. Tiszta röhej, hogy ennyire elhasaltam a színeken, amikor ennél sokkal nehezebb dolgokat szerintem könnyen megértettem. (nem mindent, de volt már rá példa...)

Szerintem valahogy túlbonyolították ezt a témát a tervezők. Biztos meg lehet magyarázni, de egyelőre bizánci bonyolultságú az egész miskulancia nekem.

Az már csak hab a tortán, hogy ilyen idióta jelekkel kell kínlódni. Írják ki nekem mindegyik kódot hexában, az egyértelmű! Messze sokkal könnyebben átlátom azt.

(OFF itt, de megjegyzem, egyetlen dolog van, amit utálok a C-ben, de azt vastagon ám: hogy a 0x karaktersorozattal vezeti be a hexa számokat. Megszoktam még a C-64 idejében, hogy a $ előtét a hexa számok jele. Ráadásul az egyetlen karakter, nem kettő, mint a 0x. Hogy én ezt mennyire utálom a C nyelvben!)

-------------
:::A GoboLinux felhasználók hivatalos magyar fóruma: http://linux.birodalom.net/smf
:::A #86-os sorszámú hivatalosan bejegyzett GoboLinux felhasználó

> Hanem az utána következő mindenfélét nem értem!

A jelölés alkalmazásához nem szükséges a jelölés megértése.

> odáig oké, hogy az Esc speciális parancsot vezet be; utána azonban

Esc [ paraméterek műveletkód

> hogy a 0x karaktersorozattal vezeti be a hexa számokat

Egy már meglévő jelölési mód újrahasznosítása, a legkisebb változtatás elvének megfelelően. A '0' jelöli, hogy nem 10-es számrendszerbeli literál, az x pedig azt jelöli hogy nem oktális, hanem hexa.

> Megszoktam még a C-64 idejében, hogy a $ előtét a hexa számok jele.

Akkor ez a baj. Öreg kutya nem tanul új trükköt? :-)))

A jelölés alkalmazásához igenis szükséges a megértése, mert pld így nem értem, melyik kódnak mi a hatása. Pld hogyan van lezárva a parancsstring, stb.

Nem lehetne hogy egyszerűen hexakódokkal csinálna valaki egy táblázatot a 16 színre, hogy "hé lamerkám, ilyen színnél ez a parancs eleje, aztán jön a szöveg amit ki akarsz iratni, utána meg ez"?!

Plíz hexakódokkal, oké? Hagyjuk a szegletes zárójeleket...

-------------
:::A GoboLinux felhasználók hivatalos magyar fóruma: http://linux.birodalom.net/smf
:::A #86-os sorszámú hivatalosan bejegyzett GoboLinux felhasználó

> nem értem, melyik kódnak mi a hatása. Pld hogyan van lezárva a parancsstring, stb.

Értelmezőt akarsz írni? Mert ha nem, akkor elég megnézni a kódokat valami leírásban. Pld: http://en.wikipedia.org/wiki/ANSI_escape_code

> "hé lamerkám, ilyen színnél ez a parancs eleje, aztán jön a szöveg amit ki akarsz iratni, utána meg ez"?!

Már kaptál ilyet: "elotte ^[[31;1m piros ^[[0m utana". Kipróbáltad?

> Plíz hexakódokkal, oké? Hagyjuk a szegletes zárójeleket...

Ezt mondod a HTML-re is? "Plíz hexakódokkal, oké? Hagyjuk a < > zárójeleket..."

Ezek nemcsak színezésre jók, hanem kurzorvezérlésre is. A hosszuk meg ennek következtében változó.

Miért akarod, hogy valaki ideollózza neked a hautut? Magadtól nem tudod elolvasni?

(A DOS meg úgy jön ide, hogy ansi.sys néven ugyanezeket használhattad benne.)

Akkor most megleplek. Soha életemben nem használtam ansi.sys-t. Dos alatt úgy progranyoztam, hogy 800×600 16 színű grafikus képernyőre írtam assemblerben rutincsomagot, aminek rutinjait C-ből hívogattam.

Továbbá, mit gondolsz, miért a hup-on vagyok gyakrabban és nem a Linuxfórumon? Hát hogy pld megszabaduljak tőled! Szeretném tehát, ha nem eregetnéd teli az itteni légkört is mindenféle mentális piszokkal. Nagyon szépen kérlek, tégy úgy, mintha én nem is volnék! Nem muszáj észrevenned a témáimat, oké?! Inkább lemondok a "segítségről" is, amit nyújtanál.

-------------
:::A GoboLinux felhasználók hivatalos magyar fóruma: http://linux.birodalom.net/smf
:::A #86-os sorszámú hivatalosan bejegyzett GoboLinux felhasználó

Köszönöm szívélyes köszönetedet. Kívánom a HUP-nak, hogy itt több időt tölts, mint amott.

Asszem kipróbálom a megfelelő firefox extensiont, kiszűri-e a hozzászólásaidat. Egyelőre még nem voltál nagyon troll, de ismerlek már, és emiatt nekikészülök.
-------------
:::A GoboLinux felhasználók hivatalos magyar fóruma: http://linux.birodalom.net/smf
:::A #86-os sorszámú hivatalosan bejegyzett GoboLinux felhasználó

Régi szép DOS 3.22-es idők :)

Én a DOS 6.22-t ismerem. Különben meg nem tudom, hogy jön ide...
-------------
:::A GoboLinux felhasználók hivatalos magyar fóruma: http://linux.birodalom.net/smf
:::A #86-os sorszámú hivatalosan bejegyzett GoboLinux felhasználó

Anno fél napokat töltöttünk azzal, hogy szép színes prompt-okat csináljunk :)
Ott ugyanígy escape szekvenciákkal müködik a dolog.


int main()
{
  printf("\033[31m piros \033[0m \n");
}

A \033 értelemszerűen az esc, oktális karakterkóddal.
Ezt bashben is meg tudod csinálni echo-val, pl. így:

echo $'\033[31m piros \033[0m'

ASCII escape szekvenciákról pl. itt: http://ascii-table.com/ansi-escape-sequences.php

Embertelen szerencséd van, mert megtaláltam egy kőkorszaki forrásomat, ami ilyenekkel szerencsétlenkedik...

Az esc kódja 0x1b. Ilyesmik vannak:

    printf("%cc",0x1b);//reset term
    printf("%c[2J",0x1b);//erase screen
    printf("%c[%d;%dH",0x1b,MAXROW-2,1);//cursor move (Row;Column)

Ezek gondolom elég világosak...
Nézzük ezt: ^[[31;1mpiros^[[0m
^[ : esc (0x1b)
[ : control sorozat jön
31;1 : red;bright
m : lezárás
Azaz: ^[[31;1m : ami ezután jön, az piros
Hasonlóan: ^[[0m : reset

Bővebben:
http://www.termsys.demon.co.uk/vtansi.htm

"...handing C++ to the average programmer seems roughly comparable to handing a loaded .45 to a chimpanzee."
-- Ted Ts'o

Valami már dereng, de azt nem értem, mi a fene az a ^[[0m : reset
Ugyanis egyszer már lezártuk a parancsstringet az "m" karakterrel, nem? Ezzel a parancssorral nem azt csináltuk-e, hogy az "aktuális írásszínt" beállítottuk pirosra? Tehát most már örökkön-örökké pirossal kéne írnia, amíg csak egy más színre utasító parancsstringet nem kap? Szóval, mi az a "reset" ott neki a kiirandó karakterlánc után?

-------------
:::A GoboLinux felhasználók hivatalos magyar fóruma: http://linux.birodalom.net/smf
:::A #86-os sorszámú hivatalosan bejegyzett GoboLinux felhasználó

^[[31;1m
De, lezártuk m-mel, innentől pirossal írsz.

Viszont normális ember nem ír mindent pirossal.
Sőt, ha valami más program is elkezd szemetelni a konzolra, akkor mostantól ő is pirossal fog szemetelni.

Éppen ezért, amint befejeztük a piros szöveget, rögtön takarítunk, azaz visszaállítjuk a színt a default értékre. Na ez az a bizonyos reset...

"...handing C++ to the average programmer seems roughly comparable to handing a loaded .45 to a chimpanzee."
-- Ted Ts'o

> (OFF itt, de megjegyzem, egyetlen dolog van, amit utálok a C-ben, de azt vastagon ám: hogy a 0x karaktersorozattal vezeti be a hexa számokat. Megszoktam még a C-64 idejében, hogy a $ előtét a hexa számok jele. Ráadásul az egyetlen karakter, nem kettő, mint a 0x. Hogy én ezt mennyire utálom a C nyelvben!)

Költői kérdés: melyik volt régebben, a C programozási nyelv, vagy a C-64 gép?

WTF is "mélykonzol"?

Ave, Saabi.

Itt a HUP-on vagy a Linuxfórumon olvastam valakitől, hogy "mélykonzol" és megtetszett. Definíció szerint:

mélykonzol = Nem virtuális terminál. Tehát olyan konzol/terminál, ami nem grafikus felületen működik. A kettő közt érdemes különbséget tenni, mert vanbnak dolgok, amik nem oldhatóak meg virtuális terminálban, csak mélykonzolban.
-------------
:::A GoboLinux felhasználók hivatalos magyar fóruma: http://linux.birodalom.net/smf
:::A #86-os sorszámú hivatalosan bejegyzett GoboLinux felhasználó

"Nem virtuális terminál"

A terminál egy önálló harverelem, egy gép, amit soros vonalon kötsz a gépre.
Amit ctrl-F1-gyel és társaival kapsz, azok mind virtuális terminálok, hiszen az oprendszered okozza őket.

Használd nyugodtan a konzol, terminál, terminál emulátor kifejezéseket.

Akkor jelzem feléd, hogy ez inkább hangzik hülyén mint okosan.
Amúgy, ahogy ezt itt már más is írta, ez a terminál is virtuális. A valódi terminal egy hw elem, ami az esetek elsöprő többségében soros porton csatlakozik a számítógéphez. Jellemzően nem otthoni környezetben használatos.

Ave, Saabi.

Én speciel home környezetben használok ilyet (egy meg tartalékként a szekrény tetején figyel), papírfehérnek hívták anno ezt a megjelenítést, és bár tud VT-sok emulációt is, szín az en bloc nem ér semmit :-P És hogy ontopic legyek: RTM ncurses, illetve RTM termcap.

És hol jellemezed te az otthoni felhasználót? :-D Nyilván nekem is van otthon egy HP 700/96-os, de szerintem ez kivétel.

Ave, Saabi.

Igy sokkal tudomanyosabban hangzik :) A pú szinesre festese jol.

Mivel a tema amugy is C/C++. Irtam egy kis libet, amivel lehet szinesen irkalni. Toltheto innen. Annyit kell tudni rola, hogy nem mindig valtok verzot, erdemes a ChangeLog-ot figyelgetni, es ujratolteni a csomagot.

Gentoo-bol lettek a fuggvenynevek atemelve. Jelenleg einfo, ewarn, eerror, ebegin, eend, ebeep es epause van, ezen felul esyslog. Az einfo/ewarn/eerror/ebegin/esyslog fuggvenyek printf-szeruek, a printf-ehez nagyon hasonlo szintaxissal rendelkeznek, megkonnyitve a munkat veluk.

A szinek fix kodokkal vannak csinalva, nem dinamikusan van elkerve. Linux terminal van alapul veve, nem tudom, pl. bsd-n lehet hogy nem teljesen jo.

A projekt tesztelve van, minden hibabejelentesnek orulok, a hrgyster kukac g mail pont com cimen varom ezeket.

Feltaláltad a langyos vizet, meg a termcap, terminfo, curses, ncurses dolgait...?