Emacs (2) - pokročilá práca s textom - AKTUALIZOVANÉ

23.09.2008 10:45 | Články | Adam Sloboda
V druhej časti seriálu preberieme pokročilé ovládanie Emacsu.

Emacs je vhodný na úpravu dlhších textových súborov a poskytuje užitočné skratky pre pohyb po odstavcoch (Control a šípka nahor/nadol alebo M-{/M-}), pohyb po vetách (M-a/M-e, no je nutné dávať za vetou 2 medzery) alebo pohyb po slovách (Control a šípky do strán alebo M-f/M-b). M-q zarovná odstavec na šírku podľa premennej fill-column (je nastavená na šírku vhodnú pre terminál alebo mail). Dlhé riadky sa zobrazujú zalomené a C-PgUp/C-PgDn stránkuje po šírke.

Vyhľadávanie

Ďalší dôležitý posun je podľa inkrementálneho vyhľadávania (známe napr. z webových browserov), kedy sa hneď prechádza na najbližšie iesto výskytu zadávaného textu. C-s vyhľadáva dopredu, C-r vzad (oba môžu prechádzať znovu na začiatok/koniec súboru po ďalšom stlačení príslušnej skratky). C-g zruší vyhľadávanie a prejde na pôvodné miesto. Variácia s pridaným modifikátorom Meta (Alt) umožňuje použitie regulárnych výrazov.

Nahradenie textu

M-% nahradí výskyt jednej frázy druhou, C-M-% umožňuje použiť regulárne výrazy.

Označenie a práca s blokmi textu

Na označenie sa používa Mark (značka). Značka nie normálne nijak viditeľná a slúži na označenie začiatku alebo konca bloku (Region v terminológii Emacsu), druhý koniec označuje poloha kurzoru. Značka sa umiestňuje skratkou C-SPC (SPC je medzerník). V novších verziách je možné aktivovať mód zvýraznenia bloku (transient-mark-mode) tým, že "umiestnime" značku dvakrát na tom istom mieste.

Keď už máme nejaký región označený, možeme ho skopírovať M-w (kill-ring-save) alebo vystrihnúť C-w (kill-region). Oba príkazy vkladajú text do "kill ring". Skratka C-y (yank) vloží text z "kill ring". Je vhodné si zapamätať termíny kill a yank aj preto, že vystupujú v názvoch mnohých funkcií a ich popisoch.

Pretože toto je v porovnaní s bežným ovládaním exotické, existuje cua-mode, ktorý nastaví bežne používané skratky (celkovo nezapadajú do prostredia, kolidujú s inými skratkami a poskytujú menšiu flexibilitu).

Ďalšie vystrihnutie je možné na základe viet alebo slov.

C-DEL (DEL nie je delete, backspace by mal byť náhradou) vystrihne predchádzaúce slovo a M-d nasledujúce (pokiaľ sa nachádzame v slove tak po začiatok resp. koniec slova).

C-x DEL vystrihne predchádzajúcu vetu a M-k nasledujúcu (pokiaľ sa kurzor nachádza vo vete, tak po začiatok resp. koniec vety).

C-x r k (kill-rectangle) vystrihne pravoúhly útvar z textu podľa značky a polohy kurzora, C-x r y (yank-rectangle) ho naopak vloží. Na prvý pohľad sa to nemusí zdať, ale je to užitočná funkcia.

C-k (kill-line) je skratka na vystrihnutie textu po koniec riadku. M-z vystrihne text po prvý výskyt zadaného znaku. Emacs má množstvo funkcií pre narábanie z textom, takže ak niečo často potrebujeme, tak sa to oplatí skúsiť nájsť a uľahčiť si tým život.

Jednoduché opakovanie

V tomto kontexte je vhodné si predstaviť numerický argument (M-N alebo M-- N pre záporné N). Podobne je možné použiť C-u (universal-argument), ktorému je tiež možné zadať číslo a skratku, ktorú má opakovať (bez zadania čísla sa použije 4). Takto je možné napríklad vystrihnúť predchádzajúcich N riadkov a pod.

Zložité opakovanie – makrá

Pokiaľ máme nejaký text, nad ktorým potrebujeme vykonať opakujúce sa operácie, je veľmi pravdepodobné, že to dokážeme zadefinovať veľmi presne a nechať Emacs aby to opakoval za nás. Začiatok makra sa označí stlačením C-x ( a koniec C-x ) (zrušiť zadávanie je možné pomocou C-g). Takto sa nahrajú naše operácie, ktoré je možné spustiť pomocou C-x e (opakované spustenie cez numerický/univerzálny argument).

Nekonečné "undo"

Ukázali sme si množstvo operácií, ktoré môžu byť nebezpečné pre náš text, preto potrebujeme aj ukladať históriu. Nekonečné undo znamená, že ak vrátime nejaké operácie, toto sa tiež ukladá do histórie a teda pôvodné operácie tiež nie sú nikdy stratené (stačí prerušiť sekvenciu volania undo napríklad pohybom kurzoru). Samozrejme, "nikdy" je silné slovo, toto je obmedzené pamäťou a limitom v premennej undo-limit (alebo undo-strong-limit), ktorú je možné nastaviť napríklad interaktívnou funkciou set-variable (C-h v je funkcia nápovedy zobrazujúca informácie o premennej).

Vrátiť stav je možné skratkou C-x u, C-_ alebo C-/.

Vkladanie špeciálnych znakov

Pokiaľ je nutné vložiť špeciálny znak, na to slúži funkcia quoted-insert (C-q), ktorá buď vloží znak podľa číselného kódu alebo priamo stlačený špeciálny znak.

Informácia o znaku na kurzore si môžeme zobraziť funkciou describe-char (funkciu cez meno spúšťame pomocou M-x alebo klávesou menu napravo od medzerníka).

Zmena textu

Občas sa zíde zmena veľkosti písmen, na to je tu M-u (upcase-word) pre veľké písmená, M-l (downcase-word) pre malé a M-c (capitalize-word) pre veľké začiatočné. Dostupné su aj ďalšie funkcie, ktoré menia označený text (Region).

Presun podľa riadku

M-g g alebo M-g M-g presunie kurzor na zadaný riadok. S univerzálnym argumentom sa presunie kurzor v poslednom navštívenom bufferi a aktivuje sa.

Dopĺňanie

Niekdy potrebujeme často písať opakujúce sa slová, vtedy je možné nechať si ich doplniť skratkou M-/ (dabbrev-expand).

Prácu s textom by sme mali celkom detailne prebratú, nabudúce si povieme ako ovládať okná.

    • datum ?? 25.09.2008 | 00:56
      pejta   Návštevník
      ten datum je isto spravny ? :) a btw vcelku pekny clanok
      • Re: datum ?? 25.09.2008 | 04:16
        dr34m   Návštevník
        Samozrejme, ze je spravny, kazdy ho ma rad a tesi sa v ten den, ze jake prekvapko ho caka ten dalsi, cize je to prakticky naschval :D.. okej no tak ho teda zmenim :D
    • cua-mode 25.09.2008 | 19:37
      Avatar Marek Ochaba Gentoo  Používateľ
      Ako sa dá prepnúť do cua-mode ?
      • Re: cua-mode 14.11.2008 | 18:27
        Avatar Marek Ochaba Gentoo  Používateľ
        Už som na to prišiel, príkazom:
        M-x cua-mode
    • preklep ? 26.11.2008 | 11:02
      Avatar Marek Ochaba Gentoo  Používateľ
      Nemá byť namiesto "C-DEL (DEL je backspace) vystrihne predchádzajúce slovo" skratka M-DEL ?
      • Re: preklep ? 29.11.2008 | 11:37
        autor   Návštevník
        aj to je alternativa

        pri akychkolvek pochybnostich staci pozriet help "C-h k" a stlacit prislusne klavesy
    • Pohyb po větách 03.01.2009 | 05:17
      tdx   Návštevník
      "pohyb po vetách (M-a/M-e, no je nutné dávať za vetou 2 medzery)"

      Není. Stačí nastavit hodnotu 'Editing' > 'Fill' > 'Sentence End Double Space' na off (nil). Ručně v konfiguračním souboru .emacs pak v 'custom-set-variables' jako '(sentence-end-double-space nil).
      • Re: Pohyb po větách 07.01.2009 | 12:29
        autor   Návštevník
        To je pravda, ale potom to nebude take presne. Na dve medzery sa da lahko zvyknut.