Hlavní navigace

Editor Vim efektívnejšie

Pavel Ťavoda 12. 2. 2008

Pri sledovaní niektorých používateľov pri práci s editorom Vim mám niekedy pokušenie upadnúť do mdlôb. Na druhej strane mi je jasné, že veľa ľudí má chybné návyky, pretože im nemal kto ukázať efektívnejšiu cestu. Nakoľko tento editor využívam už viac ako 12 rokov, myslím, že sa môžem podeliť o niekoľko rád.

Úvod

Preskočíme časti pre začiatočníkov, pretože takýchto tutorialóv je dosť a históriu si môžete naštudovať z iných zdrojov. V tomto článku by som chcel poukázať na niektoré bad practice, ktoré som pri používaní editora Vim videl, prípadne by som rad predviedol zaujímavé vlastnosti editora.

Vim je editor pre profesionálov, ktorí sa každodenne potýkajú s kvantami textu. Či už sami musia veľa písať alebo upravujú veľké množstvo textu. Ak potrebujete raz do týždňa upraviť nejaký konfiguračný súbor alebo odmazať nejaký stĺpec v logu, tento článok nie je pre vás. Ak ale máte záujem proste sa ponoriť do ergonomického neba prevereného časom, ste vítaný.

Rád by som upriamil vašu pozornosť na jeden dôležitý cieľ, prečo Vim vznikol. Je to efektívnosť pri písaní a upravovaní textu. Tento atribút stál na začiatku pri vzniku editora Vi a myslím, že dodnes sa mu to darí dodržiavať. Nakoľko ale Vi bol tak iný než iné editory, bol po čase upravený tak, aby ho mohli používať aj ľudia, ktorí nemusia dve hodiny študovať manuál, aby z neho vedeli aspoň odísť. To ale zároveň ubralo aj niektoré veľmi efektívne prvky a ľudia namiesto aby sa to naučili používať poriadne, to robia cez obkľučky.

Všeobecné používanie

Písanie

Ak si chcete hovoriť Vim profesionál musíte sa naučiť písať desiatimi. Ináč to nemá zmysel. Existuje viacero programov, pomocou ktorých sa dá naučiť celkom slušný prstoklad aj za mesiac. Táto investícia sa vám iste veľmi skoro vráti.

Módy

Ako vieme, editor Vim má niekoľko módov. Veľa ľudí pracuje v insert móde bez toho, aby z neho vychádzalo. Pomocou šipiek a pohybu po stránke sa nastavia tam, kde potrebujú a tam buď niečo zmažú, alebo pridajú podľa potreby. To je typický „bad practice“. Obvykle by ste mali byť v tzv. normal móde, kde jednotlivé písmenká neslúžia na písanie, ale na pohybovanie sa po texte. Po vykonaní každej operácie sa vždy vráťte do normal módu, obvykle stlačením ESC. Ak máte problém s klávesou ESC, že je ďaleko, premapujte si CAPSLOCK na ESC.

Nehýbte rukami

Ak sa už naučíte písať desiatimi a používať módy, zistíte, že nemusíte presúvať ruky ani na šípky. Váš pracovný priestor je obmedzený na alfanumerickú časť klávesnice. Toto veľmi zrýchli vašu prácu. Presúvanie celej ruky je nesmierne časovo náročné. Pre základný pohyb používajte písmenká hjkl, ktoré sú iba o jeden znak ďalej než je home position vašej pravej ruky. Oveľa efektívnejšie sú ale iné príkazy na pohyb, o ktorých píšem nižšie.

Naučte sa počítať

Skoro každý príkaz vo Vim má číselný prefix, ktorý znamená, koľkokrát sa má daná operácia zopakovať. Krátky príklad. Ak chcete zmazať 4 riadky textu, existuje viac spôsobov, ako na to. V zápale práce to môžete napríklad vyriešiť pomocou dd… alebo Vjjjd. Najefektívnejšie je ale 4dd. Chce to znovu trochu mentálneho cvičenia, ale viac sa oplatí najprv premýšľať a až potom konať. Toto je zároveň filozofický dopad používania editora Vim na bežný život. No a čo už môže byť efektívnejšie na napísanie pekného oddeľovača na šírku 80 znakov 40i-o.

Vertikálny pohyb po texte

Vyskúšajte si príkazy H (shift H), L a M. Pohybujú po obrazovke kurzorom. H – Home/High, M – Middle, L – Last/Low. Príkaz zz zaskroluje riadok, na ktorom stojíte, do stredu obrazovky. Veľké G skočí na posledný riadok textu a gg alebo 1G na prvý riadok.

Horizontálny pohyb po texte

Zabudnite na šipky alebo pohyby po jednotlivých znakoch h a l. Okrem tradičných kláves ako sú h, l, w, e, $, 0, ^… existuje jedna veľmi efektívna forma horizontálneho pohybu. Príkazy f a t. Tento príkaz očakáva ďalší znak, ktorý má na riadku vyhľadať. Napríklad chceme text:

Lorem ipsum (kkkk dddd ffff gggg)

zameniť za:

Lorem ipsum (uiui)

pričom kurzorom stojíme na prvom písmenku vety veľkom L.

Teraz si popíšme ako na to:

  • f( – presun na prvú zátvorku – Find (
  • l – posun o jeden znak doprava
  • ct) – zameň text až po další apostrof – Change To )
  • uiui<ESC> – text, ktorý sme chceli doplniť, a návrat do normal módu

Príkaz f{znak} robí vyhľadanie {znak} doprava. Príkaz F{znak} robí vyhľadanie doľava. t{znak} skočí pred {znak}, vyhľadanie sa robí doprava. T{znak} pred {znak}, vyhľadanie sa robí doľava. Príkaz ; zopakuje posledný príkaz f, F, t, T. Príkaz , zopakuje posledný príkaz, ale opačným smerom. Drobné upozornenie, ak použijete príkaz t napríklad ako t. čo vyhľadá najbližšiu bodku vpravo a umiestni kurzor pred ňu: pri stláčaní ; sa akoby nič nedeje, ale to je iba očný klam, pretože sa nájde najbližšia bodka, čo je tá, pred ktorou stojíte, a kurzor sa vráti o jeden znak doľava, čo je miesto, kde práve stojíte.

Vyhľadávanie

Často sa zabúda na veľmi efektívny spôsob vyhľadávania textu. Ak chcete nájsť rovnaké slovo, na akom práve stojíte, môžete použiť na vyhľadanie dopredu a # na vyhľadanie spätne. Potom môžete použiť štandardné n a N na nájdenie ďalšieho alebo predchádzajúceho výskytu. Pozor, vyhľadávajú sa celé slová. Ak chcete vyhľadávať aj podčasť, použite g alebo g#. Ak sa chcete vrátiť na predchádzajúce miesto pred skokom (po príkazoch skoku n, N, G, gg, *, # a ďalších :help jump-motions), použite CTRL-o a späť na novšiu pozíciu CTRL-i alebo TAB (samozrejme v normal móde).

Prechod do edit módu

Základné príkazy na prechod do edit módu poznáte i insert, a append, c{pohyb} change. Existujú ďalšie efektívne príkazy ako pracovať s textom. Napríklad A začne pridávať na koniec riadku nech stojíte kdekoľvek. V podstate je to náhrada za $a. C zamení všetok text od polohy kurzora až po koniec riadku (náhrada za c$). I skočí na začiatok riadku a vojde do insert módu (náhrada za ^i). Pomocou D zmažeme text od polohy kurzora až po koniec riadku (náhrada za d$).

Odsadzovanie

Počas písania programov sa dosť veľa odsadzuje text a mení veľkosť odsadenia. V normal móde sa to dá jednoducho pomocou >> alebo <<, ale ide to aj bez toho, aby ste odchádzali od písania kódu v insert móde pomocou <CTRL>t a <CTRL>d.

Clipboardy

Vo Vime máte 26 clipboardov. Keď potrebujete prechádzať cez viaceré súbory a potrebujete nejaký text nahrádzať rôznymi textami, natiahnite si tieto texty do clipboardov napríklad A, B, C. Pomocou vyhľadávania / môžete prechádzať po jednotlivých výskytoch a vkladať texty, ktoré potrebujete z registrov. Do registrov sa vkladá pomocou „{pismenko}y a vyberá pomocou “{pismenko}p alebo "{pismenko}P. Obsah registrov si môžete pozrieť pomocou :reg.

Ešte existuje jedna užitočná skratka. Keď ste v insert móde, použite <CTRL>r{pismen­ko}, to vloží na miesto, kde máte kurzor, obsah registra {pismenko}. Má to jednu veľkú výhodu. Celý príkaz, a to napríklad zámena textu, pridanie obsahu clipboardu a ešte nejaká úprava, sa zapamätá ako jeden príkaz. Príkaz opakovania posledného príkazu . potom urobí všetky tieto akcie.

Napríklad potrebujeme v celom texte vyhľadať zátvorku a podľa uváženia nahradiť jej obsah textom Odkaz: a pridať obsah registra A. Urobíme:

  • gg – prejdeme na začiatok textu
  • /(/e+1<Enter> – nájdeme prvú zátvorku tak, aby sa kurzor postavil za zátvorku, môžete použiť aj /(\zs<Enter>
  • ct) – dáme nahradiť text až po pravú zátvorku a prejdeme do insert módu
  • Odkaz:  – text, ktorý sme chceli pridať
  • <CTRL>ra<ESC> – vložíme obsah registra A a ukončíme insert mód
  • n – nájdeme ďalší výskyt zátvorky, opakujeme príkaz n až pokiaľ nenájdeme taký text, ktorý chceme nahradiť
  • . – zopakujeme posledný príkaz, urobí sa všetko od ct( až po <ESC>

Textové objekty

Myslím že vo verzii 5 sa objavili tzv. textové objekty. Slúžia v podstate na to isté, na čo slúži {pohyb} pri rôznych príkazoch. Ak napríklad chcete zmeniť slovo, na ktorom stojíte kurzorom, musíte prejst na jeho začiatok napr. pomocou b a potom spustiť change word príkazom cw. Ak sa vám nechce hľadať začiatok slova, môžete použiť caw, čo znamená „change a word“. Pre slová to možno nie je až tak zaujímavé, ale takýmto spôsobom sa dajú označovať vety, odstavce, obsahy zátvoriek a programové bloky.

Ak stojíte napríklad kdekoľvek vo vete môžete celú vetu zmazať pomocou das, čo je „delete a sentence“. Alebo ak stojíte kdekoľvek vnútri zátvoriek, môžete ich obsah natiahnuť do clipboardu pomocou ya( alebo yi(, pričom ya( zoberie aj zátvorky a yi( zoberie vnútro. V obidvoch prípadoch sa korektne dodržujú vnorené zátvorky. Ostatné druhy blokov si doštudujte v podsekciách :help aw. Predchádzajúci príklad so zamenením:

Lorem ipsum (kkkk dddd ffff gggg)

na:

Lorem ipsum (uiui)

Môžete urobiť efektívnejšie pomocou cib, čo je „Change Inner Block“. Celý postup potom môže vyzerať ako f(cibuiui<ESC>.

Editovanie makra

Nahrávanie makra sa robí pomocou q{pismenko}, pričom {pismenko} je názov registra, kam sa makro odloží. Makro sa ukončuje pomocou q. Makro potom spustíte cez @{pismenko}, @@ zopakuje posledné makro. Málokto ale vie, že makro môže aj editovať, nakoľko sa vlastne nahráva do registra. Urobíme si makro, ktoré na riadku, na ktorom stojíme, zoberie počiatočné číslice, okopíruje o riadok nižšie a zinkrementuje číslicu. Úvodný text:

1. AAaa
BBbb
CCcc
DDdd
EEee

Kurzor stojí na číslici 1 v normal móde:

  • qq – spustíme nahrávanie makra
  • 0 – prejdeme na začiatok riadku, pre istotu
  • yaw – dáme čislicu do clipboardu
  • j – prejdeme o riadok nižšie
  • P – vložíme obsah clipboardu
  • <CTRL>a – zinkrementujeme číslo
  • a.<SPACE><ESC> – pridáme text
  • q – ukončenie makra
  • @q – spustíme makro

Po troch opakovaniach máme text:

1. AAaa
2. BBbb
3. CCcc
4. DDdd
EEee

Teraz si makro upravíme. Prejdeme na čistý riadok (napr. Go<ESC>) a vyberieme obsah registra Q "qp. Dostaneme niečo ako:

0yawjP^Aa. ^[

Znak ^A znamená <CTRL>a a ^[ znamená <ESC>. Upravíme makro tak aby inkrementovalo číslicu 2 krát. Postavíme sa na znak P v makre (FP) a urobíme a<CTRL>q<CTRL­>a<ESC> (<CTRL>q je to isté ako <CTRL>v v unixe ale <CTRL>v vo Windows nefunguje, <CTRL>q v obidvoch). Znovu natiahneme celé makro do registra Q pomocou 0"qy$. Postavíme sa na riadok, ktorý má teraz prefix 4. (CTRL-o) a spustíme makro @q. V ďalšom riadku by sa mala objaviť číslica 6.

Editovanie príkazového a vyhľadávacieho módu

Príkazy, ktoré ste spúšťali v command móde (:), môžete otvoriť v separátnom okne pomocou q: a všetky vyhľadávania pomocou q/. V týchto oknách potom môžete editovať príkazy alebo vyhľadávania pomocou štandardných príkazov editora.

Doplňovanie

Pri písaní kódu alebo HTML často potrebujete používať rovnaké názvy funkcií alebo štýlov. Proste nejaký text, ktorý ste už niekde napísali. Vojdite do insert módu, napíšte zopár prvých písmen požadovaného slova a na doplnenie z práve editovaného súboru použite CTRL-xCTRL-n. Ak je takých slov viac, môžete po nich prechádzať stláčaním CTRL-n a CTRL-p. Rovnaký princíp sa dá použiť na dopĺňanie mien súborov CTRL-xCTRL-f alebo tagov CTRL-xCTRL-]. Detaily nájdete v :help ins-completion.

Blbôstka na záver

Pri programovaní sa občas hodí okopírovať znaky nad alebo pod miestom kde práve píšete. V insert móde stačí na okopírovanie znaku nad kurzorom stlačiť <CTRL>Y a z riadku pod kurzorom <CTRL>E.

Zopár nastavení

Tabulátory

Mám rád keď si môže každý nastaviť svoju vlastnú šírku tabulátorov. Ja mám rád šírku 3. Urobíte to nasledovnými nastaveniami najlepšie priamo v ~/.vimrc.

set ts=3 sw=3

Ak potrebujete existujúci súbor s medzerami prerobiť na tabulátory, môžete použiť príkaz :retab! N, kde N je počet medzier, ktoré symbolizujú TAB v existujúcom súbore. Pozor, tento príkaz prestaví ts na hodnotu N.

Vyhľadávanie

Nasledovné nastavenia zabezpečia vyhľadávanie v texte počas písania a zobrazenie všetkých miest, kde vyhľadávaný reťazec matchuje.

set incsearch hlsearch

Ak chcete vypnúť označené nájdené texty, použite :nohl. Treba spomenúť aj premenné, ktoré ovplyvňujú sensitivitu na veľkosť písmen. Slúžia na to dve premenné ignorecase a smartcase. Tie si môžete nastaviť vo ~/.vimrc, ale ak chcete dočasne prepnúť na iný typ case sensitivity, môžete to urobiť rovno vo vyhľadávacom reťazci pomocou \c – ignorecase a \C – case sensitive. Do vyhĺadávania napríklad zadáte /\cfoo.

Scrollovanie

Pre lepší prehľad v texte si môžete nastaviť premennú scrolloff, ktorá zabezpečí, že pri scrollovaní zostane viditeľných aspoň N riadkov medzi kurzorom a okrajom okna.

set scrolloff=2

Zobrazenie skrytých znakov

Pre zobrazenie skrytých znakov ako sú medzera, tabulátor a koniec riadku môžete do ~/.vimrc pridať nastavenie premennej listchars a potom zobrazenie alebo skrytie môžete robiť počas práce v editore cez :set list:set nolist.

set listchars=tab:>-,eol:$,precedes:>,trail:_

Záver

Ja som si samozrejme za dlhé roky práce vybudoval svoje vlastné čudné spôsoby práce s Vimom. Takže napríklad na koniec riadku nechodím cez $, ale zásadne pomocou A<ESC>. Na začiatok riadku pomocou 0 a nie ^, lebo je to jednoduchšie (aj keď 0 nerobí presne to isté ako ^). Využívam makrá aj na miestach, ktoré sa dajú riešiť pomocou regulárnych výrazov, ale zaručujem vám, že tie regulárne výrazy by boli veľmi dlhé. Použitie makier je obzvlášt výhodné, keď úpravu potrebujete aplikovať iba na určitých miestach. Vtedy sú makrá najľahší spôsob, ako to urobiť.

Tímto odstavcom som chcel iba povedať, že vo Vime existuje veľa ciest, ako dosiahnuť cieľ. Občas sa ale treba zamyslieť, či neexistuje jednoduchšia cesta, a prinútiť sa používať ju. Obvykle treba viac rozmýšľať a menej písať, čo je pre mozog úplne prirodzené a preto sa vám to vráti v efektivite a rýchlosti práce.

Ak nie je vaša pozornosť odpútavaná prechodom rúk na šípky, do menu, na myš a naspäť na klávesnicu, rozmýšľaním a prekladaním toho, čo v hlave chcete urobiť, na to, ako to urobiť v editore, môžete sa plne zamerať na prácu, a to v plnej rýchlosti, akou dokážete rozmýšľať. Po určitom čase práce s Vimom sa, dúfam aj vďaka zásadám, ktoré boli spomenuté na začiatku tohto článku, hlavne o pohybe rúk, dostanete do zvláštneho mentálneho stavu, kedy text, ktorý tvoríte na obrazovke, je akýmsi automatickým obrazom toho, čo máte v hlave, a úpravy, ktoré vykonávate s textom bez rozmýšľania, prechádzajú z hlavy na obrazovku. Veľa skúsených Vimkárov tento pocit pozná a preto sa stávajú závislými na tomto editore. Ľudia ktorý tento zážitok nepoznajú, sa vždy čudujú, ako je vôbec možné takýto hrozný editor používať.

Myslím že do diskusie pripojíte zopár vlastných rád. Ak vás článok zaujal, môžem pripraviť niekoľko pokračovaní, pretože editor Vim je velmi komplexný.


Ing. Pavel Ťavoda je konzultantom spoločnosti Factory4Soluti­ons.

Anketa

Chcete víc tipů pro Vim?

Našli jste v článku chybu?

12. 2. 2008 10:54

uživatel si přál zůstat v anonymitě

K tej uprave Lorem ipsum.... Ja osobne na editaci vnitrnich casti zavorek (...), {...} a [...] pouzivam sekvenci cib nebo ci( a ci[ a ci{ (misto oteviracich jdou pouzit i zaviraci zavorky). Vyhoda je, ze se kurzor muze nachazet kdekoliv uvnitr bloku a smaze se cely obsah bloku (nechaji se pouze zavorky - to to "i" jako inner) nebo misto "i" pouzit "a", napr. ca( , coz vymaze kompletne cely blok i se zavorkami. Taky docela urychlujici. A ted jsem si vsimnul, ze tohle je zminovany v casti "textove…

12. 2. 2008 7:47

Tak tohle je pro mě nejpřínosnější článek na rootu všech dob! Všechny ostatní články (návody, tutoriály, eng+cz, je jich mraky) o vimu (vč. těch v archivu rootu) jsou na jedno brdo: "pohyb hjkl, visual mód v,V, ...". Čekal sem něco podobnýho i tady, ale do konce článku sem žasnul nad každým odstavcem.

Jenom kdyby to tak šlo sloučit s editorama v různejch idečkách. Přece jenom když děláte třeba enterprise Javu, spousta funkcí co nabízí idečka je neocenitelná. Pro IntelliJ IDEA sice exi…

Lupa.cz: Proč firmy málo chrání data? Chovají se logicky

Proč firmy málo chrání data? Chovají se logicky

DigiZone.cz: ČRo rozšiřuje DAB do Berouna

ČRo rozšiřuje DAB do Berouna

Podnikatel.cz: K EET. Štamgast už peníze na stole nenechá

K EET. Štamgast už peníze na stole nenechá

Lupa.cz: Propustili je z Avastu, už po nich sahá ESET

Propustili je z Avastu, už po nich sahá ESET

Podnikatel.cz: Přehledná titulka, průvodci, responzivita

Přehledná titulka, průvodci, responzivita

Podnikatel.cz: Babiše přesvědčila 89letá podnikatelka?!

Babiše přesvědčila 89letá podnikatelka?!

Vitalia.cz: „Připluly“ z Německa a možná obsahují jed

„Připluly“ z Německa a možná obsahují jed

Vitalia.cz: Baletky propagují zdravotní superpostel

Baletky propagují zdravotní superpostel

Lupa.cz: Teletext je „internetem hipsterů“

Teletext je „internetem hipsterů“

Vitalia.cz: Chtějí si léčit kvasinky. Lék je jen v Německu

Chtějí si léčit kvasinky. Lék je jen v Německu

Vitalia.cz: Jsou čajové sáčky toxické?

Jsou čajové sáčky toxické?

Vitalia.cz: To není kašel! Správná diagnóza zachrání život

To není kašel! Správná diagnóza zachrání život

DigiZone.cz: Sony KD-55XD8005 s Android 6.0

Sony KD-55XD8005 s Android 6.0

Lupa.cz: Google měl výpadek, nejel Gmail ani YouTube

Google měl výpadek, nejel Gmail ani YouTube

Měšec.cz: Finančním poradcům hrozí vracení provizí

Finančním poradcům hrozí vracení provizí

Vitalia.cz: Říká amoleta - a myslí palačinka

Říká amoleta - a myslí palačinka

Podnikatel.cz: Prodává přes internet. Kdy platí zdravotko?

Prodává přes internet. Kdy platí zdravotko?

Měšec.cz: Jak vymáhat výživné zadarmo?

Jak vymáhat výživné zadarmo?

Podnikatel.cz: EET: Totálně nezvládli metodologii projektu

EET: Totálně nezvládli metodologii projektu

Lupa.cz: Avast po spojení s AVG propustí 700 lidí

Avast po spojení s AVG propustí 700 lidí