Ü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
: Asubstitute
parancsot 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:s
parancs csak az első egyezést cseréli le egy sorban. Ag
jelző 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/g
a 10. sorban cserél.:N,M
: Az N-edik sortól az M-edik sorig. Például:1,10s/a/b/g
az 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_minta
előfordul, és az első olyan sor, ahol abefejezo_minta
előfordul, közötti sorokon hajtja végre a cserét. Például:/<body>/,/</body>/s/div/span/g
csak a HTML body tagjei között cserél.:'a,'b
: Két megjelölt (markolt) sor között. Használja azma
ésmb
parancsokat 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?r
illeszkedik 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