On 04/24/10 21:00, Zbyněk Burget:
Ja s oblibou pouzivam k tomuto ucelu ASCII znak "RS".

Jo, to je dobry napad - obcas se kouknout do ASCII tabulky a zjistit, ze
tam jsou znaky, ktere se i daji pouzit.

Je to jeste horsi - oni nejen, ze se daji pouzit - ony byly za timto ucelem do ASCII tabulky vlozeny ;-)

neprisel jsem na to, jak tam muzu tenhle znak vrznout

Nerad rozdavam ryby - daleko vic me bavi naucit rybarit. Ale tady to bude tezky - na to, abysis na polozenou otazku mohl odpovedet sam je treba mit docela dost velkou sadu informaci.

Ja to vezmu hodne strucne - a to znamena, ze nebudu zminovat, ze ledacos co reknu je nebo muze byt za urcitych okolnosti vice ci mene jinak.

Zaprve zde mas ovladac klavesnice - ten zjistuje, co's fyzicky zmacknul (a na jake skutecne klavesnici - ta PCckova neni zdaleka jedina). Smerem nahoru pak predava uz vice-mene standardni kody. Jaky kod predavany nahoru odpovida jakemu kodu predavanemu nahoru je zalezitost typu klavesnice a ovladace.

Aby se mi z toho nestala scripta, omezme se pouze na PC-AT klavesnici a ji prislusny ovladac. A dale - tech "rozhrani nahoru" je vic nez jedno a je na konkrenti aplikaci, aby se rozhodla, jake bude pouzivat. My se budeme bavit pouze o "ASCII" rozhrani.

Z PC-AT klavesnice lze pres ASCII rozhrani zaslat vsechny znaky ASCII v rozsahu 0-127. Pro vyslani nekterych je na klavesnici samostatna klavesa (treba 1 pro ASCII 0x31), pro jine je treba pouzit kombinaci (treba SHIFT spolecne s A pro ASCII 0x41). Konkretne znaky s ASCII se "vyrabeji" kombinaci CTRL a pismena, jehoz ASCII kod je o 0x40 vetsi nez kod, ktery chces vygenerovat.

Nektere kody lze dokonce vygenerovat vice zpusobu - tak napriklad TAB (ASCII 9) lze vygenerovat jednak stiskem k tomu vyrobene klavesy, druhak ale jako CTRL+I. Nebo LF (ASCII 0x0a) lze krome (hned dvou) klaves "Enter" vyrobis i pomoci CTRL-J

Konkretne RS ma kod pak vyrobis pomoci CTRL-^

Jenze - tim potize zdaleka nekonci. Kdyz se ptas "jak tam ty znaky vrznout" - tak to se bavis o nejake konkretni aplikaci (patrne nejakem editoru nebo prikazove radce nejakeho konkretniho shellu). Uz nahore jsem zminilo, ze je na aplikaci, zda bude pouzivat ciste ASCII rozhrani, nebo se bdue o to "co by to stisknuto" zajimat detailneji pres nejake jine rozhrani.

Takze odpoved an tvoji otazku je "aplikacne specificka".

Ale tady tady problem nekonci. Omezime se pouze na aplikace, ktere pouzivaji ciste ASCII rozhrani - ty tedy dostanou konkretni ASCII kod.

Jenze - ASCII kody <32 jsou tradicne chapany jako "pokyn k nejake akci" - nikoliv jako "proste znaky k vlozeni". Kdyz prijde kod 65, napise se pismeno. Kdyz prijde kod 8 (BS) tak ten se nevlozi - BS je pokyn ke smazani jednoho predchoziho znaku. Kod 9 (TAB) je pokyn nabidnout "command completion".

Takze i kdyz stiskem CTRL-^ aplikaci odesles znak RS, v textu se stejne neobjevi - misto toho, se provede akce tomuto kodu odpovidajici. Vetsinou zadna.

Takze bud musis nejprve aplikaci rict "nasledujici znak neni pokyn - proste ho vloz", nebo musi mit aplikace uplne odlisny mechanismus na vkladani takovych znaku.

Sh a bash voli prvni pristup - a zpusob jak mu rict "pristi znak neni prikaz" je zaslani kodu SYN. Takze kdyz prijde samotne RS nestane se nic, pokud prijde SYN RS tak se RS vlozi na radku.

Takze odpoved na tvoji otazku pro sh a bash zni - CTRL-V CTRL-^

Editor "joe" pouziva jako escape sekvenci dvojznak ESC ' a po nem bud' nasleduje primo znak, ktery chces vlozit, nebo ho lze zapsat i ascii kodem.

Ve 'vi' lze v insert rezimu kody vkladat primo ("escape" tam dela prave prechod to editacniho modu). Jak napsat kody v prikazovem rezimu vi nevim.

Vidis jak dlouhou odpoved jsi vyprovokoval ? A to jeste neni jasne, jestli je v ni odpvoed na polozenou otazku. A i ty odpovedi, ktere tu jsou jsou VELMI hrube zjednodusene ...

ho vlastne najit...). Mimochodem - kdyz se tam bude nejakou oklikou cpat
RS, nepujde tam stejnou cestou cpat i LF?

Samozrejme, ze pujde. V shellu sekvenci SYN LF. Na rozdil od prosteho LF< ktere by bylo piokynem (zinterpretuj a proved) toto skutecne na radek vlozi znak LF aniz by se tim editace radku uzavrela.

Ale k cemu ti to bude ? Manual od 'sed' jasne rika, ze pred LF musi byt backslash. No dobre - to jeste neni problem, tak ho tam dame:

\ SYN LF

Tedy \ CTRL-V CTRL-J

Jenze ceho jsi dosahl ? Radek vypada uplne stejne. Ono je opravdu jedno, jestli kod LF vygenerujes metodou A nebo metodou B. A sedu je pro zmenu jedno, ze bash pred vlozenim mohl vyzadovat nejakou vlastni sekvenci - on ma predepsany svuj backslash a hotovo ...

opravdu to nejde obejt nejakym znakem abych ten prikaz dostal na jednu radku?

Psychicky blok by bylo to posledni, co by mi vadilo - jde mi o to, abych
ten prikaz mohl zapsat do devd.conf - a tam mi to proste zalomenoy radek
nebere, at se snazim, jak umim. Chci se vyhnout tomu, abych ten skript
musel mit ulozeny nekde bokem a z devd ho volat...

Aha. Abych pravdu rekl, parserem konfiguraku pro devd je yacc a token.l, coz je cast popisu gramatiky, jasne ukazuje, ze se parser problematice zalomenych radku venuje - ale abych zjistil jak presne, na to bych musel yacc nastudovat daleko vic.

V teto chvili s emi zda, ze sekvenci \ LF pochopil yacc jako "svoji" a radku "odzalomi". Coz samozrejme prikaz pro sed poskodi. Jestli to tam lze nacpat tak nejak aby to neposkodil - na to bych opravdu musel ten yacc nastudovat lepe ...


                                                Dan



--
FreeBSD mailing list ([email protected])
http://www.freebsd.cz/listserv/listinfo/users-l

Odpovedet emailem