Tacsiazuma
Tacsiazuma A letscode.hu alapitója, több, mint egy évtized fejlesztői tapasztalattal. Neovim függő hobbi pilóta.

Kalandozások Vimmel

Kalandozások Vimmel

A szokásostól eltérő bejegyzés következik tőlem, mert ennek most nem feltétlenül a tudás átadása a célja, mintsem inkább egy kis történet, vagy épp folyamat megosztása. Ez a folyamat pedig nem más, mint a Vim szerkesztő elsajátítása, már amennyire egyelőre annak lehet nevezni, kb. két hét után. De ne rohanjunk ennyire előre, kezdjük az elején. Az már köztudott, hogy a Vim tanulási görbéje igencsak meredek.

![Post image](https://i.redd.it/iwnxj554bng41.png)
Vim tanulási görbe egy kis typoval fűszerezve

Ezért, habár korábban voltak is nagyon rövidke próbálkozások, valahogy hiányzott az elhatározás mögüle és emiatt igen korán feladtam. A legutolsó löket egy slackes beszélgetéssel indult, ahol valaki belinkelt egy cikket arról, hogy valaki lecserélte a PHPStormot a Vimre. Na itt már én is felkaptam a fejem, ugyanis a JetBrains termékek rendkívül megkönnyítik az életem és ha valaki ezeket is eldobja, akkor az már valamit jelenthet. Nem szándékozom összehasonlítani a két szoftvert, ezt mindenki maga eldöntheti majd. Részben magamra ismertem a cikkben, mert az írója sem tíz ujjal gépelt (ez nálam kb. 5-6 volt) és a Vim tanulását egy kis tízujjas gyakorlással egybekötve ajánlotta. Ezt meg is fogadtam, a keybr.com-on neki is láttam leszoktatni magamat erről a “rossz” szokásról, ami azóta is tart, hiszen két hét alatt nem fogjuk megváltani a világot és több évtizednyi izommemóriát nem könnyű legyűrni.

Elvárások

Mégis mit vártam tőle? A legtöbbet használt funkciókat modern IDE-kből. Autocomplete, automatikus import, autoformat, fordítási hibák jelzése, könnyű refaktor, valami gyorskeresőt, snippetek, git integráció, tesztek futtatása.. tehát igazából az alapokat. Vajon tudja ezt egy “egyszerű” szerkesztő? Természetesen ha csak ezeket tudja, akkor még mindig kérdés, hogy miért éri meg váltani, hiszen nem fog valaki hónapokat tölteni azzal, hogy elsajátítson egy új eszközt, csak azért, hogy pontosan ugyanannyira legyen produktív, mint előtte. Le akartam szokni az egérhasználatról is, hiszen minden alkalommal, amikor kinyúl az ember érte, egy apró törést okoz. Na meg úgyis ott van előttem a billentyűzet, hát miért ne tudnám megtenni ott? Nos Vimben kb. MINDENT meg lehet oldani csak a billentyűzet segítségével, amit pedig nem tud alapból, vagy éppen pluginek segítségével, arra ott a vimscript, amivel mi is tudunk mindenfélét hozzáadni.

A Vim cheatsheet amúgy igencsak ajánlott, kinyomtatva az asztalon, vagy ami mégjobban segít, minden napra egy parancsot kiszemelni és azt gyakorolni, még ha nincs is rá szükség, hogy rögzüljön.

Amikor az ember cikkeket olvas a Vimről vagy éppen videókat néz róla, akkor szinte sosem azt látja, mint amit az első telepítéskor/megnyitásakor. A Vim alapból is rengeteg mindent tud, de ami igazán naggyá teszi, azok a pluginek. Ezekkel teletűzdelve fogunk leginkább vele találkozni. Aztán alig várjuk, hogy mi is kipróbáljuk az adott témát/betűtípust/plugint vagy bármi mást.

![](assets/uploads/2020/03/29114711/2020-03-29_11-45-1024x571.png)
Vim darcula témával és egy jópár pluginnel, még az unused importot is jelzi a 6. sorban.
![](assets/uploads/2020/03/29114722/2020-03-29_11-46-1024x559.png)
Ahogy az ember találkozik vele először

Először a sima Vim 8.x verziójával próbálkoztam, különböző cikkekből összeollózva a dolgokat. Később ezt lecseréltem a neovimre, mert könnyebb volt összelőni bizonyos pluginekkel. A konfigurációs fájl, amit szinte mindenhez piszkálni kell az a home mappánkban levő .vimrc, ami alapból nem is létezik. Ebbe kell felvennünk plugineket, azok beállításait és még sok mást. A pluginmenedzsmenthez a Vundle-t használtam, amit egy sima git clone segítségével telepítettem.

Még nem jutottam el arra a szintre, hogy olyan szépen rendezett vimrc fájlom legyen, mint azoknak, akik bátran osztják meg a sajátjaikat githubon, de valamennyire próbálom rendszerezni mindezt, mert ha tényleg leváltom a korábban használt IDE-t, akkor szinte ez lesz az egyik legfontosabb konfigurációs fájl, amit az évek során szerkesztgetek és magamal hurcolok majd. Nem is hittem volna, hogy ennyi mindent testreszabok majd menet közben, ami nem tetszik vagy éppen jobb lenne, ha másképp működne. Az egyik igen gyakran használt billentyű pl. az Escape, ami igencsak kiesik, ezért az a szokás, hogy egy másik kevésbé használt billentyűt mappelnek rá. Nálam se volt ez másképp, a Caps Lock jutott erre a sorsra, amit linuxon az alábbi módszerrel oldottam meg a terminálból:

dconf write "/org/gnome/desktop/input-sources/xkb-options" "['caps:escape']"

Ugyanerre Macen a Karabiner-Elementset használtam, így a Caps Lock ott is az Escapet jelenti. Mondanom sem kell, azóta kevesebbet is ordítozok a neten. Ha már az escapenél járunk, akkor itt meg kell jegyezni azt is, hogy a neovim terminál kezelésével is voltak bajaim, mert az alap Escape ott nem lépett ki Normal módba, így a .vimrc-ben a következő sorral oldottam meg, hogy amennyiben a terminál az aktív ablak, az Esc leütése igazából egy Ctrl-\-t követő Ctrl-N legyen.

:tnoremap <Esc> <C-\><C-n>

Furcsa, de már két hét után a vim-ből használt billentyűkombinációkat használnám a navigációra még itt a wordpress kezelőfelületén is. Apropó navigáció: ha már elindultam a mouseless irányba, letöltöttem egy böngészőplugint is, a Vimiumot, aminek segítségével a Vimből már ismert billentyűkombinációk segítségével tudok navigálni az oldalon. Innen az F billentyű az egyik leghasznosabb, ugyanis azzal ki lehet emelni azokat az elemeket az oldalon, amikkel interakcióba lehet lépni és billentyűkombinációkat rendel hozzá, amiket leütve rá tudunk bökni, mindezt egér nélkül.

![](assets/uploads/2020/04/04163310/image-1024x604.png)
Egy github commit részletezése, Vimium pluginnel, az F billentyű lenyomása után.

Természetesen ha éppen egy input mezőben vagyunk, akkor a legtöbb billentyűkombináció inaktív, hiszen akkor beszélgetés közben ide-oda ugrálnánk az ablakok/tabok között.

Jelen állapot

Na de hol járok most az eddigiekkel?

Autocomplete? ✅

A CoC nevű plugin, ami Node.Js alapú, a kiegészítőin keresztül lehetőséget biztosít kódkiegészítésre számos program és leírónyelvhez, mint pl. PHP, Java, CSS, Vue és még sorolhatnám. Ha a coc-java kiegészítő le van töltve és be van kapcsolva, akkor az első Java fájl megnyitásakor tölti is le a Java language servert és már indítja is.

Autoformat ✅

Az autoformat plugin segítségével megoldható, sőt itt már ki is egészítettem, hogy hasonlóan működön, mint az IntelliJ, tehát ne csak a fájlokat formázza meg, hanem pl. a nem használt importokat is törölje, mindezt az F3 lenyomására:

noremap :exec 'UnusedImportsRemove'<bar>Autoformat<CR>

A fenti formatter egyébként külső programokat használ, pl. Java esetében az astylet.

Fordítási hibák jelzése ✅

Az A.L.E. plugin segítségével ez is megoldható. Sőt, nem csak a fordítási, de pl. a Checkstyle és PMD is bekonfigurálható. Ez pedig még nem minden, könnyen beköthetjük egy billentyűkombinációra, hogy amit tud ezekből meg is fixáljon automatikusan.

Snippetek

Ki ne gondolná, de erre is van plugin, aminek a segítségével tudunk különböző fájlkiterjesztésekhez rövidítéseket és hozzájuk snippeteket rendelni.

Gyorskereső ✅

Itt igazából két plugint is megemlítenék, az egyik a fájlok tartalmában, a másik pedig azok nevében keres.

![ctrlp](https://camo.githubusercontent.com/0a0b4c0d24a44d381cbad420ecb285abc2aaa4cb/687474703a2f2f692e696d6775722e636f6d2f7949796e722e706e67)
CtrlP plugin, amivel gyorsan tudunk fájlrendszerben, megnyitott és gyakran használt fájlokban keresni
![](assets/uploads/2020/04/04175654/image-1-1024x540.png)
Ack.vim plugin, amivel az ack programot tudjuk vimből használni és navigálni a találatok között

Git integráció

Itt megint két plugint említenék meg. Az egyik a git parancsokra, diffelésre, logokra, blamere jó, míg a másik a többi editorhoz hasonlóan jelzi a módosításainkat az adott fájlban a repositoryhoz képest.

![https://raw.githubusercontent.com/airblade/vim-gitgutter/master/screenshot.png](https://raw.githubusercontent.com/airblade/vim-gitgutter/master/screenshot.png)
vim-gitgutter plugin, a sorszámozás mellett láthatóak a változások

Tesztek futattása

Erre a vim-test plugint és a vim-dispatchet használom. Ez pl. a Ctrl-T billentyűkombinációra van nálam kötve, ami lefuttatja az adott fájlban taláhlató teszteket. Persze ez is egyéni preferencia kérdése, mert le lehet futtatni teszteket név alapján, a kurzorhoz legközelebb levőt és… sorolhatnám. Itt is van egy kis extra konfigurációm a .vimrc-ben, hogy jobban igazodjon az én igényeimhez. Itt arra gondolok, hogy akadnak olyan integrációs tesztek a projektben, amik suiteban futnak és a suite elején indul a hozzájuk tartozó MySQL, így önállóan nem futtathatóak. Ehhez már kis vimscriptet is kellett írjak.

Refaktorálás

Ez az, amit még nem próbáltam ki, de elvileg erre is ott a plugin. Mivel még nem értem a történet végére, ezért lehet még ez is változik és azt is természetesen megírom.

Mit is látok eddig? Munkás, de megéri. Olyan, mintha kaptam volna valami új kütyüt, amit lehet ide-oda tekergetni. Nulláról indulva hetek kellenek ahhoz, hogy valaki ugyanolyan produktív legyen vimben, mint egy modern IDE-ben (már ha azt kellően kihasználta, ha nem, akkor lehet hamarabb is eljön ez az idő). Nem is ajánlom senkinek, hogy rögtön valami szoros határidős projekt mellett kezdje el ezt a munkahelyén használni. Egyelőre én is szabadidőmben tweakelem, ahogy felmerülnek az új és új ötletek, amiket még lehetne benne csinálni és fokozatosan viszem be az éles fejlesztésbe.

Persze itt tovább lehet menni, hogy méginkább elszakadjunk az egértől. Itt jön képbe pl. az i3 ablakkezelő (vagy macre az Amethyst, bár az közel sem tud annyit), amivel szintén billentyűkombinációk segítségével lehet navigálni és feladatokat végezni. Ezt speciel még nem tettem fel, mert hirtelen nagy ugrás lenne, ha ezt is beiktatnám a napi tanulási folyamatba, de ha már biztosabbnak érzem magam vimben, akkor jöhet ez is.

![](https://i3wm.org/screenshots/i3-9.png)
i3 ablakkezelő akcióban, git log, vim és egy médialejátszó

comments powered by Disqus