AVY - útok velociraptora
Ako som načisto zlenivel a začal sa spoliehať na prehistorické zviera.
Velociraptor a AVY
… je známy najmä z filmu Jurský park. A určite ho poznajú všetky deti, lebo práve tie sú v určitom veku posadnuté dinosaurami.
Aj vo filme bolo zrejmé, že je to zviera, ktoré ide priamo za cieľom, bez otázok či otáľania.
(Ono tie otázky by boli akiste otázne.)
AVY je rozšírením pre GNU Emacs. Jeho filozofia je podobná Vim EasyMotion. Ide o presun na viditeľný text pomocou rozhodovacieho stromu založeného na znakoch. Teda - nielen to, ale to je jeho základný princíp.
Presne ako velociraptor. Rýchlo, efektívne…
Filter → výber → akcia
Ak nejde len o zadávanie textu, tak tento princíp interakcie používame takmer stále. Najprv vyfiltrujeme veľkú hromadu kandidátov. Kadidátmi sú nielen slová v bufferi, ale napríklad i zoznam okien. Potom toho kandidáta zvolíme. Častokrát sa toto udeje auutomaticky, keď sa jedná po filtri už len o jedného kandidáta.
A nakoniec sa spustí príslušná akcia. Tou je napríklad spustenie nejakého príkazu, alebo presun kurzora.
A v perexe spomínaná lenivosť spočíva v tom, ako ten výber kandidátov zjednodušiť tak, aby sme použili najmenej stlačení klávesov.
O tak stochastickom zariadení, ako je myš, radšej ani neuvažujme ☺.
AVY - základné vlastnosti
Teda nie všetky, tých je príliš veľa, ale tie, ktoré používam najčastejšie.
A myslím, že z opisu postupu bude jasné, ako to funguje.
Práca s riadkami
avy-goto-line
Slúži na skok na riadok, viditeľný na obrazovke. Po spustení príkazu (u mňa je to poradie stláčania <f12> a l
(<f12>
je namapovaný kláves "Hyper", sediaci na pôvodnej pozícii zbytočného Caps Lock-u).
A udeje sa tento zázrak - vedľa riadkov sa zobrazia kombinácie písmen v pekných farebných pozadiach (aké kombinácie a v akých farbách je možné nastaviť - ani neviem, prečo to píšem, veď v Emacse sa dá nastaviť úplne všetko, na čo si len človek spomenie, ak aj nie volenou možnosťou, tak úpravou kódu. Hanba mi za takéto vyjadrenie!) a ich stlačením (postupným) kurzor skočí na začiatok spomínaného riadku.
Obr. 1: Skok na riadok "avy style" |
Ak sa jedná presuny na väčšie vzdialenosti ako dva riadky, prípadne je riadok v inom, viditeľnom, okne, tak sa táto funkcia vyplatí.
A tu sa začína náš výlet do útrob duše lenivého človeka.
Isteže, na tento prístup si treba zvyknúť, ako na všetko v živote. Ale je to návykové. Veľmi.
Poznámka na okraj
Aby som si pamätal všetky tie skratky, tak to mám zoradené tak, že vždy sa aktivujú <f12> a
+ ďalší kláves(y)
. Ak by som si nepamätal (čo by som ale musel prestať používať PC na dlhé obdobie), tak po zadaní uvádzacej kombinácie a následnej váhavej pauze, naskočí pomocník:
Obr. 2: Malá nápoveda |
ace-jump-buffer
Iný balík nám tuto raptoriu funkcionalitu poskytne i pre výber/skok do iného bufferu.
Obr. 3: Skok do iných bufferov |
avy-copy-line & avy-copy-region
Ako indikuje názov, sú to šikovné funkcie, ktoré na pozíciu kurzora prekopírujú celý riadok, alebo rozsah riadkov. V druhom prípade zadávame štartovnú i koncovú pozíciu textu.
Obrázky napovedia:
Obr. 4: Zvolenie ka a následne kd … |
Obr. 4: … a región sa prekopíroval na pozíciu kurzora |
avy-kill-region
Spôsobí zmazanie definovanej oblasti a jej presun do tzv. kill-ring-u, čo je pokročilá schránka (zaujímavosťou je, že kill-ring funkcionalitami predbehol klasických správcov schránky o dve dekády).
Práca so slovami a znakmi
Hm, toto sú funkcie, ktorá nepracujú s celými riadkami, ale skoky (t.j. náš filter) sa dejú na úrovni slov a znakov.
avy-goto-[word-0] (word-1, -subword-0, -subword-1)
Štyri príkazy, ktoré robia podobné veci. Umožňujú presun kurzora na konkrétne slovo (alebo jeho časť), po zadaní jedného alebo dvoch znakov. Je to šikovnejšie, ako volať funkciu hľadania, ak sa jedná o presun v rámci viditeľného textu.
Obr. 6: Skok na slová |
avy-goto-char-timer
Je najväčia parádička celého tohto prehistorického cirkusu. Umožňuje skok na slovo po zadaní viacerých znakov. Filtrovanie skončí, ak sa vstup z klávesnice sa preruší na určitý čas (predvolene 500 ms).
Obr. 7: Výber viacerých možností po stlačení dvoch kláves, |
Počet kandidátov sa tak stále zmenšuje a zmenšuje, a ak ich je primeraný počet, tak po stlačení zvýraznených klávesov skočíme na príslušné slovo…
Nové funkcie
A pre túto funkciu si môžeme vytvoriť i ďalšie funkcie. Nie je ich málo (dajú so zobraziť po stlačení ?
počas zadávania znakov. Aby som to upresnil.
Logika len skoku je nasledovná:
- zavoláme funkciu avy-goto-timer,
- zadáme znaky, okliešti sa množstvo kandidátov,
- a po zadaní zvýrazených klávesov skočíme na požadovaného kandidáta.
Oproti tomu logika skoku a akcie (ak nepovažujeme skok za akciu) je takáto:
- zavoláme funkciu avy-goto-timer,
- zadáme znaky, okliešti sa množstvo kandidátov,
- ak skončíme so zadávaním znakov, tak zvolíme funkciu,
- a potom zadáme oné zvýraznené klávesy.
A aké sú to funkcie?
Jedná sa o dvojice (v lispe sa volajú cons cells), kde vystupuje číslo klávesu a priradená funkcia, uložené v premennej av-dispatch-alist
.
Sú tam napríklad:
- mazanie riadku (teda nie zadaním jeho pozície, ale výskytom kandidáta),
- označenie kandidáta,
- mazanie od kurzora po kanditáta,
- … a iné.
Ukážeme si, ako si pridať vlastné funkcie, vysvetlenie je v komentároch:
(require 'avy) ;; načítanie určenej funkcie alebo knižnice ;; niečo ako "import" alebo "include" v iných (defun avy-action-mark-to-char (pt) ;; funkcia na označenie textu od kandidáta (activate-mark) ;; po pozíciu kurzora (goto-char pt)) (defun avy-action-copy-whole-line (pt) ;; kopírovanie riadku v ktorom je kandidát (save-excursion ;; uložíme si aktuálnu pozíciu kurzora (goto-char pt) ;; skočíme na pozíciu kandidáta (cl-destructuring-bind (start . end) ;; zistíme začiatočnú a koncovú pozíciu riadku (bounds-of-thing-at-point 'line) ;; a vrátime ju ako dvojicu (copy-region-as-kill start end))) ;; skopírujeme región, zistený predtým, do kill-ringu (select-window ;; do aktívneho okna na pozíciu v (cdr ;; avy-ring, ktorá obsahuje históru pozícií kurzora (ring-ref avy-ring 0))) (save-excursion (yank)) ;; a vloží (yank) posledný záznam v kill-ring-u t) (setf (alist-get ? avy-dispatch-alist) 'avy-action-mark-to-char ;; a priradíme kláves k novým funkciám (alist-get ?W avy-dispatch-alist) 'avy-action-copy-whole-line) ;; "medzeru" a "W"
A takto to vyzerá v praxi - na spodku obrazovky je nápoveda s klávesami na zavolanie akcie - i nové funkcie. Volané je to pred zvolením finálneho kandidáta:
Obr. 8: Nové funkcie v avy-goto-char-timer |
Záver
Je potrebné si uvedomiť, že sila tohto prístupu je nielen v znižovaní počtu stlačení klávesov (samozrejme uvažujeme, že používa len klávesnicu), ale tiež v možnej rozšíriteľnosti. Dá sa použiť všade tam, kde je potrebný presun kurzora a volanie nejakej funkcie. Napríklad zavolanie dokuemntácie (pomocou dash), kontrola preklepov v oblasti (pomocou ispell), skok na definíciu…
Ja osobne tento prístup používam všade - od písania poznámok, mailov, až po prehrávanie hudby.
To je výhoda života v jednom prostredí. Preto je Emacs, podľa mňa, najvyššou formou digitálnej existencie.
Pre pridávanie komentárov sa musíte prihlásiť.