Hlavní navigace

Emacs: viac než len editor (6)

Stanislav Kuchár 14. 12. 2000

V dnešnej časti o emacse sa pozrieme na hľadanie a nahrádzanie v texte ale i viacerých súboroch. O tom, že sa operácie so súbormi (a la file manager) dajú prevádzať priamo z emacsu, nie je pochýb.

Nahrádzanie textu

Často sa stáva, že treba nahradiť nejaké slovo, či zopár znakov v súbore iným: premenná koliduje s kľúčovým slovom, firma bola predaná a premenovaná, starého šéfa nahradil nový, atď.

  1. Najjednoduchší prístup je z menu Search položka Query Replace, alebo z klávesnice M-%. Po zadaní reťazcov (pôvodný text a nový text) sa emacs postupne opýta na každý výskyt pôvodného textu, či sa má nahradiť novým textom.
  2. Niekedy je trochu otravné odpovedať na každý každučičký výskyt reťazca (keď ich je tam pár stoviek). Ak máte radi trochu risku, alebo ste si istý, že to prejde v pohodode, skúste M-x replace-string. Funguje to celkom ako v predchádzajúcom prípade, len sa emacs moc nevypytuje.
  3. Pre rafinovanejších sú tu regulárne výrazy, ktoré môžu postihnúť viacero variácií pôvodného textu, môžu zahrňovať variabilný nový text v závislosti na pôvodnom texte. Z menu Search položka Query Replace Regexp, alebo z klávesnice C-M-%. Neznalí si určite radi prečítajú manuál o tom, čo sú to regulárne výrazy: M-x man RET regex, alebo články o regulárnych výrazoch.
  4. Hľadanie regulárných výrazov a ich nahrádzanie bez zbytočných otázok sa da previesť pomocou: M-x replace-regexp.

Pár príkladov pre tých, ktorí si ešte stále nevedia predstaviť na čo im sú také regulárne výrazy. Stlačte M-x replace-regexp a zadajte reťazce.

Príklady sú v tvare: "prvý reťazec" -> "druhý reťazec". Prvý reťacez je regulárny výraz popisujúci pôvodný text a druhý reťazec je to, čo chceme dostať. Zadávajte ich bez úvodzoviek.

"^" -> "> "
zmení každý riadok od kurzoru do konca súboru z pôvodného
"text riadku"
do tvaru
"> text riadku"
čiže do tvaru, ktorý sa používa pri odpovedaní na email. Znak ^ znamená začiatok riadku.
"C-q C-m" -> ""
ak otvoríte windowsovský (resp. dosovský) súbor a emacs ho nerozpozná ako dosovský súbor, môžete odstrániť všetky znaky ^M na konci riadku (nahradí ^M ničím), prázdny reťazec len odklepnite enterom. Znak ^M sa vkladá ako C-m, ale keďže ide o riadiaci znak, treba ho „escapnuť“ pomocou C-q.
" +" → " "
vymaže viacnásobné medzery. V prvých úvodzovkách je medzera a znamienko plus, v druhých je len jediná medzera. Čiže jeden a viac výskutov medzery nahradí jednou medzerou.
„\b\(\w+)\b +\1“ → „\1“
vymaže opakujúce sa slová.

dired mód

Skôr než si ukážeme nahrádzanie textu vo viacerých súboroch musíme si povedať niečo o dired móde. Je to vlastne file manager (súborový manažér) v emacse.

Spúšťa sa jednoducho M-x dired. Potom dostanete otázku, ktorý adresár chcete zobraziť. Dostanete zoznam súborov a adresárov, po ktorom sa dá pohybovať šípkami. Ak odklepnete Enterom súbor – otvorí ho. Ak je kurzor na adresári a stlačíte Enter, otvorí sa nový buffer so zoznamom súborov a adresárov v ňom.

Súbory či adresáre, s ktorými chcete niečo robiť, môžete označiť pomocou klávesu m, alebo z menu Mark položka  mark.

Označené súbory sa potom dajú kopírovať pomocou C, presúvať a premenovávať: R, mazať: D.

A tiež sa v označaných súboroch (viacerých!) dá meniť nejaký text, ako sme si to ukázali hore. Stačí označiť súbory, ktoré chceme prehľadať a vymeniť v nich reťazce, klávesom m, zvoliť z menu Operate položku Query Replace in Files, zadať pôvodný text, cieľový text a ide sa na vec.

Najväčší dôvod, prečo som začal používať dired je použitie makier priamo na súboroch: otvor súbor s príponou .php, pridaj debugovací príkaz, ulož súbor, presuň sa na ďalší.

Hľadanie v makrách

Veľa krát sa mi stalo, že som v makre chcel hľadať nejaký text, ktorý som si predtým uložil do kill-ringu (niekedy aj počas toho makra). Ale vždy to zlyhalo, pretože v môde isearch (C-s) je C-y niečo úplne iné ako vloženie obsahu kill-ringu.

Čo s tým? V helpe som si našiel C-s nie je jediný spôsob hľadania. Existuje aj neiteratívne hľadanie M-x search-forward, ktorému ako hľadaný reťazec môžete kľudne zadať aj obsah kill-ringu.

Apropos

Ako sa mi podarilo nájsť search-forward a vôbec všetky hľadacie funkcie? Z menu Help, podmenu Describe položka Apropos Commands, zadal som slovo search (pre hľadanie slova hľadanie vo všetkých príkazoch, ktoré emacs pozná) a dostal som zoznam všetkých emacsovských funkcií, ktoré obsahujú slovo search. Potom už si len stačí prečítať, čo ten-ktorý príkaz robí a vybrať si ten pravý.

Podobne možno hľadať v premenných emacsu: Z menu Help, podmenu Describe položka  Apropos Variables.

Našli jste v článku chybu?

14. 12. 2000 21:55

Deda (neregistrovaný)

kdo chce psat filtry na prekodovani:
tr -d "\r" <dosovsky.txt >unixovsky.txt


14. 12. 2000 13:10

Jirka (neregistrovaný)

Kdyz chci nahradit vsechny retezce pomoci M-%, tak
misto mezerniku zmacknu "!" a je to. HOWGH


Měšec.cz: Kdy vám stát dá na stěhování 50 000 Kč?

Kdy vám stát dá na stěhování 50 000 Kč?

Lupa.cz: Avast po spojení s AVG propustí 700 lidí

Avast po spojení s AVG propustí 700 lidí

Podnikatel.cz: Víme první výsledky doby odezvy #EET

Víme první výsledky doby odezvy #EET

Podnikatel.cz: Přehledná titulka, průvodci, responzivita

Přehledná titulka, průvodci, responzivita

Root.cz: 250 Mbit/s po telefonní lince, když máte štěstí

250 Mbit/s po telefonní lince, když máte štěstí

DigiZone.cz: Rádio Šlágr má licenci pro digi vysílání

Rádio Šlágr má licenci pro digi vysílání

Lupa.cz: UX přestává pro firmy být magie

UX přestává pro firmy být magie

Lupa.cz: Insolvenční řízení kvůli cookies? Vítejte v ČR

Insolvenční řízení kvůli cookies? Vítejte v ČR

Měšec.cz: U levneELEKTRO.cz už reklamaci nevyřídíte

U levneELEKTRO.cz už reklamaci nevyřídíte

Vitalia.cz: Mondelez stahuje rizikovou čokoládu Milka

Mondelez stahuje rizikovou čokoládu Milka

120na80.cz: Horní cesty dýchací. Zkuste fytofarmaka

Horní cesty dýchací. Zkuste fytofarmaka

Měšec.cz: Air Bank zruší TOP3 garanci a zdražuje kurzy

Air Bank zruší TOP3 garanci a zdražuje kurzy

Vitalia.cz: Tesco: Chudá rodina si koupí levné polské kuře

Tesco: Chudá rodina si koupí levné polské kuře

Lupa.cz: Teletext je „internetem hipsterů“

Teletext je „internetem hipsterů“

Měšec.cz: Jak vymáhat výživné zadarmo?

Jak vymáhat výživné zadarmo?

DigiZone.cz: Sony KD-55XD8005 s Android 6.0

Sony KD-55XD8005 s Android 6.0

120na80.cz: Rakovina oka. Jak ji poznáte?

Rakovina oka. Jak ji poznáte?

Měšec.cz: Zdravotní a sociální pojištění 2017: Připlatíte

Zdravotní a sociální pojištění 2017: Připlatíte

DigiZone.cz: Recenze Westworld: zavraždit a...

Recenze Westworld: zavraždit a...

Vitalia.cz: Manželka je bio, ale na sex moc není

Manželka je bio, ale na sex moc není