Fájlműveletek és külső shell parancsok
Az alábbiakban azokkal a parancsokkal ismerkedünk meg, amelyek fájlműveletek végzését és külső parancsok végrehajtását teszik lehetővé a vi alól.
Külső parancs végrehajtása vi alól
Gyakran szükségünk lehet egy-egy Unix parancs kiadására a vi alól, s ilyenkor kényelmetlen kilépni, majd újraindítani az editort. A
:!
unix_parancsformátumú utasítás hatására végrehajtódik unix_parancs, eredménye a képernyőnkre íródik, innen egy újsor karakter leütésére kerülünk vissza előző képernyőnkre. Ebben az esetben semmiféle kapcsolat nincs a vi által editált fájlunk és a cmd parancs között, így arra sincs lehetőségünk, hogy adatokat cseréljünk a futtatott paranccsal. Az alábbi parancs hatására azt nézzük meg, hogy melyik katalógisban tartózkodunk éppen:
:!pwd
A vi lehetőséget nyújt arra, hogy a szerkesztett állomány tetszőleges pontjára beszúrjuk egy másik fájl tartalmát, illetve a szerkesztett fájl egy részét másik fájlba írjuk.
:[sorcím]r file |
Hatására a kurzor mögé, illetve címmegadás esetén az adott sorba beszúródik file tartalma. |
:[ címtartomány]w file |
Hatására a szerkesztett fájl címtartomány által definiált része (címmegadás hiányában a teljes fájl) beíródik a file állományba. |
címtartomány illetve sorcím az ed és sed editoroknál már tárgyalt módon adható meg, akár abszolút, akár relatív sorszámok, akár reguláris kifejezéssel megadott minták formájában. Néhány példa:
:23r text
A szerkesztett fálj 23. sora után beszúrja text állományt.
:1,.-1w rovid.txt
A szerkesztett fájl elejét (az aktuális előtti sorral bezárólag) kimenti rovid.txt néven.
:1,/^_end/w t1.doc
A fájl elejétől a sor eleji _end mintát tartalmazó sorig kimenti a t1.doc fájlba a szerkesztett állományt.
Még érdekesebb és hasznosabb lehet, ha Unix parancsok eredményét tudjuk valahogyan beépíteni fájlunkba, netán a fájl egyes részeit Unix parancsokkal, szűrőkkel tudnánk manipulálni. Erre is megvan a lehetőség, s ez teszi igazán rugalmassá és sokoldalúvá a vi-t. Számos vi parancsnál (pontosabban az ex üzemmódú parancsoknál) lehetőség van a vi belső puffereinek felhasználására fájlműveletek során; ilyenkor a '!' karakter jelzi a vi számára, hogy külső parancsot kell végrehajtani, mely értelemszerűen ír vagy olvas a belső pufferből.
:[
sorcím]r ! parancsHatására a megadott sor után beszúródik parancs eredménye.
!
szövegobjektum parancsHatására az aktuális fájl szövegobjektum által kijelölt részén végrehajtódik parancs, s ennek eredményével helyettesítődik az eredeti szövegobjektum. A c,d és más szövegmódosító vi parancsoknál megszokott módon, ha a parancskaraktert (esetünkben a felkiáltójelet) megduplázzuk, az a kurrens sorra fog vonatkozni, azaz vi az aktuális sort fogja helyettesíteni parancs eredményével. (Az első próbálkozásokkor kicsit zavaró lehet, hogy amikor a kezdő felkiáltójelet begépeljük, semmi sem történik, a következő karakterek begépelésekor megjelenik ugyan, de cserébe a szövegobjektum megadására vonatkozó karaktereket láthatatlanul kell begépelni.)
Néhány példa a pufferműveletek alkalmazására:
:r !date
A kurrens sor mögé beszúrja az aktuális dátumot. Figyeljünk a következőnél a különbségre:
!!date
a kurrens sort lecseréli az aktuális dátumra.
A következő parancs ekvivalens a :r /etc/hosts paranccsal, a kurzor mögé beszúrja a /etc/hosts fájl tartalmát:
:r !cat /etc/hosts
Alábbi példánk akkor lehet hasznos, ha például ékezetes szöveget szerkesztettünk, s emailben szeretnénk elküldeni egy olyan levelezőprogrammal, amelyik nem konvertálja automatikusan küldhető formátumra az ékezetes szöveget:
:1,G !uuencode txt.uu
A fenti parancs a teljes fájlt helyettesíti az uuencode paranccsal kódolt változatára.
Az alábbi parancs a kurrens bekezdést a fold paranccsal maximum 72 karakter hosszúságú sorokra tördeli:
!}fold -w 72