[Fanda] Keyjutsu 1.2, Masívny update, plný nových funkcií

Rastislav Kiss rastislav.kish na gmail.com
Čtvrtek Únor 13 08:52:19 CET 2020


Zdar,

yup, slúži na to príkaz Send, resp, jeho rýchlejší súrodenec SendInput, 
Sen tiež funguje, ale trocha pomalšie.

https://www.autohotkey.com/docs/commands/Send.htm

Len pozor na fakt, že sa dá posielať ako textový vstup, tak klávesový 
vstup, podľa potreby.

Na opakované vykonávanie zas môžete použiť SetTimer:

https://www.autohotkey.com/docs/commands/SetTimer.htm


Alebo while cyklus, kombinovaný so Sleep:

https://www.autohotkey.com/docs/commands/Sleep.htm


Rozdiel je v tom, že zatiaľ čo pri použití timera je opakovanie 
asynchrónne t.j. môžete používať ďalšie funkcie Keyjutsu počas 
vykonávania úlohy, napríklad na jej zastavenie, počas behu while cyklu 
toto nejde.


Ukážkový príklad, povedzme, že chceme stlačiť ctrl+win+enter každých 10 
sekúnd. Vytvoríme nový súbor vo functions, nazveme ho napr. opakovac.txt.

Tu definujeme label s kódom pre stláčanie:


Opakovac:

SendInput, ^#{enter}

return


Pozn. menší reminder, labely v autohotkey sú označenia miest, na ktoré 
môže program skočiť, podobne ako boli napr. v basice čísla riadkov, 
pričom sa používalo goto pre skok na daný riadok. V tejto podobe s 
returnom ich môžeme vnímať ako funkcie bez parametrov, hoci princíp 
fungovania je vnútorne odlišný.


Teraz už len vytvoríme skript sekvencie, tc je určená presne na podobné 
experimenty, pre reálne použitie si pochopiteľne spravíte novú sekvenciu.


Sem  už len dáme kód:


SetTimer, Opakovac, 10000


ktorý skočí na label Opakovac každých 10 sekúnd (10000 milisekúnd)


A je hotovo, dokopy dva riadky funkčného kódu, plus dva pre definíciu 
labelu. ;)


Problém tohto skriptu je v tom, že sa celkom blbo zastavuje. Jediný 
spôsob, ako ho stopnúť je cez sekvenciu kr, ktorá reštartuje Keyjutsu.

preto by nebol zlý nápad spraviť prepínač pomocou globálnej premennej. V 
skripte sekvencie by to znamenalo:


global opakovacPrepinac

if (opakovacPrepinac=true)

opakovacPrepinac=false

else

{

opakovacPrepinac=true

SetTimer, Opakovac, 10000

}


A v labely:


Opakovac:

global opakovacPrepinac

if (!opakovacPrepinac) ; ak je opakovacPrepinac false

{

SetTimer, , Delete ; vypne timer

return

}


SendInput, ^#{enter}

return


V tomto prípade bude opakovaná aktivácia sekvencie vypínať a zapínať 
timer. opakovacPrepinac je len hlúpy preklad opakovacSwitch, môžete 
použiť ľubovolné názvy premenných, ktoré budú dávať zmysel.

Možnosti sú naozaj široké, akurát by som ten Timer viac uvítal v podobe 
objektu, ale dá sa to aj takto používať.


R.K.


Dňa 12. 2. 2020 o 22:15 ppartyka napísal(a):
> Chtěl jsem se zeptat, jestli by se dalo nadefinovat, aby tento 
> prográmek imitoval v určitém intervalu stlačení určité klávesy. Např. 
> numerickou číslici po půlminutě nebo minutě. Právě zajímavé by bylo 
> implementování automatických sekvencí kláves něco jako měla ve Win 3.1 
> tzv. kamera. Tam byl a plněná buď podmínka, že se něco objevilo na 
> obrazovce, tak to automaticky provedlo zadání nadefinovaných kláves 
> anebo myslím za jiných podmínek kdykoli se příkaz spustil.
>
> P.P.
> ----- Original Message ----- From: "Rastislav Kiss" 
> <rastislav.kish na gmail.com>
> To: <fanda na elsa.cvut.cz>
> Sent: Monday, February 10, 2020 9:41 PM
> Subject: [Fanda] Keyjutsu 1.2, Masívny update, plný nových funkcií
>
>
>> Ahojte,
>>
>> tak po troch resp. dvoch dňoch intenzívneho vývoja a písania 
>> dokumentácie môžem konečne oznámiť, že vychádza Keyjutsu 1.2!
>>
>> Označenie masívna aktualizácia v tomto prípade vôbec nie je prehnané. 
>> Hlavne interne prakticky neostal kameň na kameni, a veľa vecí 
>> prebieha úplne ináč než predtým. No žiadne obavy, je to stále starý 
>> známy Keyjutsu, akurát výkonnejší a obohatený o niekoľko cool 
>> funkcií. :)
>>
>> Zmien je objektívne dosť, neviem ani kde začať. Poďme teda na to!
>>
>>
>> Ak ste študovali vygenerovaný kód predchádzajúcich verzií Keyjutsu, 
>> mohli ste si všimnúť, že jeho princíp fungovania bol veľmi 
>> jednoduchý. Vytvorila sa definícia klávesovej skratky, v nej sa 
>> odchytil vstup používateľa, ktorý sa následne prehnal cez obrovskú if 
>> / else if konštrukciu, a ak niekde došlo k zhode, vykonal sa kód na 
>> danom mieste, pričom sa paradoxne po jeho dokončení proces 
>> nezastavil, ale pokračoval ďalšími podmienkami.
>>
>> S tým je v novej verzii koniec. Všetky skripty používateľa sú ponovom 
>> vložené do funkcií, ktoré sa následne na základe vstupu volajú z 
>> funkcie launchJutsu. je to krajšie, flexibilnejšie, výkonnejšie, a 
>> všetky možné benefity, ktoré si len dokážete predstaviť.
>>
>> Tieto detaily nie sú pre bežné použitie v zásade dôležité, okrem 
>> funkcie LaunchJutsu.
>>
>>
>> A tým sa už dostávame k skutočne viditeľným zmenám:
>>
>> * Bola pridaná možnosť tvorby vlastných klávesových skratiek. Tie 
>> sídlia v priečinku hotkeys, v podobe modulov, kde môžete jednotlivé 
>> skratky definovať v autohotkey štýle. Ak tak máte už existujúce 
>> skripty, ktoré by ale bolo nepraktické zaraďovať do sekvenčného 
>> prístupu Keyjutsu, typicky napríklad prepínanie pracovných plôch, kde 
>> by teoreticky jednoduchá skratka mohla byť účinnejšia než klávesová 
>> sekvencia, môžete ich ponovom tiež zahrnúť.
>>
>> Ďalšou peknou výhodou tohto prístupu je, že je týmto spôsobom 
>> definovaná aj aktivačná skratka Keyjutsu, v súbore 
>> ActivationHotkeys.txt. To tak umožňuje nie len túto skratku meniť, 
>> ale jej dávať tiež rôzne kontexty - v ktorých oknách má fungovať, v 
>> ktorých nie a pod. Pričom na to, aby mohla byť skratka aktivačnou 
>> treba v zásade len to, aby volala už spomínanú funkciu LaunchJutsu.
>>
>> Takže tí z vás, ktorý majú problémy s VisualStudiom, ale chcú napriek 
>> tomu používať skratku ctrl+K, alebo nejakú inú obsadenú kombináciu, 
>> môžete ponovom veľmi ľahko nastaviť, aby všade v systéme platila ako 
>> aktivačná skratka ctrl+K, len vo VisualStudiu napr. ctrl+alt+=, alebo 
>> niečo podobné, čo by nekolidovalo.
>>
>> Odpadá tak tiež pochopiteľne nastavenie activation shortcut z 
>> konfigurácie, nakoľko je nový prístup podstatne silnejší.
>>
>>
>> * Bola pridaná podpora pre regexy. Povedzme napr. že by ste chceli 
>> mať sekvenciu, ktorá by vám otvorila priečinok niektorého z vložených 
>> diskov. Tie sú každý v podstate priečinok na rovnakej úroni, len s 
>> odlišným písmenom. Po starom by ste napriek tomu museli definovať 26 
>> skriptov, štýlom pda, pdb, pdc, ..., pričom by kód v každom z nich 
>> bol prakticky rovnaký, líšil by sa len použitým písmenom, ktoré je 
>> ale obsiahnuté už v sekvencií samotnej.
>>
>> Nová verzia tento problém rieši, a prináša popri klávesových 
>> skratkách a sekvenciách tiež regulárne výrazy, ako možnosť vstupu. 
>> Menší reminder pre nezasvätených, regulárne výrazy, tiež regex, 
>> umožňujú definovať reťazec resp. množinu reťazcov pomocou vzoru, 
>> namiesto presnej interpretácie.
>>
>> V tomto prípade by tak stačilo namiesto vytvárania množstva skriptov 
>> urobiť len jeden, s regexom pd., ktorý sa vzťahuje na všetky možné 
>> jednotky, nakoľko bodka predstavuje v regulárnych výrazoch akýkoľvek 
>> znak. Ak vám napadlo, že to nebude fungovať, lebo napr. čísla alebo 
>> interpunkcia nie sú platnými názvami diskov, máte pravdu, aj to je 
>> však možné regulárnym výrazom ošetriť, použitím formy pd[a-z], kde 
>> hranaté zátvorky predstavujú rôzne možnosti znakov na danej pozícii, 
>> a a-z rozsah týchto znakov, aby sme nemuseli vypisovať ručne 
>> abcdefghijklmnopqrstuvwxyz.
>>
>> Konkrétny vstup je potom v skripte k dispozícii v globálnej premennej 
>> INPUT, ktorá je navyše v regex funkciách definovaná automaticky 
>> assemblerom ako globálna, takže ju nemusíte sprístupňovať ručne.
>>
>> Kód by sa v tomto prípade scvrkol z 26 skriptov na:
>>
>> Run, % subStr(INPUT, 3) . ":"
>>
>> A je hotovo. :)
>>
>>
>> Pozn. nepozná niekto nejaký dobrý regex tutoriál v našich jazykoch, 
>> ktorý by som mohol uviesť v dokumentácii ako referenciu? Pozeral som 
>> články na wikipédii, ale dobrý mi príde iba ten anglický, ktorému asi 
>> veľa našincov neporozumie, český nikto nepochopí a slovenský sa 
>> skladá dokopy z dvoch odstavcov.
>>
>>
>> * Bol výrazne prepracovaný systém spúšťania akcí, zjednodušene to, čo 
>> sa deje na pozadí, keď zadávate sekvenciu klávesov.
>>
>> V predchádzajúcich verziách sa používal príkaz Input, ktorý bol však 
>> značne limitovaný, pokiaľ išlo o to, ako zisťuje, kedy ukončiť vstup 
>> a vyhodnotiť klávesovú sekvenciu.
>>
>> Vo verzii 1.2 sa používa flexibilnejší InputHook, ktorý má hneď dve 
>> super vlastnosti.
>>
>> Jednou z nich je, že si vždy automaticky vyhradí klávesnicu, ak ju 
>> nemá pre seba. Tým kompletne odpadá problém s čítačmi obrazoviek, 
>> vďaka čomu sme sa mohli zbaviť troch skriptov, jedného timeru a 
>> neustáleho reštartovania Keyjutsu, nehovoriac o tom, že to aj tak 
>> nefungovalo za určitých okolností.
>>
>> V novej verzii už ide všetko tak ako má a vždy.
>>
>>
>> A druhou dobrou vlastnosťou je, že InputHook umožňuje kompletnú 
>> kontrolu nad zadávaním vstupu, jeho zastavením, a ďalšími vecami. Čo 
>> som hneď využil, aby som mohol naprogramovať jednak regexy, a jednak 
>> možnosť automatického vypínania pri preklepe, aby ste to nemuseli 
>> robiť ručne.
>>
>> No a keďže mám vo všeobecnosti zlé skúsenosti s interpretovanými 
>> jazykmi typu Autohotkey a cyklami, tak som tieto funkcie 
>> neprogramoval v AHK, ale som vytvoril špeciálnu dll knižnicu 
>> naprogramovanú v ruste. Rust je programovací jazyk známy svojou 
>> vysokou rýchlosťou, bezpečnosťou, prehľadnosťou a tzv. zero cost 
>> abstrakciou, čo ho robí elegantným a mocným zároveň. Opäť pre 
>> zasvätených, poráža C++ snáď vo všetkých možných smeroch, vrátane 
>> rýchlosti, pre zvyšok stačí vedieť, že je matchovacia knižnica vďaka 
>> nemu veľmi výkonná a mala by si poradiť aj s vysokým náporom. Rustová 
>> regex knižnica patrí k najvýkonnejším na svete, takže sa nemusíte pri 
>> ich využívaní obmedzovať, nemali by vás nijak spomaľovať. Jedinou jej 
>> nevýhodou je, že kvôli rýchlosti nie sú podporované niektoré funkcie 
>> typu look around či backreferences (dobre znejúci slovenský preklad 
>> mi pravdupovediac nenapadá), ktoré ale aj tak nie sú v tomto kontexte 
>> príliš podstatné.
>>
>>
>> match_lib tak prináša množstvo benefitov, až na jeden malý detail. 
>> Keďže sa jedná o natívnu knižnicu, musí mať vopred danú architektúru 
>> 32 / 64 bit. Nie je to nijak zásadný problém, je možné jednoducho 
>> skompilovať obe verzie a potom načítať tú z nich, ktorá je na danom 
>> systéme treba, avšak pre mňa by to znamenalo nutnosť inštalovať 
>> 32-bitový Rust toolchain, čo sa mi jednoducho povedané nechcelo. 
>> Preto som sa vzhľadom k faktu, že dnes má 64-bitový stroj snáď každý, 
>> rovnako ako Autohotkey, rozhodol urobiť len 64-bitový build, čím je 
>> celé keyjutsu obmedzené len na túto architektúru.
>>
>> Ak by to pre vás predstavovalo problém, a chceli by ste Keyjutsu 
>> využívať aj na 32-bitových strojoch, stačí, ak mi dáte vedieť, a 
>> možno si jeden večer spravím čas, a urobím aj tú 32-bitovú verziu. 
>> Nechcel som sa s tým babrať, ak to napokon nikto nebude využívať, ale 
>> ak záujem bude, nemal by to byť problém.
>>
>>
>> zdrojový kód match_lib je koniec koncov taktiež priložený v balení 
>> spolu s kódom assemblera, teda ak ste technicky zdatnejší a máte s 
>> kompilermi skúsenosti, môžete si knižnicu skompilovať v podstate aj 
>> bez mojej asistencie na vlastnom stroji. Narozdiel od C++, v Ruste je 
>> to hladký a jednoduchý proces.
>>
>>
>> * Boli pridané nové možnosti v assembler_config.yaml. Sú myslím 
>> dokopy 4, nebudem ich tu rozoberať, nakoľko majú skôr minoritný 
>> význam, odporúčam sa však s nimi aspoň zoznámiť, aby ste vedeli, čo 
>> sa všetko dá, podrobný popis nájdete v dokumentácii.
>>
>>
>> * Aktualizovaná dokumentácia a changelog. Aj keď som tu myslím nové 
>> funkcie celkom obšírne popísal, vynechal som niekoľko drobností, 
>> hlavne presných detailov písania a fungovania určitých vecí. 
>> Odporúčam si preto prejsť aktualizovanú dokumentáciu, hlavne sekcie 
>> Hotkeys, Regexes a Assembler_config.yaml, kde sa zmeny prejavili 
>> najviac a kde je detailne popísané používanie nových možností.
>>
>>
>> * medzi functions pribudol skript !Keyjutsu.txt. Spomínam ho preto, 
>> lebo je systémový, a obsahuje dôležité funkcie pre interné fungovanie 
>> Keyjutsu, ako napr. práve funkciu launchJutsu. Mazať alebo meniť ho 
>> teda skôr nebude dobrý nápad.
>>
>>
>> A to je konečne k verzii 1.2, čo do tohto mailu, všetko. :)
>>
>> Mal som pravdu, bolo toho dosť, ale z môjho pohľadu to rozhodne stálo 
>> za to.
>>
>> Novú verziu by vám už mal ponúkať assembler, prípadne môžete ručne 
>> navštíviť stránku:
>>
>> https://rastisoftslabs.com/2020/02/01/keyjutsu-superschopnosti-priamo-vo-vasich-prstoch/ 
>>
>>
>> Kde je voľne dostupná na stiahnutie opäť ako celok, lepší spôsob mi 
>> stále nenapadol.
>>
>>
>> Samozrejme uvítam akúkoľvek spätnú väzbu, návrhy na vylepšenia, 
>> opravy či celkové hodnotenia.
>>
>>
>> Enjoy!
>>
>>
>> R.K.
>>
>>
>


Další informace o konferenci Fanda