Emacs: viac než len editor (6)

14. 12. 2000
Doba čtení: 4 minuty

Sdílet

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.

bitcoin_skoleni

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.