vi ,,VILLÁM'' Hogyan


A következő leírás egy halovány kis segítségként is felfogható azok számára, akik még csak most ismerkednek a vi szövegszerkesztő "kezelgetésével". A leírást amúgy semmifélé szerzőijog alá nem ejtem, így mindenki kedvére másolhatja és alábiggyesztheti a nevét, mint e sorok íróját... Szóval kellemes hamisítást...:-)


1. Amelyben arról ejtünk néhány keresetlen szót, hogy ,,Na most mi is az a vi''?

A vi - ejtsd "vi-áj" - egy szabványos UNIX szövegszerkesztő, amely - az előbbi félmondatból is következően - valamennyi UNIX rendszeren megtalálható. Nyilvánvaló tehát, hogy mindenképpen érdemes megismerkedni legalább az alapszintű használatával, hiszen bárki kerülhet olyan helyzetbe, hogy semmifélé egyéb editor nem áll rendelkezésére (például nem tudunk a normál módon bejelentkezni a rendszerünkre, csak egy rendszerhelyreállító bootlemez segítségével) és az ilyen esetekben adunk majd hálát a Mindenhatónak azért, hogy voltunk olyan előrelátók, és megtanultuk a vi alapszintű használalát.


2. E bekezdés témája, tömören összefoglalva: De miért pont "vi" lett a neve?

Jó kérdés. Állítólag a "visual editor" rövidítése. A vi alapanyaga az "ex" (extended editor) nevű sorszerkesztőből (ilyen például az "ed" is) ered. Bill Joy - az ex kitalálója - később írt egy képernyő-alapú felhasználói felületet az ex-hez és ezt elnevezte vi-nak. Mivel ez a kis tanmese a vi-ról szól és nem az ex-ről, ezért ha az ex-vel bővebben szeretnél megismerkedni, akkor csak gépeld be: ex (ez általában hatásos szokott lenni:-)


3. Amelyben mindenki választ kaphat arra a fontos kérdésre, hogy hogyan kell elindítani a vi-t?

Csak gépeljük be, hogy:

vi

És már benne is vagyunk a vi kellős közepében. Természetesen előfordulhat, hogy a vi egy klónja található a rendszerünkön. Szabványos esetben ilyenkor is elég a vi szót begépelnünk, amely egy link az adott klónra (pl. vim, nvi). Most nem kívánok még egy külön pontot kijelölni a vi-ból való kilépésre is, bár valószínűleg erre sokkal nagyobb szükség lehet, mint az elindítási segédletre...:-) Tehát kilépés előtt térjük át parancsmódra(a leírása a következő pontban olvasható) és használjuk a

:x
parancsot (ekkor mentjük a dokumentumot a módosításokkal együtt és kilépünk a programból). Amennyiben megijedtünk, hogy esetleg valami fontos dolgot is megsemmísítettünk a módosítás alatt, akkor használjuk a
:q!
parancsot, ekkor mentés nélkül lépünk ki a programból.

(A szerk. megjegyzése: Persze mire rájöttem erre a két parancsra anno, hát majdnem megőszültem..:-)


4. Itt fellebbentjük a fátylat a sejtelmes parancs- és adatbeviteli módokról?

Mivel ezesetben egy karakteres módú szövegszerkesztőről van szó és a vi megalkotásakor az emberek még nem egérrel a kezükben születtek, ezért valahogyan lehetővé kellett tenni, hogy a szöveg beírása mellett néhány egyéb formázó, szerkesztő parancsot is lehessen használni.

Nevéből is adódóan az adabeviteli módban gépelhetjük be a kívánt szöveget. Ilyenkor valamennyi - nem funkcióbillentyűs - begépelt karakter megjelenítődik a monitoron. Nagyon hamar nyilvánvalóvá válik azonban, hogy hiába vagyunk képesek szöveget begépelni, nem tudunk törölni, adott sorra ugrani, karaktereket cserélni...és meg sorolhatnám.., de sorolom is: másol-kivág-beilleszt funkció, insert, keresés...

És ekkor válik értelmes dologgá a vi parancsmódja.

Parancsmódba a legegyszerűbben egy ESC billentyű lenyomásával juthatunk el. Ha kétszer is lenyomjuk, akkor csipogást hallhatunk, esetleg megvillan a monotor...most már biztosan parancsmódban vagyunk. A parancsokat általában megelőzi egy kettőspont, amelynek helyes írása a hibás ".." helyett, a ":" alakban történik. Például, ha mindíg szeretnénk tudni, hogy éppen melyik módban vagyunk, akkor előszőr lépjünk parancsmódba, majd gépeljük be:

:set showmode

Ezután a vi folyamatosan tájékoztat bennünket, hogy melyik éppen az aktuális mód.

Ha szöveget szeretnénk begépelni a vi editorba, akkor adatbevitelimódra kell átváltanunk. Ez megtehető például az "i" billentyű lenyomásával, amikoris az aktuális kurzorpozíció elé kerül a beírt szöveg, vagy az "a" billentyű lenyomásával, amikor viszont éppenhogy mögé.


5. Mi a teendő, ha lusták vagyunk, de élelmesek, azaz: A .exrc fájl - indítási inicializálás.

Indításakor a vi előszőr leellenőrzi, hogy a HOME könyvtárunkban létezik-e a .exrc fájl. Ebben a fájlban definiálhatjuk, a számunkra általános vi beállításokat. Ezek tulajdonképpen parancsok, amelyeket az ex program haj végre a vi meghívásakor. Végrehajthatunk shellparancsokat is a .exrc fájlon keresztül, ilyenkor a "!" jelet írjuk a shellparancs elé. Kommenteket is írhatunk a .exrc fájlba. A komment jele itt a kettős idézőjel, azaz a " jel. A vi a space és a tabulátor jeleket sem veszi figyelembe, így már viszonylag emészhető kinézetűvé tehetjük a .exrc fájlunkat. A viszont FONTOS:
  • A .exrc fájlban a parancsokat nem kell kettősponttal kezdeni!
  • Ha hibás a .exrc fájlunk, akkor a hibás sor utáni beállítások nem jutnak érvényre!
  • Egy igen rövid példa a .exrc fájlra :-)

    "Alapbeállítások
    set showmode
    set wrapmargin=10
    
    "A pontos idő
    !date;sleep 2
    

    6. Most már csak rajtunk múlik...

    A következő leírást bárki önmaga is előkeresheti, ha használja a vi editorban a :help parancsot , vagy az erre felkínált választási lehetőségek közül (viusage, exusage) valamelyiket.

    Na jó nyelvi eltérések azért lehetnek...:-)

    ^A a kurzornál lévő szóra keres rá a doksi további részében
    ^B egy képernyőnyit lapoz visszafelé
    ^C megszakít egy folyamatot (pl. olvasás, írás, keresés)
    ^D lefelé lapoz egy fél oldalnyit (beállítástól függően)
    ^E egy sort lép lefelé (képernyő görgetéssel)
    ^F egy képernyőnyit lapoz előre
    ^G fájl állapot információk (pl. unmodified: line 26 of 334 [7%])
    ^H balra lép egy karakternyit
    ^J egy sort lép lefelé (amíg lehet, addíg scroll nélkül)
    ^L képernyő frissítés
    ^M soronként lépked lefelé (az első, nem üres helyre)
    ^N soronként lépked lefelé
    ^P soronként lépked felfelé
    ^R képernyőfrissítés
    ^T tag pop
    ^U felfelé lapoz egy fél oldalnyit (beállítástól függően)
    ^V input a literal character
    ^W átvált a következő képernyőre (ha több fájl is meg van nyitva)
    ^Y soronként lapoz visszafelé
    ^Z megszakítja a szerkesztő működését
    ^[ <escape> kilép az adatbeviteli módból, megszakítja a részleges parancsokat
    ^\ átvált ex módba
    ^] tag lekérés a kurzor a kurzor utáni szóból
    ^^ átvált az előző fájlra
    space jobbra mozog oszloponként
    ! filter a shellparancsok outputjának fájlbamozgatására
    Példa: ! <ENTER> ls
    # ha számon áll a kurzor, akkor növeli vagy csökkenti az értékét
    $ az utolsó oszlopra ugrik
    % move to match
    & megismétli a helyettesítést (sustitution)
    ' move to mark (to first non-blank)
    ( az előző mondatra ugrik
    ) a következő mondatra ugrik
    + soronként lépked lefelé (az első, nem üres helyre)
    , ellenkező irányban megismétli az utolsó F, f, T vagy t keresést
    - soronként ugrik felfelé (az első, nem üres helyre)
    . megismétli az utolsó parancsot
    / keresés előrefelé
    0 a legelső karakterre ugrik
    : ex parancs
    ; megismétli az utolsó F, f, T vagy t keresést
    < a sort jobbra mozgatja
    > a sort jobbra mozgatja
    ? keresés visszafelé
    @ lefuttatja a puffer tartalmát
    A hozzáfűz a sor végéhez
    B minden nagyobb szóra elejére ugrik, visszafelé
    C szövegmódosítás a sor végéig
    D a sor végéig töröl
    E minden nagyobb szó végére ugrik, előrefelé
    F a sorban visszafelé keresve a keresett karakterre ugrik
    G a szöveg utolsó sorára viszi a kurzort
    H az aktualis legfelső sorra viszi a kurzort
    I a első, nem üres karakterhely elé szúr be
    J az aktuális sor végéhez fűzi a következő sort
    L a képernyő aljára ugrik
    M a képernyő közepére ugrik
    N az utolsó keresés, de visszafelé
    O beillesztés az adott sor fölé
    P beilleszti a puffer tartalmát a kurzor elé
    Q ex módra vált át
    R felülírja a begépelt szöveggel az adott sor tartalmát
    S az aktuális sort helyettesíti a begépelt adattal
    T a sorba visszafelé keresve a keresett betű elé ugrik
    U visszaállítja a sor eredeti tartalmát
    W a következő szóra ugrik
    X törli a kurzor előtti karaktert
    Y másolja az aktuális sort
    ZZ lementi a fájlt és kilép
    [[ visszaugrik a paragrafus (fájl eleje is lehet) elejére
    ]] a paragrafus (fájl vége is lehet) végére ugrik
    ^ a sorban lévő, első, nem üres karakterre ugrik
    _ a sorban lévő, első, nem üres karakterre ugrik
    ` a megjelölt részhez ugrik
    a a kurzor utáni helyre illeszt
    b az előző szóra ugrik
    c módosítás visz végbe a mozgás irányában
    d törlést végez a mozgás irányában
    e a szó végére ugrik
    f adott karakter keresése a sor vége felé (pl. fg, akkor a köv. g-re ugrik)
    h balra ugrik egy oszlopot
    i szövegetbemenetet illesz a kurzor elé
    j lefelé ugrik egy sort
    k felfelé ugrik egy sort
    l jobbra ugrik egy oszlopot
    m megjelöl egy fájlrészt
    n megismétli az előző keresést
    o beilleszt a sor után
    p beilleszti a kurzor mögé a puffer tartalmát
    r kicserél egy karaktert
    s helyettesíti az adott karaktert (akár több karakterrel is)
    t a keresett karakter előtti karakterre ugrik a sor vége felé
    u visszaállítja az előző állapotot (undo)
    w a következő szóra ugrik
    x karakter törlés
    y a vágólapra (pufferbe) másolja az aktuális sort
    z újrapoziciónálja a képernyőt
    { visszafelé lépked a bekezdéseken
    | a sor elejére ugrik (az első oszlophoz)
    } előrefelé lépked a bekezdések mentén
    ~ a nagybetűket kisbetűre irja át, a kisbetűket nagyra

    Extra lehetőségek:

    ^D : scrollozza a sorokat
    ! : szűri a sorokat a parancsokon keresztül, vagy futtat egy parancsot
    # : megjeleníti az adott sor sorszámát és magát a sort is
    & : repeat the last subsitution
    * : lefuttetja a puffert
    < : eltolja a sort balra
    = : a dokumentum teljes sorszámát jeleníti meg
    > : eltolja a sort jobbra
    @ : lefuttatja a puffert
    append : az adott sor után adatot vihetunk be pl. ^C -ig
    abbreviate : meghatároz egy bemeneti (input) rövidítést
    args : megjeleníti a fájl argumentumlistáját
    bg : a szöveget a háttérbe teszi át
    change : megváltoztatja az aktuális sor tartalmát
    cd : megváltoztatja az aktuális könyvtárat
    chdir : megváltoztatja az aktuális könyvtárat
    copy : sorokat másol a fájl tetszöleges részébe
    cscope : create a set of tags using a cscope command
    delete : sorokat töröl ki a fájlból
    display : megjeleníti a puffereket, kapcsolatokat, képernyőket vagy a tagokat
    [Ee]dit : elkezd szerkeszteni egy másik fájlt
    [Ee]x : elkezd szerkeszteni egy másik fájlt
    exusage : megjeleníti az extra parancshasználat megállapításait
    file : megjeleníti (vagy opcionálisan be is állítja) a fájl nevét
    [Ff]g : előrehoz egy képernyőt a háttérből
    global : lefuttat egy globális parancsot adott sorokon a RE-nek megfelelően
    help : megjeleniti a verzióhoz tartozó aktuális help szöveget
    insert : szövegadatokat illeszt az aktuális sor elé
    join : a következő sort az aktuális sor mögé fűzi
    k : megjelöl egy sorpozíciót
    list : megjeleníti a sorokat félreérthetetlen formában
    move : sorokat mozgat át valahová a fájlban
    mark : megjelöl egy sorpozíciót
    map : begépelt adatokat vagy parancsokat rendel, egy vagy több billentűzethez
    mkexrc : létrehoz egy .exrc fájlt
    [Nn]ext : szerkeszt (és esetlegesen meghatározza) a következő fájlt
    number : átváltja a megjelenítési formát adott számú sorra
    open : belép az "open" módba (egyenlőre nem elérhető)
    print : sorokat jelenít meg
    perl : futtatja a perl értelmezőt/interpretert az adott paranccsal
    perldo : lefuttatja a perl értelmezőt a paranccsal, de valamennyi sorra
    preserve : fenntart egy szerkesztői munkafázist (session) az esetleges helyreállításra
    [Pp]revious : szerkeszti a fájl argumentumlista előző fájlját
    put : hozzáfűz egy vágólap (puffer) tartalmat a sorhoz
    quit : kilép az ex/vi -ból
    read : hozzáfűzi egy parancs kimenetét vagy egy fájl tartalmát a sorhoz
    recover : visszaállít egy mentett fájlt
    resize : grow or shrink the current screen
    rewind : újraolvassa valamennyi fájlt, amely a fájl argumentum listában megtalálható
    s : substitute on lines matching an RE
    script : futtat egy shell-t a képernyőn
    set : opciókat állít be (használd a ":set all" -t, a lehetőségek megtekintésére)
    shell : felfüggeszti a szerkesztést és elindít egy shell-t
    source : beolvas egy ex parancsokat tartalmazo fájlt
    stop : felfüggeszti a szerkesztési munkafázist
    suspend : felfüggeszti a szerkesztési munkafázist
    t : átmásol egy sor a fájl adott részébe
    [Tt]ag : szerkeszti a tag-et tartalmazó fájlt
    tagnext : átlép a következő tag-re
    tagpop : visszatér az előző tag csoportra
    tagprev : visszalép az előző tag-re
    tagtop : érvényteleníti valamennyi tag-et
    tcl : meghívja a tcl parancsértelmezőt egy paranccsal
    undo : visszaállítja a legutolsó változtatást
    unabbreviate : töröl egy rövidítést
    unmap : delete an input or command map
    v : execute a global command on lines NOT matching an RE
    version : megjeleníti a program verzióinformációit
    visual : belépés visual (vi) módba (ex módból)
    [Vv]isual : egy másik fájl szerkesztése (csak vi módból lehet kiadni)
    viusage : megjeleníti a vi kulcsbillentyűk használati információi
    write : írja a fájlt
    wn : írja a fájlt és átvált a következő fájlra
    wq : írja a fájlt és kilép
    xit : kilép
    yank : copy lines to a cut buffer
    z : megjeleníti egy fájl különböző képernyőoldalait (pl. z+ z- ,...)
    ~ : replace previous RE with previous replacement string


    Highlighting funkció a programozáshoz/de ez tényleg csak néhány példa/:

    vim-awkvim-c
    AwkC
    vim-htmlvim-perl
    htmlPerl
    vim-texvim-sh
    Texshellscript
    Még néhány megjegyzés:

    Néhány igen jó leírás található a vi-t, illetve a klónokat tartalmazó csomagokban (mint ahogy azt a többi programcsomag esetében is megszokhattuk..:-).

    vim/usr/doc/vim/examples/tutor Bevezető leírás a vim használatába (viszonylag jó és rövid, emellett jól tagolt).
    vim/usr/doc/vim/*Minden ami a programnyelvi támogatásokhoz, a highlighting támogatáshoz és még sok egyébhez szükséges.
    nvi/usr/doc/nvi/FAQ.gzNincs mit hozzáfűzni..bár elég rövid..:-(
    És persze man vi, man nvi, man vim, ...

    Szóval...jó ez a vi.....:-)

    mailto:kuksi@kuksi2.igyuk.hu