terminal
Tartalomjegyzék
alapok
-
Ez a leírás az xterm típusú terminálokról szól, vagyis azokról melyeknek "xterm..." a kimenete a
következő parancsra:
Ezek a terminálok alapesetben normál módban vannak, de ha azt szeretnénk, hogy általunk 100%-ban kontrollálhatóak
legyenek, akkor át kell váltanunk RAW-módba, továbbá le kell tiltani a karakter ECHO-zást,
hiszen mi szeretnénk vezérelni, hogy egy billentyű lenyomáskor mi történjen, és mi jelenjen meg a terminálon.
Így akár terminálos játék, vagy egy Norton Commander is készülhet.
Lehet, hogy a cursor megjelenését is le kell tiltani.
-
RAW-mód bekapcsolása
Ennek a módnak a bekapcsolását (és a program végén a kikapcsolását) régebben a java programban helyeztem el.
A bekapcsolás így nézett ki:
Azonban ez több problémát felvetett: bizonyos környezetben nincs "sh" parancs, és ez java exception-t okoz,
de "sh" nélkül sem működik egyes környezetekben. Van olyan terminál mely rossz karakter kódolással indul,
és még ezt is be kell állítani, ráadásul más-más paranccsal.
A megoldás az, hogy a terminál beállítása nem a java kódban történik, hanem a java programot indító scriptben így:
A példában látható, hogy a java program indítása előtt bekapcsoljuk a raw-módot, és kikapcsoljuk a karakterek
echo-zását, majd a program befejeztével kikapcsoljuk a raw-módot, és bekapcsoljuk a karakterek echo-zását.
-
Terminál Osztályzat (TO)
A terminálok minősítésére vezettem be, mely 1-től 5-ig terjedő osztályzattal leírja, mennyire használható,
átváltható-e RAW-módba, működnek-e a billentyűk, megfelelően támogatja-e az ansi escape szekvenciákat stb.
A legjobb osztályzat az 5-ös.
-
A xesj.java-17-tool project terminál támogatása
Ez a project a terminál, és keyboard kezeléséhez tartalmaz egy xesj.xterm package-et,
ezt érdemes használni.
ansi escape codes
-
Az ansi escape kódoknak a terminálra történő kiírásával vezérelhető a karakterek megjelenési helye, és kinézete.
-
Cursor eltolása
Ha a cursor egy irányba eltolva eléri a terminál ablak szélét, akkor ott marad, nem mozog tovább.
Így tehát elérhető a jobb-alsó sarok, ha a cursort a terminál méretét meghaladva eltoljuk jobbra, és lefelé.
-
Cursor pozícionálása
Ha túl nagyok az értékek akkor az utolsó sorba, és/vagy az utolsó oszlopba megy a cursor.
Valótlan érték esetén (0, negatív, nem szám) nem történik cursor mozgatás.
-
Cursor pozíciójának lekérdezése
A funkció használata előtt ürítsük ki a keyboard buffert!
Ezt a kódot kiadva, a cursor pozíciója kiolvasható a keyboard buffer-ből {esc}[{sor};{oszlop}R formában.
A bufferből való olvasáskor olyan metódust használjunk, mely vár az adat megjelenésére a buffer-ben!
Egy konkrét példa, ahogy a buffer-ből kiolvasható a bájt-sorozat:
A példában a cursor a 31. sorban, és az 52. oszlopban áll, a bal felső sarok pedig mindig az 1;1 koordináta.
Ezt a funkciót lehet felhasználni arra, hogy a terminál ablak méretét meghatározzuk.
Előtte léptessük a cursort a jobb-alsó sarokba, majd kérdezzük le a pozícióját.
-
Terminál ablak teljes tartalmának, vagy egy részének törlése
Ezeknél a műveleteknél a cursor pozíciója nem változik, és a cursor pozíciójában is megtörténik a törlés.
-
Reset
Betűszín, betű háttérszín, betű dekorációs beállítások törlése, visszaállás a terminál ablak alap beállítására.
A cursor pozíciójára nincs hatással.
-
Betűszín
A 8 alap betűszín, és világos változata:
Megadható a 256 színű paletta egy színe is, egy 0 - 255 közötti színkóddal:
Megadható a 16 millió színű paletta egy színe is, RGB színkódolással:
A szín beállítás, az utána következő karakterek kiírásakor lesz látható.
A szín beállítás addig marad érvényben amíg át nem állítjuk, vagy nem hajtunk végre reset-et.
-
Betű háttérszín
A 8 alap betű háttérszín, és világos változata:
Megadható a 256 háttérszínű paletta egy színe is, egy 0 - 255 közötti színkóddal:
Megadható a 16 millió háttérszínű paletta egy színe is, RGB színkódolással:
-
Betű dekoráció
Elképzelhető, hogy ezek a dekorációk nem mind látszanak,
lehet hogy a terminál fontkészlete nem támogatja a bold, italic, underline megjelenést.
-
Scroll
A scrollozás hatására az egyik oldalon kicsúszó sorok elvesznek, egy ellentétes irányú scroll sem hozza őket vissza.
A másik oldalon új üres sorok jelennek meg.
A cursor pozíciója változatlan marad.
-
Cursor elrejtése, megjelenítése
dokumentáció
keyboard
-
Amíg fut a program, folyamatosan gépelhetünk.
A lenyomott billentyűk kódjai (bájt sorozata) sorban egymás után kerül be a keyboard buffer-be.
A program ebből tud olvasni tetszőleges időpontban például a következő metódussal:
Vigyázat! Ez a read() metódus vár (vagyis blokkol) ha a buffer üres.
Ha nem célunk a várakozás, akkor előtte meg lehet vizsgálni van-e adat a buffer-ben:
Ez a metódus viszont nem várakozik, rögtön visszaadja a buffer-ben lévő bájtok számát.
A read() metódussal kiolvasott karakterek törlődnek a bufferből.
Egy funkció billentyű akár 5-6 bájt-ot is betesz a buffer-be.
A Shift, Alt, Ctrl, NumLock, CapsLock, ScrollLock billentyű lenyomások nem írnak a bufferbe.
-
Különböző terminálok a billentyűk lenyomásakor más-más billentyű kódot állíthatnak elő a keyboard bufferben,
ezért érdemes egy billentyű ➔ kód megfeleltetést csinálni, és ezt használni.
A megfeleltetést én egy keyboard.json fájlban tárolom. A legtöbb billentyű kódja egyezik, de pl. a Backspace,
vagy az Fn billentyűk más kódot adhatnak, illetve egyes billentyűk kódja 5 bájt-ból,
más terminálon pedig 6 bájt-ból is állhat. Egyes terminálokon ráadásul ugyanazt a kódot kapjuk,
ha egy funkció billentyűt (pl. nyilak) önmagában, vagy a Shift-tel együtt nyomjuk le.
macos iterm2
- TO: 5
-
Java alkalmazás futtatás módja:
macos terminal
- TO: 3
-
Java alkalmazás futtatás módja:
-
Néhány billentyűt lenyomva scroll történik, ami visszahozza az előző (nem kívánt) terminál ablak tartalmakat.
Ezt úgy lehet kiküszöbolni, hogy a macOS terminal programban letiltjuk az ablak tartalom előzményeit:
-
Cursor pozíciójának mentése és visszaállítása nem működik.
-
Az RGB-vel megadott színek, és háttérszínek nem működnek.
-
Néhány betű dekoráció nem működik.
print
-
A terminálra kiírni a következő parancsokkal lehet:
Mindegyik előre lépteti a cursort (és lefelé ha szüksége + scroll ha szükséges), tehát egyformán működnek,
de a print() a kényelmesebb, mert azzal karaktereket lehet kiiratni, bájt-ok helyett.
-
Ha a cursor a terminál ablak jobb szélén van, és oda egyetlen karaktert kiírunk,
akkor szerencsére még nem megy át a cursor a következő sorba (és nem scrollozza fel az egész ablak tartalmát sem),
csak akkor ha kiírnánk mégegy karaktert. Tehát a cursor pont azon a karakteren marad amit kiírtunk.
-
Ha a cursor nem a terminál ablak jobb szélén van, tehát van tőle jobbra még hely, akkor egy karakter kiírásakor
a megjelenő karaktertől a cursor azonnal elmozdul egyet jobbra.
-
Kiírási sebesség egy átlagos gépen:
2500 karakter kiírás a terminál ablakba úgy, hogy minden karakter előtt cursor pozicionálás van,
majd egy karaktert kiírunk, az 40 - 50 ms alatt megtörténik, vagyis nagyon gyors a művelet.
-
Keret rajzolás:
Sajnos nem találtam hozzá unicode karaktereket.
Helyette azt lehet csinálni, hogy betű háttérszínt állítunk, space karakterekkel telerakjuk a terminál szélét,
vagyis felülre, alulra, balra, jobbra, így a héttérszín miatt látszik keretként.
windows cmd
- TO: 1
-
Az stty parancsot nem ismeri, így RAW-módba sem tud váltani.
windows cygwin
- TO: 1
-
A legfontosabb billentyűk nem működnek: Esc, nyilak, Fn.
Tehát ezek lenyomásakor nem kerül adat a billentyűzet buffer-be.
-
Ugyanilyen cygwin alapú a Netbeans "terminal" ablaka.
windows git-bash
- TO: 5
-
A java alkalmazás futtatásakor be kell állítani UTF-8 -ra (windows-on 65001) a karakter kódolást, hogy az ékezetes
karakterek jól jelenjenek meg.
A windows-os meghajtók /c és /d alatt látszódnak:
windows moba-xterm
- TO: 5
-
Java alkalmazás futtatás módja, ha távoli szerverre jelentkezünk fel:
-
A Start local terminal gombbal lokális terminált indíthatunk.
A windows-os meghajtók /drives/c és /drives/d alatt látszódnak.
De a java alkalmazás, és paraméterei esetén már használhatjuk
a c: vagy d: meghajtót, tehát furcsa módon így kell futtatni a java alkalmazást:
windows powershell
- TO: 1
-
Az stty parancsot nem ismeri, így RAW-módba sem tud váltani.