Üdvözöljük a Vim, a legendás szövegszerkesztő lenyűgöző világában! Ha valaha is írt kódot, konfigurációs fájlokat szerkesztett, vagy csak plain text dokumentumokkal dolgozott, valószínűleg találkozott már a frusztráló feladattal, hogy nagyszámú szöveges elemet keressen és cseréljen le. Bár sok szerkesztő kínál valamilyen keresési és cserélési funkciót, a Vim ezen a téren egyszerűen verhetetlen. Nem csupán alapszintű műveleteket végezhetünk el vele, hanem komplex, többlépcsős változtatásokat is, amelyekkel órákat spórolhatunk meg. Ebben a cikkben elmerülünk a Vim keresési és cserélési technikáinak mélységeibe, a kezdeti lépésektől a legfejlettebb reguláris kifejezések használatáig, hogy Ön is igazi mestere lehessen a hatékony szövegszerkesztésnek.
Miért éppen Vim? A Hatékonyság Alapja
A Vim nem véletlenül a programozók és rendszermérnökök egyik kedvenc eszköze. A billentyűzetközpontú munkafolyamat, a modális szerkesztés, és a szinte korlátlan testreszabhatóság mind hozzájárulnak ahhoz, hogy a Vim rendkívül gyors és hatékony legyen. A keresési és cserélési funkciók, különösen a :substitute (vagy rövidebben :s) parancs, a Vim egyik legerősebb fegyvere. Képzelje el, hogy egy több ezer soros fájlban kell módosítania egy függvénynevet, vagy egy adatformátumot. Manuálisan ez napokig is eltarthatna, de a Vim erejével mindössze pár másodperc kérdése!
Az Alapok: Keresés a Vimben
Mielőtt rátérnénk a cserére, nézzük meg, hogyan is kereshetünk hatékonyan a Vimben. A keresés kulcsfontosságú a pontos csere végrehajtásához.
Egyszerű Keresés
/keresendo_szoveg: Előrefele keres a dokumentumban a megadott szövegre. NyomjonEnter-t a keresés indításához.?keresendo_szoveg: Hátrafele keres a dokumentumban.
Miután elindított egy keresést, az alábbi parancsokkal navigálhat a találatok között:
n: A következő találatra ugrik.N: Az előző találatra ugrik.
Keresés a Kurzor Alatti Szóra
Gyakran előfordul, hogy a kurzor alatt lévő szót szeretnénk megkeresni a dokumentumban. Erre is van egyszerű megoldás:
*: Előrefele keres a kurzor alatt lévő szó pontos egyezésére.#: Hátrafele keres a kurzor alatt lévő szó pontos egyezésére.g*: Előrefele keres a kurzor alatt lévő szó részleges egyezésére.g#: Hátrafele keres a kurzor alatt lévő szó részleges egyezésére.
Az Erőmű: A :substitute Parancs
A :substitute, vagy röviden :s, a Vim szíve, ha cseréről van szó. Az alapvető szintaxisa a következő:
:[tartomány]s/[minta]/[csere_szöveg]/[jelzők]
Bontsuk fel ezt a parancsot elemeire:
[tartomány]: Megadja, hogy a csere mely sorokon történjen. Ez opcionális. Ha hiányzik, az aktuális soron hajtja végre a cserét.s: Asubstituteparancsot jelöli.[minta]: A keresendő minta, ami lehet egyszerű szöveg vagy egy reguláris kifejezés.[csere_szöveg]: Az a szöveg, amivel a mintát helyettesíteni szeretnénk.[jelzők]: Opcionális paraméterek, amelyek módosítják a csere viselkedését.
Alapvető Cserék és Jelzők
Nézzünk néhány gyakran használt jelzőt (flags):
g(global): Alapértelmezetten a:sparancs csak az első egyezést cseréli le egy sorban. Agjelző hatására az összes egyezést lecseréli az adott sorban. Ez az egyik leggyakrabban használt jelző.c(confirm): Interaktív módba kapcsol. Minden egyes csere előtt rákérdez, hogy valóban el akarjuk-e végezni. Ez nagyon hasznos, amikor bizonytalanok vagyunk a minta pontosságában.i(ignore case): A keresés kis- és nagybetűkre érzéketlen lesz.I(case sensitive): A keresés kis- és nagybetűkre érzékeny lesz (akkor hasznos, ha globálisan be van állítva az érzéketlenség).e(no error): Nem dob hibát, ha nincs találat.p(print): Kiírja a változtatott sorokat a parancssorba.n(count): Nem végzi el a cserét, csak kiírja, hány egyezést talált.
Példák:
:s/régi/új/ " Az aktuális sorban az első 'régi' szót 'új'-ra cseréli.
:s/régi/új/g " Az aktuális sorban az összes 'régi' szót 'új'-ra cseréli.
:%s/régi/új/g " Az egész fájlban az összes 'régi' szót 'új'-ra cseréli.
:%s/alma/körte/gc " Az egész fájlban az 'alma' szót 'körte'-re cseréli, megerősítéssel.
A Tartományok (Ranges) Ereje
A [tartomány] rész a :s parancsban hihetetlen rugalmasságot biztosít, lehetővé téve, hogy precízen meghatározzuk, hol történjen a csere.
:: Az aktuális sor (ez az alapértelmezett, ha nincs tartomány megadva).:%: Az egész fájl.:N: Az N-edik sor. Például:10s/a/b/ga 10. sorban cserél.:N,M: Az N-edik sortól az M-edik sorig. Például:1,10s/a/b/gaz első 10 sorban cserél.:.,+5: Az aktuális sortól (.) a következő 5 sorig (+5). Például:.,+5s/a/b/g.:'<,'>: Vizuális kijelölés (Visual selection). Ha kijelöltünk egy szövegblokkot, és utána beírjuk a:parancsot, automatikusan megjelenik ez a tartomány. Ez az egyik leggyakrabban használt és leghasznosabb tartomány.:/kezdeti_minta/,/befejezo_minta/: Az első olyan sor, ahol akezdeti_mintaelőfordul, és az első olyan sor, ahol abefejezo_mintaelőfordul, közötti sorokon hajtja végre a cserét. Például:/<body>/,/</body>/s/div/span/gcsak a HTML body tagjei között cserél.:'a,'b: Két megjelölt (markolt) sor között. Használja azmaésmbparancsokat a sorok megjelölésére.
A Reguláris Kifejezések (Regex) Mestersége
Itt kezdődik az igazi varázslat! A reguláris kifejezések lehetővé teszik, hogy összetett mintákat írjunk le, nem csak statikus szövegeket.
Alapvető Regex Karakterek
.(pont): Bármely egyetlen karakterre illeszkedik (kivéve az új sor karaktert).*: Az előtte lévő elem nullaszor vagy többször fordul elő. Példáula*illeszkedik a „”, „a”, „aa”, „aaa” stb. mintákra.+: Az előtte lévő elem egyszer vagy többször fordul elő. Példáula+illeszkedik az „a”, „aa”, „aaa” stb. mintákra.?: Az előtte lévő elem nullaszor vagy egyszer fordul elő (opcionális). Példáulcolou?rilleszkedik a „color” és „colour” mintákra.^: Sor elejére illeszkedik.$: Sor végére illeszkedik.[abc]: Karakterosztály, illeszkedik ‘a’, ‘b’ vagy ‘c’ karakterre.[a-z]: Tartomány, illeszkedik bármely kisbetűre.[^abc]: Karakterosztály, illeszkedik minden karakterre, kivéve ‘a’, ‘b’ vagy ‘c’.<: Szó elejére illeszkedik.>: Szó végére illeszkedik.
Karakterosztályok és Speciális Karakterek
d: Bármely számjegy (0-9).D: Bármely nem számjegy.w: Bármely szókarakter (betű, számjegy vagy aláhúzás).W: Bármely nem szókarakter.s: Bármely whitespace karakter (szóköz, tab, új sor).S: Bármely nem whitespace karakter.b: Szóhatárra illeszkedik.
Magic Módok: v
A Vim reguláris kifejezések alapértelmezett viselkedése eltérhet más regex motoroktól (pl. Perl, Python). Ahhoz, hogy a legtöbb speciális karaktert (pl. `+`, `?`, `|`, `()` ) escape-elés nélkül használhassuk, használhatjuk a v (very magic) jelzőt a minta elején. Ez erősen ajánlott, mert sokkal olvashatóbbá és ismerősebbé teszi a regex írását.
:%s/v(foo|bar)/baz/g " Keresi a 'foo' VAGY 'bar' szavakat, és cseréli 'baz'-re.
" v nélkül így nézne ki: :%s/(foo|bar)/baz/g (sok escape karakter)
Fejlett Cserélési Technikák: Rögzítés és Átalakítás
A reguláris kifejezések igazi ereje abban rejlik, hogy képesek mintákat rögzíteni (capture groups), majd a rögzített részeket felhasználni a csere_szövegben.
Rögzítő Csoportok (Capture Groups)
A zárójelekkel () csoportokat hozhatunk létre egy mintán belül. A csere_szövegben ezekre a csoportokra 1, 2 stb. hivatkozhatunk, attól függően, hogy hanyadik zárójelezett csoportról van szó.
:%s/v(vezetéknév), (keresztnév)/2 1/g
" Ezt cseréli: "Kovács, János" -> "János Kovács"
A & vagy