Diky Jendove komentari pod jak-automaticky-vkladat-text-i-kdyz-se-nekdo-snazil-aby-to-neslo jsem objevil xdotool. Precetl jsem si manualovou stranku a dostal par napadu. A o tech, ktere se mi zatim osvedcily bude tento clanek.
UNIXova graficka nadstavba X-window ma sice nekolik schranek (clipboardu), ale pokud je chcete normalne pouzivat – treba oznacit levym tlacitkem text v browseru a vlozit ho prostrednim tlacitkem do textoveho editoru otevreneho v terminalu, nebo naopak – je nutne system nakonfigurovat tak, aby se choval, jakoby mel schranku jednu. Jenomze obcas by se hodilo vice schranek u kterych si clovek muze sam vybrat, do ktere co ulozi. Staci se snazit nekomu poslat mail, ve kterem je cast textu z jineho mailu. Ctu zdrojovy mail, oznacim text, zavru zdrojovy mail, otevru novy mail, chce to po me adresu, zjistim adresu, chci ji oznacit a tim prichazim o puvodni text. Ne, ze by to byla neresitelna situace, ale zbytecny opruz to je.
Nekdo mozna namitne, ze mam mit adresar s maily primo v klientovi … ale tak muj mozek nefunguje. Ne, opravdu nevim, jestli jsem si toho cloveka ulozil pod jmenem, prijmenim, nebo prezdivkou. Pripadne pod kterou prezdivkou. A pokud je to firma, tak si dost mozna pamatuju jenom jednu vec, kterou jsem tam kupoval a nic jineho. Takze by ten mailovy klient musel umet prohledavat bloky textovych dat podle (nekdy i vice) klicovych slov a ve vybranem textu pak hledat mailove adresy. Ne, ze by to principialne neslo, ale nic takoveho jsem nikde nevidel, takze mam svuj program na adresar. Adresu oznacim levym tlacitkam, prejedu do terminalu (nebo jen prehodim screen) s mailovym klientem a vkladam prostrednim tlacitkem.
Obcas se take stava, ze clovek potrebuje posbirat data z vice mist a vlozit je do jednoho. Treba prijde URL rozlamana na vice radek od nekoho, kdo ma mail na seznamu. Nebo je potreba vykopirovat z nejakeho clanku na webu jenom to dulezite a ne kecy okolo.
Cim to ovladat?
Zadani je jasne a ted nastava otazka cim to ovladat. Samozrejme by slo pouzit zvlastni klavesove zkratky, ale pak je problem pri vkladani textu, protoze text prichazi jako z klavesnice, takze je nutne pockat, nez uzivatel pusti vsechny modifikatory (Control, Alt, Shift, Tucnak …), jinak se mohou stat nejruznejsi veci. Samozrejme by slo poslat text z vedlejsiho pocitace pres inputattach (klavesnicova makra poprve), ale jak ho pohodlne dostat tam? Taky by slo poslat nejake nevyuzivane scankody, ale na bezne klavesnici se par nevyuzivanych klaves najde.
Kdysi jsem psaval cisla zasadne na numericke klavesnici. Jenomze pak prisly vykonne notebooky, vice cestovani a numericka klavesnice najednou nebyla k dispozici, takze nezbylo, nez se naucit psat cisla na hornim radku klavesnice. Po par letech uz mi to ani neprislo a od te doby je numericky blok me klavesnice zcela nevyuzit. Precijen je zbytecne daleko na to, aby tam clovek presouval ruku, kdyz chce napsat cislo a zdrzuje to. Jeste se da pouzit Ctrl a numericky +/- na zmenu velikosti textu v browseru, ale to uz funguje i s normalnim + a -, jak se mi povedlo zjistit po ziskani noveho notebooka, ktery uz numericky blok ani neemuluje pres Fn. Tim ziskavame klavesy 0-9 na 10 schranek a nekolik dalsich okolo.
Jak to ovladat?
Zkusime tedy vymyslet intuitivni ovladani.
Do schranky je potreba ulozit a pak z ni cist. Prepinani modu je pakarna, protoze si clovek musi pamatovat v jakem je modu (a samozrejem VIM ktery textovy editor je nejlepsi, ale i tak je lepsi se tomu vyhnout, kdyz to jde). Slo by rozdelit klavesy na 0-4 a 5-9, ale to by bylo intuitivni jak brainfuck. Takze zbyvaji tri rozumne varianty: vkladat bez modifikatoru a cist s modifikatorem, nebo opacne, pripade delat vse bez modifikatoru a hadat, co chce uzivatel udelat. Systemy, ktere hadaji, co chce uzivatel udelat vetsinou funguji blbe a clovek se kvuli nim nauci sprosta slova v mnoha cizich jazycich. Dalo by se predpokladat, ze s prazdnou mysi schrankou se ma extra schranka vypsat a s plnou se ma text prekopirovat z mysi do extra schranky. Ale na rovinu – mazete po pouziti obsah schranky? Asi ne, to by byl opruz navic. Delat si zivot tezsi neplanuju, takze posladni moznost pada.
Vypisovat obsah schranky modifikatorem znamena, ze modifikator modifikuje zacatek vypisu. To je sice jakesi technicke omezeni, ktere by mozna slo obejit lepe, nez rychlym uvolnenim modifikatoru v kombinaci s vlozenim cekani pred zacatek vypisu, ale neni to jedina nevyhoda. Druha nevyhoda je vkladani bez modifikatoru. Je sice rychle, ale obcas clovek hrabne po prave sipce, nebo PgUp/PgDn a strefi se i na numerickou klavesnici a prepise si schranku, aniz by si to uvedomil. Na to jsem prisel tim tezsim zpusobem (nejdriv mi to pripadalo intuitivnejsi).
Tim zbyva jedina varianta: prepis schranky mysi do extra schranky: modifikator + cislo na numericke klavesnici (pouzivam Shift), vypsani extra schranky: cislo na numericke klavesnici.
Tim se resi i sber dat po dokumentu, ale kdo si ma pamatovat kterou schranku pouzil naposledy. Takze by se hodila jeste funkce na pridani do schranky. Rozhodl jsem se to nekomplitovat a vytvorit jedenactou extra schranku, do ktere pujde pridavat z mysi schranky. Klavesa tecka na numericke klavesnici ji smaze (krome tecky to je i Delete, ale asi jste ji tak v tomto tisicileti nepouzili), klavesa plus prida (to je docela intuitivni) a klavesa lomitko vypise obsah (protoze minus a hvezdicku uz mam zabranou). Jeste me napadlo, ze by plus se shiftem a altem mohl pridat mezeru, nebo konec radku a teprve pak dalsi data, ale ukazalo se, ze to prilis nepouzivam.
Kdo sezral minus a hvezdicku? Numerickym minusem vkladam obsah schranky, kdyz nechci sahat az na mys a hvezdickou vkladam totez, jen s odstranenou diakritikou (to se obcas hodi). Vyhoda je ta, ze se do grafickych programu text vlozi tam, kde je prave textovy kurzor (stejne, jako do terminalovych pri beznem vkladani prostrednim tlacitkem) a neni treba peclive pozicovat mysi kurzor tam, kde uz je textovy kurzor.
Implementoval jsem toho vice, ale toto jsou veci, ktere od okamziku implementace pouzivam temer denne a prijdou mi kulervouci.
Implementace
Je potreba rozlisit, jestli cisla a dalsi znaky prichazi z alfanumericke casti klavesnice, nebo z numerickeho bloku. To lze vyresit tak, ze vytvorime zkratku na scankod klavesnice a ne na prichazejici znak. Scankody zmacknutych klaves (a dalsich eventu) ukaze program xev.
Navod je specificky pro windowmanager Fluxbox, ktery pouzivam. Pokud pouzivate jiny, ceka vas googleni a cteni manualovych stranek, protoze vlastni klavesove zkratky jsem v zadnem jinem windowmanageru asi nikdy nekonfiguroval (mozna v minulem tisicileti ve fvwm2 a WindowMakeru, ale v takovem pripade uz jsem zapomnel jak). Ve Fluxboxku to je zcela jednoduche. Staci otevrit soubor ~/.fluxbox/keys a pridat par radek:
#Numericke 0-9
Shift 79 :Exec /home/username/bin/xtraclip_mem 79
Shift 80 :Exec /home/username/bin/xtraclip_mem 80
Shift 81 :Exec /home/username/bin/xtraclip_mem 81
Shift 83 :Exec /home/username/bin/xtraclip_mem 83
Shift 84 :Exec /home/username/bin/xtraclip_mem 84
Shift 85 :Exec /home/username/bin/xtraclip_mem 85
Shift 87 :Exec /home/username/bin/xtraclip_mem 87
Shift 88 :Exec /home/username/bin/xtraclip_mem 88
Shift 89 :Exec /home/username/bin/xtraclip_mem 89
Shift 90 :Exec /home/username/bin/xtraclip_mem 90
79 :Exec /home/username/bin/xtraclip_mem_out 79
80 :Exec /home/username/bin/xtraclip_mem_out 80
81 :Exec /home/username/bin/xtraclip_mem_out 81
83 :Exec /home/username/bin/xtraclip_mem_out 83
84 :Exec /home/username/bin/xtraclip_mem_out 84
85 :Exec /home/username/bin/xtraclip_mem_out 85
87 :Exec /home/username/bin/xtraclip_mem_out 87
88 :Exec /home/username/bin/xtraclip_mem_out 88
89 :Exec /home/username/bin/xtraclip_mem_out 89
90 :Exec /home/username/bin/xtraclip_mem_out 90
#Numericky -
82 :Exec /home/username/bin/mouse_copy
#Numericka *
63 :Exec /home/username/bin/mouse_copy_uncs
#Numericky +
86 :Exec /home/username/bin/xtraclip_add
#Numericka .
91 :Exec /home/username/bin/xtraclip_del
#Numericke /
106 :Exec /home/username/bin/xtraclip_out
Misto username si samozrejme dejte svuj username. Asi se to vyrovna i jen se jmenem programu, pokud mate svuj “$HOME”/bin v ceste, ale proc to delat zavisle na promennych prostredi.
xtraclip_mem:
xclip -out > ~/extra_clipboard/"$1"
xtraclip_mem_out:
xdotool type -- "`cat ~/extra_clipboard/"$1"`"
mouse_copy:
xdotool type -- "`xclip -out`"
mouse_copy_uncs:
xdotool type -- "`xclip -out | cstocs utf8 ascii`"
xtraclip_del:
echo -n '' > ~/extra_clipboard/x
xtraclip_add:
xclip -out >> ~/extra_clipboard/x
xtraclip_out:
xdotool type -- "`cat ~/extra_clipboard/x`"
Jeste vytvorit adresar, kde budou v souborech ulozene nove clipboardy (ktere timpadem preziji i restart pocitace):
mkdir ~/extra_clipboard/
Pokud neco z toho nefunguje, jak ma, vlozte do skriptu pred xdotool sleep.
sleep 0.1
Pak uz staci v menu ve Fluxboxu dat reload config (nebo restartovat Fluxbox, nebo Xserver) a muzete se tesit z novych klavesovych zkratek. Nakonec – jak si myslite, ze se do tohoto clanku dostaly obsahy tech vsech souboru. Skutecne jsem nepreklikaval osmkrat sem a tam. Deset schranek je navykovejsich, nez opiaty.
EDIT: Zda se, ze jsem se unahlil s optimalizaci. Behem ladeni jsem na zacatku kazdeho z vyse uvedenych skriptu pouzival
sleep 0.5
a postupne jsem ho snizil az na 0.1 sekundy. Pak jsem presel na klavesove zkratky, ktere pri vypisovani nepouzivaji zadny modifikator, takze se sleep zdal byt zbytecnym a pri psani tohoto clanku byl vynechan. Samozrejme bez otestovani, protoze jsem si byl jist, ze tam uz je k nicemu.
Ukazuje se, ze tam k nicemu neni. V pripade, ze tam sleep neni, nevypise se prvni znak, protoze zjevne prijde drive, nez Key Release od klavesy, ktera akci spustila.
Komentare