Vim, a szövegszerkesztés Szent Grálja

avagy a programozók szövegszerkesztője

2016. április 14. - Indie Crawford

Nehéz, de inkább lehetetlen elfogultság nélkül szólni minden szövegszerkesztők ősatyjáról, a programozók kultikus kedvencéről, a digitális világ fölkent papjai által hatalmas becsben tartott vi editorról, illetve modern kori klónjáról a Vimről.

Monthy Python: Szent Grál

Sokaknak persze nem mond semmit ez a név, bár akit az IT-szektor felől fújt a szél blogomra, annak illendő volna ha legalábbis ismerősen csengne. A laikusok számára pedig beszédes lehet, hogy a örök ellenségvel az Emacs editorral vívott epikus harca milyen komoly hagyománnyal bír, vagy, hogy a legtöbb népszerű böngészőre léteznek olyan pluginok melyek a Vim parancsokkal való operálást teszik lehetővé.

Bármely területről érkezzünk is, mindenképp érdemes közelebbről is megismernünk ezt az okos kis eszközt. A vi meghosszabbítja az életet, a vi kitágítja a tudatot, a vi nélkülözhetetlen a szöveges fájlokkal való munkához*. Programkód írásán kívül tökéletesen alkalamas formázott szöveg, vagy szövegesen reprezentált adatsorok, táblázatok, listák, stb. megtekintésére és szerkesztésére.

A Vim kb. úgy viszonyul a sima Notepadhez, mint ökrös szekér a űrhajóhoz, de még a viszonylagosan széles programozói és szövegszerkesztési feladatokat kielégítő Notepad++ felé is csak legyinteni tud, akit egyszer magával ragadott a vele való munka eleganciája és hatékonysága. Ha egyszer ráéreztünk a dolog ízére, már könnyedén megbocsátjuk a meredek tanulási görbét, vagy az olyan apróbb hiányosságokat, amik az első formájában 40 évvel ezelőtt létrejött szoftver esetében fölmerülhetnek. Innentől pedig már csak egy lépés, hogy munkatársaink, vagy barátaink megdöbbenéssel vegyes csodálattal pislogjanak látva, ahogy kezünkkel a billentyűzeten cikázva mágikus rúnákat vetve, a képernyőn lévő szöveg megelevenedik.

Vim a Notepad ellen, mint Arthur király a Fekete Lovag ellen... „Csak egy karcolás!”  (Monhty Python)
Vim a Notepad ellen: „Csak egy karcolás!” via

Mi lehet ilyen különleges egy szövegszerkesztőben? Összeszedtem pár lényegesebb dolgot kedvcsinálónak:

Modalitás

A Vim legegyedülállóbb és egyik legütősebb tulajdonsága a különböző üzemmódokban rejlik melyek közt váltogatva érthetjük el például külön a szerkesztési és a szövegbeviteli funkciókat. Máris megmagyarázom. Elindítva a szerkesztőt, hiába is próbálnánk meg elkezdeni egyből szöveget gépelni, nem az történne ami a legtöbb hagyományos szövegszerkesztő esetében, ugyanis alapból nem szövegbeviteli módban indul a program, hanem úgynevezett normál módba érkezünk. Itt pedig a közvetlen szövegbevitel helyett, a klaviatúrán lévő gombok különböző hasznosabbnál-hasznosabb szerkesztési parancsokat reprezentálnak. Az i gomb segítségével például szövegbeviteli módba válthatunk, ami pont úgy működik, mint a többi szerkesztőnél. Ha végeztünk a bevitellel, alapbeállítások esetén az Esc gomb segítségével léphetünk vissza normál módba, hogy folytassuk a szöveg tulajdonképpeni szerkesztését: precíziós pozicionálást, mozgatást, kivágást, törlést, és ezeknél cifrább dolgokat is.

Eddard Startk Vim mém: One does not simply type text into Vim

Gondoljunk csak bele! Ujjtörő billentyűkombinációk helyett, egy egész billentyűzetnyi 1-2 gombos utasítás áll rendelkezésünkre, sőt, tulajdonképpen egy egész külön kis nyelv is, lásd lejjebb!

Billentyűzet-fetisizmus

Míg egy szokványos szerkesztő esetében egy munkamenet során általában folyamatosan oda-vissza váltakozik figyelmünk az egér és a billentyűzet között (ami igazoltan megakasztja agyunkat, kizökkent minket és lassítja a munkát), illetve a billentyűzetben rejlő potenciálnak csak a töredékét használjuk a Vim hozzáállása egy hatékonyabb és sokak szerint elegánsabb paradigmát követ.

Aki sokat és intenzíven szerkeszt az tapasztalhatta mennyire megkönnyítik ezt egyes gombok(end, home, shift, nyilak, stb..) és billentyűkombinációk(ctrl+c, ctrl+v), hogy csak a legtriviálisabbat említsem), melyek megtanulása ugyan utánajárást igényel, de amint elsajátítottuk használatukat már óriási teljesítménynövekedést, és nem utolsó sorban élvezetesebb munkát eredményeznek.

Ezt a hozzáállást viszi tökélyre többek közt a Vim normál, parancsbeviteli módja. Nem csupán az adott sor elejére, vagy végére, vagy egy-egy karaktert ugrálhatunk egy-egy gomb lenyomásával, a lehetőségeink leírhatatlanul tágabbak ennél. Lépdelhetünk szavanként előre-hátra, azok elejére, vagy végére, mondatonként vagy bekezdésenként, elhelyezhetünk jelölőket amikhez visszaugorhatunk, de akár közvetlenül egy adott sorra is ugorhatunk annak sorszáma segítségével, de léphetünk tetszőleges számú sort, vagy karaktert is, vagy éppen a sorban a következő tetszőleges karakterhez is odaléphetünk mindössze 1-2 gomb lenyomásával. Ez persze csak a lehetőségek szűk kis metszete, de ha a Vim esszenciáját keressük, jó helyen járunk.

Normál mód: A szövegszerkesztés linguee francais-ja

A különböző parancsokat és mozgásokat jelentő gombokat összefűzhetjük. Például a w gomb megnyomásával egy szót ugrik előre a kurzor. De ha elé biggyesztünk egy d betűt, ami a törlést jelenti, máris töröltünk egy szót. De ha két szót szeretnénk törölni akkor írhatjuk azt is, hogy 2dw vagy d2w. Ha sor végéig mindent a vágólapra kívánunk helyezni, akkor a y, vagyis másolás (Vim zsargonban yank) gombot kell a sor végére való mozgás karakterével kombináljuk, ami a $. De másolhatunk tetszőleges következő karakterig, az f(find vagyis keresés), az elérni kívánt karakter és a y kombinálásával. Az f parancsnak szintén megadhatunk egy számot, hogy hányadik találatot szeretnénk elérni. Megjelölhetünk adott pozíciókat egy bizonyos általunk választott karakterrel és aztán ezeket a jelöléseket is felhasználhatunk kombinálva más parancsokkal. De tovább is mehetünk, a különböző operációkat lehetőség van közbeiktatott keresésekkel is kombinálni, például törölni mindent a következő 'xyz' kifejezésig. Keresés alatt pedig nem csak karakter pontos egyezések értendők, létezik a joker-karakterek egy egész önálló nyelve is, de erről kicsit később.

Vim tanulási segédlet, billentyűparancsok
A Vim normál módjának parancsai a billentyűzeten... Impresszív!

Természetesen bármelyik utasítás tetszőleges másik gombra is áthelyezhető. Látható, hogy a normál mód nyelvét elsajátítva, precíz és intim módon léphetünk interakcióba a dokumentumainkkal, anélkül hogy kezünk eltávolodna a billentyűzet középső régiójától.

Parancssor egy gombnyomásra

Történelmi okokból kifolyólag Vim, a szerkesztők közül egyedülálló módon rendelkezik egy saját parancssorral, tehát gombnyomásra a képernyő alján megjelenik egy utasítások begépelésére alkalmas sorocska. Ez a tény pedig az Unix alapú rendszerek világából érkezőket, illetve az IT területen tevékenykedőket egyáltalán nem hagyja hidegen, de az egyszerű felhasználók számára is rengeteg lehetőséget tartogat. Szerkesztési parancsok armadájából válogathatunk, melyeket az egész dokumentumra, vagy csak egy adott részére érvényesíthetünk, de ez koránt se minden. Fájlműveleteket, könyvtárak közötti navigációt ugyanúgy végezhetünk innen, mint több fájl egyszerre való manipulálását, illetve a Vim minden egyes beállítása és parancsa elérhető innen! Szín séma váltása, vagy a dokumentum karakterkódolásának megváltoztatása csak egy parancs távolságra van, elfelejthetjük az almenükben való keresgélést, a beépített help vagy a parancskiegészítés segítségével (tab gomb) gyorsan megtalálhatjuk amit keresünk. Hab a tortán, hogy bármilyen külső, a rendszer számára elérhető parancsot is lehetőségünk van kiadni innen, sőt, a dokumentumunkat (vagy annak egy részét!) mint bemenetet adhatjuk meg a külső parancs számára, amit pedig kidob azt egyből képernyőre irányíthatjuk. Éppen szerkesztett HTML fájlunkat például egy egyszerű utasítás segítségével megtekinthetjük a böngészőben, vagy beírhatjuk a fájlunkba az aktuális pontos időt. Az így kiadott utasítások hozzárendelhetők bármilyen billentyűkombinációhoz, így még egyszerűbben elérhetjük őket a jövőben.

Vágólapok, makrók

Vimben nem csupán egy pőre vágólap fölött rendelkezhetünk, melynek tartalma mindig fölülírodik. Számozott vágólapok, úgynevezett regiszterek tárolják automatikusan az előző 10 másolást vagy vágást, de ezen kívül is lehetőség van az ilyen műveleteknél megadni, hogy melyik nevesített, betűvel jelölt helyen tárolódjon az adott szövegrész, arra az esetre ha nem szeretnénk felülírni az alapértelmezett névtelen regisztert, vagy ha a kivágást sokáig raktározni szeretnénk. Az operációs rendszer kínálta vágólapot is elérjük természetesen és regisztereink használatát preferenciáink szerint maximálisan testreszabhatjuk, illetve léteznek még további izgalmas regiszterek is.

A nevesített regiszterekben nem csak egyszerű szöveget tárolhatunk, de úgynevezett makrókat is. A makrók létrehozása egy rettentő hasznos funkció, ami lehetőséget biztosít egy kiadott parancs-szekvencia rögzítésére és visszajátszására, bele értve a beviteli módban történő gépeléseket, kereséssel történő pozicionálásokat, normál módú parancsokat is. Ez a lehetőség, a normál mód szókincsét figyelembe véve, mérhetetlen munkától tudja megkímélni az embert, főleg ha leíró- vagy programnyelvekkel dolgozik.

Klasszikus szerkesztők tanulási görbéi, félig vicces-félig igaz: Notepad, Pico, Visual Studio, vi, emacs
Klasszikus szerkesztők tanulási görbéi... Nem vicc!

Ha például minden egyes sorban egy bizonyos karaktersorozat elé és mögé oda kell biggyeszteni egy bizonyos másikat, akkor elég benyomni a felvétel gombot, majd végigpörgetni a szükséges utasításokat ügyelve arra, hogy ezek univerzálisan minden sor esetében működjenek, a sorozat végére a következő sorba való ugrás parancsát is rögzítve. Miután leállítottuk, egy gombnyomással visszajátszhatjuk a parancssorozatot és csodálatos módon az aktuális új sorban is megtörténnek a gyakran igen bonyolult módosítások. Ezek után a visszajátszás gomb elé biggyesztett számmal jelezhetjük hányszor szeretnénk újrajátszani a makrót, azaz hány további sort intézzünk el egy szuszra. Nehéz túlbecsülni ezt a funkciót, kiválóan alkalmas például ötven darab link listából való gyors cseréjére!

Persze sokszor egy egyszerű, sorokon átívelő, négyszög alakú kijelölés(!) és az egész kijelölésre érvényesített, de csak egyetlen műveltet igénylő csere is megoldja a dolgot, de ha mégsem akkor mindenképp érdemes a makrókkal kísérletezni, vagy regexet használni, lásd lent!

Regex betárazva

Gondolom nem meglepő ezek után, hogy a keresés funkció szintén egy gombnyomásra van (illetve az ellenkező irányba való kereséssel együtt kettőre, az előző/következő találat gombokkal együtt pedig négyre...). A regular expression, vagyis a reguláris kifejezések kereséseinkbe való beépítése viszont egy olyan, talán nem mindenki számára ismert lehetőség, amit a Vim teljes körűen támogat. Külön cikkeket, vagy inkább egész tananyagot lehetne írni a tárgyban, de a lényeg, hogy a rendszergazdák, programozók, Linux felhasználók számára jól ismert technológia segítségével lehetőség van olyan keresések megadására, melyek nem pusztán teljes karakteregyezés estén produkálnak találatot, hanem szélesebb értelemben vett minták felismerésére is képesek.

A megszokott karakter-egyezésen alapuló keresést olyan speciális jelentéssel bíró karakterekkel kombinálhatjuk, melyekkel képesek vagyunk megtalálni (és cserélni!) egymással akár kevéssé rokon, de mégis valamilyen minta szerint egyező szövegrészeket. Triviális példa, az adott nyitó és záró szövegrészek közötti tetszőleges szöveg megtalálása. De tetszőleges szöveg helyett kereshetünk csak számokat is. Vagy 4 számot egymás mellett. Vagy adott karakterszekvenciát amiben egy-vagy több karakter vagy jelen van, vagy nincs. Nehéz elsőre felmérni ennek a jelentőségét, de olyan funkcióról van szó, ami szintén hatalmas munkát tud levenni a vállunkról, és nélkülözhetetlen ha hosszú, gyakran ismétlődő mintákat tartalmazó szövegről van szó, legyen az adatsor, leíró nyelv, mint a HTML vagy dokumentumformázásra használatos LaTeX avagy programozási nyelv.

A regexp életmentő lehet! via

Testreszabhatóság, szkriptelhetőség

A mindent maximálisan a saját igényeinkhez való igazítás ehetősége nem első sorban az extravagancia kiszolgálására hivatott vezérelv a Vimben. Nem a színek és betűtípusok változtatása az elsődleges szempont, illetve csak annyiban az, amennyiben ezek a hatékonyságot, a felhasználó kényelmét növelik. Azért tudunk mindent maximálisan testreszabni, azért akad mindenre (tényleg mindenre) egy beállítás, azért lehet önálló parancsokat definiálni, illetve tetszőleges gombhoz rendelni minden parancsot, hogy a felhasználó kezében legyen a kulcs a munkafolyamata optimalizálásához.

Némi finomhangolással a Vimben rejlő lehetőségek kihasználtsága rendkívül megnő. A program nem szeretné előre tudni mi a jó nekünk, ránk bízza, illetve el is várja tőlünk, hogy megmondjuk neki mire és hogyan szeretnénk használni. Ez némi utánajárást igényel, amin keresztül jobban meg is ismerjük a szerkesztőt és ami kamatostul megtérül a későbbiekben.

A Vim önálló szkriptnyelvvel is bír, mely természetesen magában foglalja az összes kiadható parancsot és beállítást, és ezeken túl a programozási nyelvek szokványos kellékeit is rendelkezésünkre bocsátja. Ennek és a felhasználók vagyis a szoftverért már-már fanatikusan rajongó „hívők” közösségének köszönhetően, sok ezer Vimscript várja a neten, hogy fölfedezzük. Színsémákon, szerkesztési segédleteken, fájl-böngészőkön keresztül vezet az utunk az extrémebb dolgok felé, mint amilyen például a Vimre írt email- vagy IRC-kliens. Akadnak köztük igen hasznosak és ötletesek is, érdemes alaposan körülnézni, és persze ha valamilyen spéci funkcionalitásra lenne szükségünk bármikor összeüthetjük magunknak!


Vicces mém: Vim igehírdetés
Hát igen...

A fentiekkel éppen, hogy csak érintettük a lehetőségek felszínét, és ennél még sokkalta többet rejt magában ez a nagyszerű szoftver. Bár megtanulása időt és energiát igényel, használata egyre élvezetesebbé válik ahogy előrehaladunk vele, újra és újra elkápráztatva minket egy-egy addig ismeretlen lehetőséggel. Majd eljön az a pont, amikor mindenféle szerkesztési feladatunkat (és nem is csak azokat) a Vim-féle módon szeretnénk végezni, hiszen annyival fejlettebbnek és szórakoztatóbbnak tűnik, mint a szokványos metódus. Szerencsére némi utánajárással erre általában van is lehetőség. Természetesen eredeti formájában ez a bejegyzés is Vimmel íródott, én ugyan közvetlenül a szerkesztőt használtam, de olyan böngésző plugin is akad, amivel a webes szövegbeviteli dobozokat is vimesíthetjük..

Összegyűjtöttem néhány linket azok számára akiknek meghoztam a kedvét a progi kipróbálásához, és a vimtutor program futtatása(!) után többre szomjaznak. Természetesen várom a tapasztalatokat, tippeket kommentek formájában is!

A bejegyzés trackback címe:

http://indiecrawford.blog.hu/api/trackback/id/tr128576550

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben.