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.
Jak to mám se schránkou já: mám správce schránky ClipIt (existuje jich víc celkem ekvivalentních), na klávesovou zkratku mám nabindováno menu s posledními 30 obsahy schránky. Při tom úkolu zmíněném v úvodu tak stačí zmáčknout a buď šipkama nebo myší si vybrat.
Dále mám skript, který kontroluje obsah schránky, a pokud se 2 minuty nezměnil, tak ho smaže. To velmi pomáhá proti pastnutí něčeho soukromého, co tam zbylo kdo ví od kdy, omylem do webu/chatu/jiného terminálu.
Dále mám na klávesové zkratky několik skriptů, které udělají s obsahem schránky nějaké operace – například escape HTML tagů. Samotný ClipIt pak umí převést obsah schránky do plaintextu (hodí se například při kopírování z webu do „rich“ textového editoru, když člověk nechce, aby se přenesl i styl písma). Někteří správci schránek pak umí také nastavit regexpy a když se do schránky vloží obsah odpovídající danému regexpu, spustí příkaz, který si nastavíš. Tuto funkci jsem zatím k ničemu nevyužil, ale jistě se může někomu hodit.
Čísla na notebooku nepíšu na horním řádku, lineární uspořádání čísel mi přijde nevhodné (a navíc na shift+horní řada mám velká písmena s diakritikou). Čísla na notebooku píšu pomocí modifikátor+m (nula), j (1), k,l,u,i,o,ý,á,í (pattern připomíná vlastně to, co je na „velké“ klávesnici na numpadu).
Ahoj Jendo,
diky za tip na zajimavou aplikaci. Samozrejme mi to nedalo a vyzkousel jsem ji.
Moje flow, kdyz potrebuju drzet ve schrance dve veci je nasledujici: oznacit 1., zmacknout Shift-1, oznacit 2., zmacknout Shift-2, skocit do mailoveho klienta, zmacknout 2, skocit do mailu, zmacknout 1. Takze na dve kopirovani potrebuju 6 akci (v zasade 5, protoze 2. bych nemusel ukladat a mohl bych to pouzit rovnou ze schranky, ale me uz se pak nechce prehmatavat na mys a mackat prostredni tlacitko). Oproti primemu kopirovani dvou veci postupne (kdyby mel clovek ve druhem terminalu nahodou otevrene vse, co potrebuje) tam je tedy ztrata 1 az 2 akce.
Nejlepsi flow s Clipitem, na ktere jsem zatim prisel je: oznacit 1., oznacit 2. skocit do mailoveho klienta, vlozit 2., Ctrl-Alt-H, najet tam mysi a kliknout na 1., vlozit 1 – to je prekvapive take 6 akci, ale prijde mi to jako vice prace (vice prehmatavani mezi mysli a klavesnici, nutnost vybrat mysi, co se bude vkladat). Zmacknout 1 na numericke klavesnici je mnohem jednodussi, nez Ctrl-Alt-H + vyber mysi toho, co se bude vkladat + vlozeni mysi. Zvlast pokud se nejaka vec vklada vicekrat (ale ne tolikrat, aby se vyplatilo na to psat skript). Druha pravda je, ze kdybych znal ClipIt pred par mesici, tak bych ten svuj skript pravdepodobne nikdy nenapsal.
Jeste jedno upozorneni – normalne ten ClipIt nekopiruje a musi se vlizet do nastaveni a zaskrtnout mu vsechny 4 moznosti okolo schranek (jenom povolit selection nestaci).
Ty klavesove zkratky na upravu schranky, ktere zminujes, mas pres Actions v clipitu?
Ty cisla pises na opravdove numericke klavesnici (z pohledu jadra) a mas notebooka, nebo podobne organizovanou klavesnici, kde je numericka klavesnice simulovana pres Fn+klavesa? Nebo mas takovou keymapu v Xkach?
Ja pisu cisla skoro porad, takze muset k tomu drzet modifikator by mi dost vadilo. Naopak s diakritikou nepisu vubec (az tak, ze kdyz jsem musel neco takoveho napsat, tak jsem si napsal skript, ktery mi umoznil doplnit diakritiku dodatecne, protoze ji v cca 70% pripadu zapomenu. Zkousel jsem i UCW klavesnici (ktera pomohla v tom, ze jsem vedel, co zmacknout a nemusel jsem to hledat), ale musel bych se na pouzivani diakritiky dlouho preucovat.
Jsem zvykly na US/English keymapu, akorat uz jsem postupne zneuzil F1-F12 k ovladani screenu (F1 jako command key a F2+cislo pro pristup k 11.-20. screenu, F3, F4 a tak dale k dalsim) a prakticky celou numerickou klavesnici k praci se schrankami. Obcas me napadne, ze by bylo prakticke umet napsat nejaky neobvykly znak (casteji treba stupen, nebo velkou omegu, nez diakritiku), ale problem je, ze bych si stejne nepamatoval, kam jsem to namapoval, protoze to pouzivam prilis malo casto.
Kdyz uz vyjimecne potrebuju neco s diakritikou (tak dvakrat rocne), tak pomuze ohackovavac http://nlp.fi.muni.cz/cz_accent/, ktery se postupne zlepsuje. Staci po nem text precist a nejtypictejsi chyba je pridani diakritiky nekam, kde byt nemela, coz se resi docela snadno.
Jeste k tem neobvyklym znakum – snad jedina vec z DOSu a Woken, ktere mi na Linuxu obcas chybi, byla moznost napsat libovolny znak za pomoci Altu a numericke klvasnice. Zatim jsem na to nenasel zadnou utilitu, ani framework, ktery by to dokazal odchytit jako jednu klavesovou zkratku od zmacknuti Altu az po pusteni Altu.
> Ty klavesove zkratky na upravu schranky, ktere zminujes, mas pres Actions v clipitu?
Ne, v Xfce mám normálně namapované spuštění příkazu “xclip -out | něco | xclip -in” (pro delší by to asi chtělo strčit do dočasného souboru (mimochodem když jsme u dočasných souborů v kolonách, doporučuji kouknout na “sponge” z balíčku moreutils (a vlastně i další věci odtamtud))).
> Ty cisla pises na opravdove numericke klavesnici (z pohledu jadra) a mas notebooka, nebo podobne organizovanou klavesnici, kde je numericka klavesnice simulovana pres Fn+klavesa?
Z pohledu jádra je to s Fn numerická klávesnice (např. “3” posílá keycode 89), ale “+” a “*” bylo KP_Add a KP_Multiply, takže jsem stejně část těch věcí musel přemapovat (tohle konkrétně na “plus” a “asterisk”), protože irssi ve screenu přes SSH to nějak nechutnalo.
Mapuju přes Xmodmap, což teda není permanentní ani v rámci připojení a odpojení klávesnice, ale o to se stará můj desktopový démon (a např. když jsem míval (externí) klávesnici s dementně přemapovaným 6-blokem Ins/Del, tak to při detekci jejího připojení přemapoval, a po odpojení zase zpátky).
Stupeň máme na české jako 2x dead-kolečko (as in “å”), s dalšími znaky souhlasím, ale ty kódy si stejně nepamatuju. Ve Vimu to jde: http://www.alecjacobson.com/weblog/?p=443. Spolužák takhle v reálném čase zapisuje matematické přednášky.