[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