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

Rastislav Kiss rastislav.kish na gmail.com
Pondělí Únor 10 21:41:57 CET 2020


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