VIM * vi je Visual Editor (otud stoji "vi" - VIsual). * vim stoji za vi IMproved - Jednostavno pokretanje vi editora: vi vi nekiFajl.txt (otvaranje datoteke unutar vi editora) vi -r nekiFajl.txt (za oporavak kroz upotrebu swap datoteke) - Rezimi rada: 1) Command Mode - [default] na njega se prelazi pritiskom na taster ESC 2) Insert Mode - na njega se prelazi, izmedju ostalog, pritiskom na taster i. Pored i (koji ubacuje tekst pre kursora), jos jedna od varijanti je da se pritisne taster a (ubacice tekst nakon kursora). U tekstu ce biti pomenuto jos par komandi koje mogu da aktiviraju insert rezim. * Napomena: prilikom prelaska u ova dva rezima nema nikakvog obavestenja o prelazu: generalno, slabo stoje sa obavestenjima, podrazumeva se da znas sta radis. Jasno razlikovanje ova dva rezima rada je kljuc za pravilno razumevanje rada u VIM-u. Spremite se, dakle, na mnogo pritiskanja tastera Escape, jer se gotovo sve radi iz komandnog rezima. Rezim insert sluzi samo za ubacivanje teksta, i nista vise, zaboravite stare navike iz drugih editora. Primer radi, ako ste u rezimu insert za kucanje i probate da uradite sledece, to nece biti bas kako ste ocekivali: - pritisak strelice gore daje slovo A, dole-B, levo-D, desno-C (pri cemu se ne napusta insert rezim); dakle, nema navigacije po tekstu iz rezima insert. - taster backspace nece da brise tekst ulevo, vec ce pomerati kursor ulevo, sekvencijalno, pritisak po pritisak tastera, do prvog unetog teksta tekuce sesije (trenutnog insert rezima). Ako se tako pozicioniramo na prvi karakter tekuce sesije, tasterom backaspace i probamo da unesemo neki tekst, isti ce biti prepisan novim tekstom. - skrol tockicem misa ne radi kako ste mozda ocekivali, skrol gore daje 5 puta vrednost A, na dole - 5 puta vrednost B, a srednji taster ubacuje 5 praznih redova (u komandnom rezimu radi skrol gore-dole, ali klik na srednji taster menja pocetna prva slova paragrafa u vrednosti od linija! Laughing ) - pritisak na Home dugme daje slovo H, - pritisak na dugme Delete iz rezima insert, menja "case" prethodnog karaktera (veliko/malo slovo menja u malo/veliko slovo) + aktivira komandni rezim. U komandom rezimu Delete brise znakove ulevo! - Navigacija unutar komandnog rezima: - Navigacija kursora (ako ne rade strelice kursora na tastaturi): h-levo ; j-dole ; k-gore ; l-desno //radi i batch mode: 20k cini da se pomeris 20 linija na gore. Batch mode, u principu, se moze kombinovati sa komandama, eksperimentisite. - Navigacija, reci: w-pocetak sledece reci ; e-kraj sledece reci ; b-pocetak prethodne reci. //napomena: ovaj rezim skace i na specijalne karaktere, ako zelimo samo da skace na reci, koriste se uppercase varijante (W, E, B). - Navigacija, skakanjem: #G, gde "#" predstavlja neki broj, cini da skocimo na liniju (red) pod tim brojem. Na primer, 45G skace na liniju 45; Samo G skace na zadnju liniju dokumenta. #|, gde "#" predstavlja neki broj, skace na kolonu, naznacenu tim brojem. Simbol iz komande nije veliko "i", vec pipe. Na primer 45| odlazi na 45 kolonu tekuce linije. Kucanjem samo |, dolazimo na pocetak linije. ( i [ se koriste za skok na prethodni paragraf, a ) i ] za skok na sledeci paragraf. 0 (nula) - skace na pocetak tekuce linije; $ skace na kraj tekuce linije. :$ - pozicionira kursor na poslednju liniju u fajlu. % - skace na zagrade u tekucoj liniji - Umetanje novih linija: o - umece novu praznu liniju (red) ispod tekuce linije i nakon toga aktivira insert rezim! O - umece novu liniju (red) iznad tekuce linije i nakon toga aktivira insert rezim! // vidi nacin i sa srednjim tasterom misa iz insert rezima. - Brisanje teksta a) Brisanje znaka: ESC ; naciljas karakter (strelice ili hjkl ili backspace) ; X ; i (za nastavak pisanja) b) Batch brisanje karaktera: #x (#-neki broj, pa potom odmah "x" --> obrisace se ukupno # karaktera nadesno od tekuce pozicije) c) Brisanje linije: dd //radi i batch mode; 5dd brise sledecih 5 linija (nadole). Radi i kombinacija: dj brise liniju dole (ili d5j - brise 5 linija ispod). Ukoliko drzis taster d, automatski ces brisati linije na dole. d radi i sa strelicama na tastaturi d+levo brise znak levo, d+desno brise taster desno i sl. d) cc brise tekucu liniju (bez markiranja za prepisivanje!) i aktivira insert rezim. e) dw-brisanje jedne reci f) brisanje ostatka linije ukljucujuci i poziciju na kojoj se nalazi kursor: D (veliko d). Ukoliko smo pozicionirani na kraju linije, brisace se postepeno karakteri unazad Smile // Slican efekat se postize i komandom d$. g) :a,bd (gde su a i b dva broja) - brise linije od a zakljucno sa b (:1,8d brise prvu liniju, zakljucno s osmom, a vidice se i napomena: 8 fewer lines u donjem levom uglu ekrana). h) :24,$ d - brise linije od 24 do kraja dokumenta, inkluzivno (dakle, brise se i linija 24). - Prepisivanje (overwrite) / teksta, karaktera, ... C (veliko c) markira ostatak linije spremnim za prepisivanje i aktivira insert rezim. Napomena, ako pritisnem taster ESC, nakon C, obrisace se tekst (nece se aktivirati komandni rezim Exclamation ). Inace, kada smo u rezimo insert i pritisnemo taster ESC, aktivira se komandni rezim s kursorom na prethodnom karakteru (sukcesivnim pritiskanjem i + ESC, cete moci doci do pocetka linije Laughing ). c markira neki segment teksta za prepisivanje i aktivira insert rezim. Na primer, ako se pozicioniramo na pocetak neke reci i pritisnemo cw markira se ta rec za prepisivanje. Kada kucamo tekst, prepisuje se samo ta rec, nakon prepisivanja se ostatak pomera udesno. Za razliku od vecine ostalih komandi, gde nema obavestenja kada se izvrsi neka komanda, pri aktiviranju ovde komande se na kraju reci vidi dolar znak ($). cc brise tekucu liniju (bez markiranja za prepisivanje!) i aktivira insert rezim. r prepisivanje karaktera na kome je kursor sa sledecim utipkanim (ne napusta se komandni rezim). R prepisuje sve karaktere tekuce linije (aktivira i insert rezim). - Pretraga (karaktera/teksta...) f[karakter] - pozicionira kursor na sledeci [karakter] u liniji (kad se dodje do kraja linije, ne prelazi se na sledecu liniju). Na primer, fc ce potraziti pojavljivanje karaktera c u tekucoj liniji. Ukoliko zelimo da pretrazujemo unazad, koristi se uppercase verijanta: F[karakter] E sad, da ne bi non stop ponavljali fc ili Fc, upotrebicemo ; za ponavljanje pretrage unapred ili , za ponavljanje pretrage unazad. * - trazi sledece pojavljivanje reci na kojoj je kursor pozicioniran. Nije ograniceno na tekucu liniju, trazice do kraja fajla (kad dodje do kraja, opet otpocetka). # - trazi prethodno pojavljivanje reci na kojoj je kursor. Nije ograniceno na tekucu liniju, trazice do pocetka fajla (a nakon pocetka, opet otpozadi). /nekiTekst - pretraga teksta unapred (// ponavlja zadnju pretragu) ? - pretraga teksta unazad (?? ponavlja zadnju pretragu) Ukoliko zelite da trazite dalje zadati pojam, ne pritiskate Enter vec n (i to u smeru kako je prvobitno zadato; ukoliko zelite obrnut smer, koristite N). Zamena (replace) Bice pomenuta dva tipa, koja sam nazvao S-nacin i G-nacin smesak . [1] S-nacin Opsti oblik: :[opseg]s/stari_termin/novi_termin/[cgi] Opseg: - brojevi linija (ili opseg dva broja, razdvojenih zarezom ili dvotackom), - $ (kraj datoteke), - . (tekuca lokacija), - % (tekuca datoteka), - .,+5 (sledecih 5 linija). Parametri [cgi] //jedno od ova tri ili nista - c, prikaz prompt prozora pre izmena - g, izmena svih pojavljivanja na liniji - i, neosetljivost na velika i mala slova pri pretrazi Primer: :s/stari_termin/novi_termin/g // tekuca linija Primer: :%s/stari_termin/novi_termin/g // celi dokument [2] G-nacin Najbolje ga je objasniti primerom: :g/Linux/s/nux/ndza/g Pretrazujemo za zadati termin "Linux", i menjamo ga u Lindza. U ovom slucaju ostale reci tipa "Panux" ne diramo, tj. ne menjamo ih Smile Izuzetak (nisam probao ovo): ako se Panux pojavi na istoj liniji kao i Linux, i on ce se izmeniti. Takodje, mogu se koristiti i specijalne sekvence, regular expression i tako te fensi stvarcice, ali to nece biti obradjeno u ovom tekstu, mozda u nekom od dopuna ove teme. - Iseci, kopiraj i zalepi (cut, copy and paste) yy - kopira ("yanks") tekucu liniju u bafer. 3yy ce da "jakne" 3 linije u bafer pocevsi od tekuce p - lepi sadrzaj bafera u liniju ispod tekuce. P - lepi sadrzaj bafera u liniju iznad tekuce. Napomena: linije obrisane komandom dd, odnosno reci obrisane komandom dw takodje zavrsavaju u baferu, pa se mogu zalepiti. Neko ce se zapitati zasto se koristi termin bafer, a ne klibord (clipboard). Caka je u tome sto postoji 26 slovno oznacenih bafera (od a do z) i 9 numerickih bafera (1-9), tako da ovo treba imati u vidu (u Windowsu prepisete sadrzaj clipboarda ako kopirate opet u clipboard, osim ako se ne koristi neki 3rd party clipboard manager). Preko karaktera ", pristupa se ovim lokacijama: Primer1: "a3yy - jekne tri linije u bafer a, pocevsi od tekuce (u donjem levom uglu ce pisati notifikacija 3 lines yanked). Primer2: "bp - lepi sadrzaj bafera b ispod tekuce linije. Sto se tice numerickih bafera, oni imaju malo drugaciju logiku - bafer na lokaciji 1 odnosi se na onaj sadrzaj koji je poslednji put kopiran/isecen. Nakon sledeceg secenja/kopiranja, poslednji sadrzaj se ubacuje u poziciju 1, a prethodni sadrzaj iz pozicije 1 se prebacuje na poziciju 2. Shvatili ste, dakle, ako opet stogod kopiramo/isecemo, sadrzaj iz lokacije 2 se pomera na lokaciju 3, sadrzaj iz lokacije 1 se prebacuje na lokaciju 2, a na lokaciji 1 ostaje sveze kopiran/isecen sadrzaj. Da, i to ste shvatili - na ovaj "numericki nacin" ne mozete birati numerisanu lokaciju da ubacite kopirani/isecen sadrzaj - za to sluze samo slovni baferi. Idea Dobra je ideja koja se krije iza ovoga. Ako nesto "jeknete" u memoriju, i zatreba vam kasnije, imate 9 pokusaja da se setite da zalepite Cool Do not forget anything 9 times Mr. Green - cesto koristene "dvotacka-komande" (Colon Commands, Ed/Ex Commands): :w imeDatoteke --> cuvanje datoteke :q --> izlazak iz datoteke :q! --> izlazak iz datoteke ponistavajuci izmene :e! --> ponovo ucitava dokument, bez cuvanja izmena :set nu --> prikazuje brojeve linija :set nonu --> ponistava prikaz s brojevima linija :a,bd (gde su a i b dva broja) - brise linije od a zakljucno sa b (:1,8d brise prvu liniju, zakljucno s osmom, a vidice se i napomena: 8 fewer lines u donjem levom uglu ekrana). :set all - pregled svih podesavanja :#',#'' co #''' - kopira linije od #' do #'' na lokaciju ispod #''' ; na primer 1,8 co 84 kopira linije od prve do osme, ispod linije 84. :#',#'' m #''' - premesta linije od #' do #'' na lokaciju ispod #''' ; na primer :1,8 m 99 premesta linije od 1 do 8, na mesto ispod 99. :n - otvara sledecu datoteku za obradu (ako je otvoreno vise datoteka); ako dodjemo do kraja niza, :rew "premotava" pokazivac na prvu datoteku. :args - prikazuje ime tekuceg fajla (ako je otvoren), odnosno sve otvorene fajlove, redom. :set ic - postavlja pretragu, zadatu preko komande "/" da ignorise velika i mala slova (/mycity ce da pronadje za rezultat i mycity i MyCity i sl.) :!neka_komanda - izvrsavanje komandi bez napustanja Vi(m)-a. Primer: :!dir ce izlistati direktorijum bez napustanja programa, :!date ce izvrsiti shell komadu i prikazati datum... :sh - pokrece shell. Da bi se vratili u Vim, kucamo exit. - Jos malo komandi u - ponistava (undo) poslednju komandu (ponovni pritisak na taster u ce uraditi redo, dakle, ponistiti undo) U - ponistava promene nad linijom u kojoj se nalazimo, u tekucoj sesiji ! . (tacka) - ponavljanje zadnje akcije (moze se koristiti i batch mode, tipa 10.) Vazi i za uneti tekst, ukoliko ukucamo "Daanas je lep dan" pa Esc i pritiskamo . , tekst ce se prikazati vise puta kroz linije. mneko_slovo - markira tekucu liniju pod slovom neko_slovo (od a do z). Na primer ma markira tekucu liniju kao a. Poenta je da mozete skoknuti na tu liniju u svaka doba koristeci 'a (tilda+tilda+a) ili umesto broja te linije iskoristiti tu referencu (primera radi, ako ukucamo d'a, brise se ta linija ili ako ukucamo y'a - janknucemo tu liniju u bafer i posle moci da je zalepimo preko p ). ~ (tilda) menja slovni karakter, oznacen kursorom, iz malog slova u veliko i obrnuto. ZZ - spasava promene nad fajlom i izlazi iz fajla. - LITERATURA za geekove Tutorial in flash Vim documentation Vi For Smarties + quizz: 1, 2 VIM DE VIM tutorial Reference card & Cheat sheet: 1, 2, 3, 4 Video & screencast: 1, 2