Hlavní navigace

Emacs: viac než len editor (4)

13. 11. 2000
Doba čtení: 5 minut

Sdílet

Dnes sa pozrieme na veľmi užitočný nástroj emacsu: makrá. Pomocou makier si môžete uľahčiť život, predovšetkým pri nudných a opakujúcich sa činnostiach, ktorých je pre spravovaní UN*X-u či web-u neúrekom.

Makrá

Aby sme si rozumeli, o čom hovorím, pokúsim sa o definíciu. Stvoril som ju práve teraz, tak ju, prosím, berte s rezervou.

Makro je užívateľom definovaná postupnosť operácií na texte.

  • Pod operáciami rozumieme stlačené klávesy, ktorým sú priradené funkcie (C-e – skok na koniec riadku, Delete – zmaž znak a podobne.)
  • „Operácie na texte“ znamená, že makro bude operovať s textom (kódom programu, html stránkou či textom piesne) od aktuálnej pozície, na ktorej je kurzor v čase keď spustíme makro.

Makro sa začne nahrávať po stlačení C-x (. Každý stlačený kláves sa zaznamená, až do stlačenia C-x ). Všetky klávesy (a teda im priradené funkcie) sa budú vykonávať, keď makro spustíme stlačením C-x e.

Keď začneme makro nahrávať, všetky stlačené klávesy sa vykonávajú. Takto vidíme, čo makro robí. Kedysi bolo treba makro v emacse najskôr „naslepo“ nahrať a potom ho spustiť. Poviem vám bola to fuška – nepomýliť sa – najmä keď išlo o dlhšie makrá.

Keď definujeme makro, stlačené klávesy operujú s textom, kde sa nachádza kurzor. Takto definujeme makro modifikujúce napríklad jeden riadok textu. Dalším spustením makra zeditujeme ďalší riadok. Spustíme ho znova, ďalší riadok je upravený, atď.

Príklad

Poďme si to ukázať na nejakom reálnom príklade, aby sme tu nehovorili o nejakom všemocnom obrovi, ktorého nikto nikdy nevidel.

Úloha je jednoduchá. Priniesli ste si niekoľko súborov od známeho, ktorý používa M$ Windows. Vy si ich chcete pozrieť v emacse pod Linuxom, ale windows používa iné kódovanie pre národné znaky. Treba si tie súbory skonvertovať.

Dajme tomu, že máte program cstocs, ktorý to zvláda. Použitie je jednoduché: cstocs 1250 il2 subor.win > subor.ux. Zopakujte tento príkaz pre všetky súbory, ktoré ste si priniesli od známeho. Keď ich budú dva alebo tri, asi každý príkaz aj s vstupným a výstupným súborom napíšete ručne, ale keď ich bude 100 či 1000, asi sa vám nebude chcieť. Mne by sa teda určite nechcelo.

Spravíme si preto jednoduchý script.

  1. zoznam súborov, ktoré chceme konvertovať, uložíme do súboru konvertuj  ( ls > konvertuj)
  2. otvoríme si súbor konvertuj v emacse (C-x C-f); ďalej budeme pracovať s týmto súborom
  3. vytvoríme makro:
    1. C-x ( – začiatok makra
    2. Home – skok na začiatok riadku, keby ste náhodou posunuli kurzor
    3. napíšte príkaz cstocs
    4. vložte medzeru
    5. napíšte zdrojové kódovanie 1250
    6. opäť medzera
    7. cieľové kódovanie il2
    8. opäť medzera
    9. C-k – vysekne meno súboru (uloží ho do kill ringu)
    10. C-y – vlož text naposledy vložený do kill ringu, teda meno súboru
    11. medzera
    12. vložte znak >
    13. medzera
    14. C-y – vlož text z kill ringu, teda opäť meno súboru
    15. napíšte znak l – takto vytvoríme meno výstupného súboru (musí sa líšiť od vstupného)
    16. šípka dole – skok na ďalší riadok
    17. Home – skok na začiatok riadku – a sme pripravený na ďalšiu iteráciu makra
    18. ukončíme nahrávanie makra C-x )
  4. opakujeme makro dostatočný počet krát (pomocou C-x e), až kým nie sú všetky riadky v tvare požadovaného príkazu
  5. uložíme zmeny C-x C-s
  6. nastavíme spúšťací bit: chmod +x konvertuj
  7. a napokon spustíme script: ./konvertuj

Podotýkam, že táto úloha by sa dala riešiť aj inak. Napríklad pomocou príkazu xargs, alebo pomocou sed, alebo funkciou v shelli, ktorá by brala meno zdrojového súboru a vykonala by daný prikaz. To všetko je možné, ale nám ide o makro v emacse!

Opakovanie

Asi nie je problém stláčať C-x e niekoľkokrát za sebou, najmä keď po každom stlačení sa vykoná toľko práce. Ale ide to aj urýchliť: takzvaný univerzálny argument C-u. Tento modifikuje správanie stlačeného klávesu. Pri makre je to počet iterácií. Teda keď stlačíme C-u 100 C-x e, makro sa vykoná 100 krát. A to nie je všetko, C-u 0 C-x e spustí makro toľko krát, až kým nenarazí na koniec buffra.

Modifikácia makra

Toto bolo celkom jednoduché makro. Keby ste sa pomýlili pri jeho nahrávaní, je celkom jednoduché prerušiť nahrávanie (C-g) a začať odznova. Ale čo keď je makro dlhé a vám sa nechce klepať to celé odznova. Alebo potrebujete len malú modifikáciu pre nový text. Nuž, potom už nezostáva nič iné, ako si to makro zeditovať.

Prv než sa do toho pustíme, ešte jedna poznámka. Už sme si vraveli, že emacs je takmer celý napísaný v jazyku Lisp. Každému klávesu je priradená nejaká lisp-ovská funkcia. Ale funkcií, ktoré emacs pozná je veľa, a preto ich nemožno všetky priradiť klávesám. Jedna taká funkcia je edit-kbd-macro. Ako teda spustiť funkciu, ktorá nemá priradený kláves? Celkom jednoducho: M-x meno-funkcie.

Stlačte M-x edit-kbd-macro a potom C-x e, pretože chceme editovať posledne vkladané makro. Zobrazí sa nám lispovský kód našho makra. V ňom môžeme urobiť zmeny.

Pre neznalca Lisp-u to asi nebude až také jednoduché, ale ak chcete zmeniť len nejaký text, ktorý ste v makre vkladali, toto bude celkom jednoduché. Aspoň jedna pomôcka: všetko za znakom ; (bodkočiarka) je poznámka.

Podmienka v makre

Niekedy sa stane, že makro je dosť komplikované a je potrebné doňho zahrnúť podmienku, či sa má vykonať na danom texte. Toto sa napríklad stáva, keď editujete rozsiahly súbor a v makre použijete vyhľadávanie C-s, aby ste našli text, ktorý chcete modifikovať. Vtedy pred kritickou časťou (počas nahrávania makra) stlačte C-x q. Na tomto mieste sa vás emacs opýta (po sputení makra) či chcete makro zastaviť, alebo ho nechať bežať ďalej.

Uchovávanie makier

Ak je makro dobré a myslíte si, že sa vám ešte niekedy zíde, môžete si ho uložiť. Najskôr si ho treba pomenovať: M-x name-last-kbd-macro a potom zadajte meno, napríklad konvertuj.

Otvorte si súbor makra.el a v ňom spustite M-x insert-kbd-macro. Opýta sa vás na meno makra. Tam vložte meno, ako ste pomenovali vaše makro. (Tip: skúste namiesto písania mena makra šípku hore – predchádzajúci vstup.)

Ak ste si makro pomenovali konvertuj, dostanete niečo takého:
  (fset 'konvertuj
   "C-acstocs 1250 il2 C-kC-y > C-ylC-nC-a")

Keď potom neskôr (napríklad po niekoľkých dňoch) budete potrebovať toto vaše geniálne makro, stačí otvoriť súbor makra.el, premiestniť kurzor za ukončovaciu zátvorku, stlačiť C-x C-e a máte definovanú funkciu konvertuj, ktorú možno vyvolať pomocou M-x konvertuj.

Keď si zvyknete na makrá a podľahnete ich čaru zistíte, že definovať si ich je veľmi jednoduché a budete ich používať aj na úplne jednoduché úlohy, ktoré by ste predtým robili ručne. Načo robiť nudné opakujúce sa veci, keď to môže urobiť emacs.

ict ve školství 24

V niektorej z budúcich častí si povieme, ako priradiť makro nejakému klávesu (a to i rovno pri štarte emacsu). Nezabudnite si preto prečítať i nasledujúce čas­ti.

Linky

  • konvertuj – príklad, ako môže vyzerať zoznam súborov, ktoré chcete hromadne modifikovať
  • konvertuj.macro – takto vyzerá editácia makra (vygenerované v emacse 20.7.2)
  • macra.el – makro v emacs lispe uchované v súbore pre neskoršie použitie
  • cstocs – program konverziu kódových stránok (Cstools)