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

Rastislav Kiss rastislav.kish na gmail.com
Pátek Únor 14 01:01:46 CET 2020


Pozn. :=true resp. false, nie =, ahk pri = berie všetko ako string, na 
to som zabudol.


R.K.


Dňa 13. 2. 2020 o 8:52 Rastislav Kiss napísal(a):
> 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