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ď.
- Najjednoduchší prístup je z menu
Search
položkaQuery 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. - 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.
- 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žkaQuery 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. - 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
.