offline
- Fil
![Male](https://www.mycity.rs/templates/simplified/images2/user-sex.gif)
- Legendarni građanin
- Pridružio: 11 Jun 2009
- Poruke: 16586
|
VIM
* vi je Visual Editor (otud stoji "vi" - VIsual).
* vim stoji za vi IMproved
Moto: "The best way to learn vi is by using it"
Ko želi da se igra u Windowsovom terminal emulatoru, neka preuzme ovu verziju: gVim 7.4
Link: http://www.vim.org/download.php#pc
* Isprobano i na Windows 8.1 x64
Neće biti uvoda, idemo odmah na akciju bez filozofiranja, sve je isprobano na Linux Mint 16 "Petra", XFCE edicija, u distro je podrazumevano uključena varijanta vim-tiny.
~
Jednostavno pokretanje vi editora:
vi
vi nekiFajl.txt (otvaranje datoteke unutar vi editora)
vi -r nekiFajl.txt (za oporavak kroz upotrebu swap datoteke)
Režimi rada:
1) Command Mode - [default] na njega se prelazi pritiskom na taster ESC
2) Insert Mode - na njega se prelazi, između ostalog, pritiskom na taster i. Pored i (koji ubacuje tekst pre kursora), još jedna od varijanti je da se pritisne taster a (ubaciće tekst nakon kursora). U tekstu će biti pomenuto još par komandi koje mogu da aktiviraju insert režim.
* Napomena: prilikom prelaska u ova dva režima nema nikakvog obaveštenja o prelazu: generalno, slabo stoje sa obaveštenjima, podrazumeva se da znaš šta radiš.
Jasno razlikovanje ova dva režima rada je ključ za pravilno razumevanje rada u VIM-u. Spremite se, dakle, na mnogo pritiskanja tastera Escape, jer se gotovo sve radi iz komandnog režima. Režim insert služi samo za ubacivanje teksta, i ništa više, zaboravite stare navike iz drugih editora. Primer radi, ako ste u režimu insert za kucanje i probate da uradite sledeće, to neće biti baš kako ste očekivali:
- pritisak strelice gore daje slovo A, dole-B, levo-D, desno-C (pri čemu se ne napušta insert režim); dakle, nema navigacije po tekstu iz režima insert.
- taster backspace neće da briše tekst ulevo, već će pomerati kursor ulevo, sekvencijalno, pritisak po pritisak tastera, do prvog unetog teksta tekuće sesije (trenutnog insert režima). Ako se tako pozicioniramo na prvi karakter tekuće sesije, tasterom backaspace i probamo da unesemo neki tekst, isti će biti prepisan novim tekstom.
- skrol točkićem miša ne radi kako ste možda očekivali, skrol gore daje 5 puta vrednost A, na dole - 5 puta vrednost B, a srednji taster ubacuje 5 praznih redova (u komandnom režimu radi skrol gore-dole, ali klik na srednji taster menja početna prva slova paragrafa u vrednosti od linija! )
- pritisak na Home dugme daje slovo H,
- pritisak na dugme Delete iz režima insert, menja "case" prethodnog karaktera (veliko/malo slovo menja u malo/veliko slovo) + aktivira komandni režim. U komandom režimu Delete briše znakove ulevo!
Navigacija unutar komandnog režima:
- Navigacija kursora (ako ne rade strelice kursora na tastaturi): h-levo ; j-dole ; k-gore ; l-desno
//radi i batch mode: 20k čini da se pomeriš 20 linija na gore. Batch mode, u principu, se može kombinovati sa komandama, eksperimentišite.
- Navigacija, reči: w-početak sledeće reči ; e-kraj sledeće reči ; b-početak prethodne reči.
//napomena: ovaj režim skače i na specijalne karaktere, ako želimo samo da skače na reči, koriste se uppercase varijante (W, E, B).
- Navigacija, skakanjem:
#G, gde "#" predstavlja neki broj, čini da skočimo na liniju (red) pod tim brojem. Na primer, 45G skače na liniju 45; Samo G skače na zadnju liniju dokumenta.
#|, gde "#" predstavlja neki broj, skače na kolonu, naznačenu tim brojem. Simbol iz komande nije veliko "i", već pipe. Na primer 45| odlazi na 45 kolonu tekuće linije. Kucanjem samo |, dolazimo na početak linije.
( i [ se koriste za skok na prethodni paragraf, a ) i ] za skok na sledeći paragraf.
0 (nula) - skače na početak tekuće linije; $ skače na kraj tekuće linije.
:$ - pozicionira kursor na poslednju liniju u fajlu.
% - skače na zagrade u tekućoj liniji
Umetanje novih linija:
o - umeće novu praznu liniju (red) ispod tekuće linije i nakon toga aktivira insert režim!
O - umeće novu liniju (red) iznad tekuće linije i nakon toga aktivira insert režim!
// vidi način i sa srednjim tasterom miša iz insert režima.
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" --> obrisaće se ukupno # karaktera nadesno od tekuće 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 držiš taster d, automatski ćeš brisati linije na dole. d radi i sa strelicama na tastaturi d+levo briše znak levo, d+desno briše taster desno i sl.
d) cc briše tekuću liniju (bez markiranja za prepisivanje!) i aktivira insert režim.
e) dw-brisanje jedne reci
f) brisanje ostatka linije uključujući i poziciju na kojoj se nalazi kursor: D (veliko d). Ukoliko smo pozicionirani na kraju linije, brisaće se postepeno karakteri unazad
// Sličan efekat se postiže i komandom d$.
g) :a,bd (gde su a i b dva broja) - briše linije od a zaključno sa b (:1,8d briše prvu liniju, zaključno s osmom, a vidiće se i napomena: 8 fewer lines u donjem levom uglu ekrana).
h) :24,$ d - briše linije od 24 do kraja dokumenta, inkluzivno (dakle, briše se i linija 24).
Prepisivanje (overwrite) / teksta, karaktera, ...
C (veliko c) markira ostatak linije spremnim za prepisivanje i aktivira insert režim. Napomena, ako pritisnem taster ESC, nakon C, obrisaće se tekst (neće se aktivirati komandni režim ). Inače, kada smo u režimo insert i pritisnemo taster ESC, aktivira se komandni režim s kursorom na prethodnom karakteru (sukcesivnim pritiskanjem i + ESC, ćete moći doći do početka linije ).
c markira neki segment teksta za prepisivanje i aktivira insert režim. Na primer, ako se pozicioniramo na početak neke reči i pritisnemo cw markira se ta reč za prepisivanje. Kada kucamo tekst, prepisuje se samo ta reč, nakon prepisivanja se ostatak pomera udesno.
Za razliku od većine ostalih komandi, gde nema obaveštenja kada se izvrši neka komanda, pri aktiviranju ovde komande se na kraju reči vidi dolar znak ($). cc briše tekuću liniju (bez markiranja za prepisivanje!) i aktivira insert režim.
r prepisivanje karaktera na kome je kursor sa sledećim utipkanim (ne napušta se komandni režim).
R prepisuje sve karaktere tekuće linije (aktivira i insert režim).
Pretraga (karaktera/teksta...)
f[karakter] - pozicionira kursor na sledeći [karakter] u liniji (kad se dođe do kraja linije, ne prelazi se na sledeću liniju). Na primer, fc će potražiti pojavljivanje karaktera c u tekućoj liniji. Ukoliko želimo da pretražujemo unazad, koristi se uppercase verijanta: F[karakter]
E sad, da ne bi non stop ponavljali fc ili Fc, upotrebićemo ; za ponavljanje pretrage unapred ili , za ponavljanje pretrage unazad.
* - traži sledeće pojavljivanje reči na kojoj je kursor pozicioniran. Nije ograničeno na tekuću liniju, tražiće do kraja fajla (kad dođe do kraja, opet otpočetka).
# - traži prethodno pojavljivanje reči na kojoj je kursor. Nije ograničeno na tekuću liniju, tražiće do početka fajla (a nakon početka, opet otpozadi).
/nekiTekst - pretraga teksta unapred (// ponavlja zadnju pretragu)
?<text> - pretraga teksta unazad (?? ponavlja zadnju pretragu)
Ukoliko želite da tražite dalje zadati pojam, ne pritiskate Enter već n (i to u smeru kako je prvobitno zadato; ukoliko želite obrnut smer, koristite N).
Zamena (replace)
Biće pomenuta dva tipa, koja sam nazvao S-način i G-način .
[1] S-način
Opšti oblik: :[opseg]s/stari_termin/novi_termin/[cgi]
Opseg:
- brojevi linija (ili opseg dva broja, razdvojenih zarezom ili dvotačkom),
- $ (kraj datoteke),
- . (tekuća lokacija),
- % (tekuća datoteka),
- .,+5 (sledećih 5 linija).
Parametri [cgi] //jedno od ova tri ili ništa
- 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
// tekuća linija
Primer: :%s/stari_termin/novi_termin/g
// celi dokument
[2] G-način
Najbolje ga je objasniti primerom:
:g/Linux/s/nux/ndza/g
Pretražujemo za zadati termin "Linux", i menjamo ga u Lindza. U ovom slučaju ostale reči tipa "Panux" ne diramo, tj. ne menjamo ih
Izuzetak (nisam probao ovo): ako se Panux pojavi na istoj liniji kao i Linux, i on će se izmeniti.
Takođe, mogu se koristiti i specijalne sekvence, regular expression i tako te fensi stvarčice, ali to neće biti obrađeno u ovom tekstu, možda u nekom od dopuna ove teme.
Iseci, kopiraj i zalepi (cut, copy and paste)
yy - kopira ("yanks") tekuću liniju u bafer.
3yy će da "jakne" 3 linije u bafer počevši od tekuće
p - lepi sadržaj bafera u liniju ispod tekuće.
P - lepi sadržaj bafera u liniju iznad tekuće.
Napomena: linije obrisane komandom dd, odnosno reči obrisane komandom dw takođe završavaju u baferu, pa se mogu zalepiti.
Neko će se zapitati zašto se koristi termin bafer, a ne klibord (clipboard). Caka je u tome što postoji 26 slovno označenih bafera (od a do z) i 9 numeričkih bafera (1-9), tako da ovo treba imati u vidu (u Windowsu prepišete sadržaj 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, počevši od tekuće (u donjem levom uglu će pisati notifikacija 3 lines yanked).
Primer2: "bp - lepi sadržaj bafera b ispod tekuće linije.
Što se tiče numeričkih bafera, oni imaju malo drugačiju logiku - bafer na lokaciji 1 odnosi se na onaj sadržaj koji je poslednji put kopiran/isečen. Nakon sledećeg sečenja/kopiranja, poslednji sadržaj se ubacuje u poziciju 1, a prethodni sadržaj iz pozicije 1 se prebacuje na poziciju 2.
Shvatili ste, dakle, ako opet štogod kopiramo/isečemo, sadržaj iz lokacije 2 se pomera na lokaciju 3, sadržaj iz lokacije 1 se prebacuje na lokaciju 2, a na lokaciji 1 ostaje sveže kopiran/isečen sadržaj.
Da, i to ste shvatili - na ovaj "numerički način" ne možete birati numerisanu lokaciju da ubacite kopirani/isečen sadržaj - za to služe samo slovni baferi.
Dobra je ideja koja se krije iza ovoga. Ako nešto "jeknete" u memoriju, i zatreba vam kasnije, imate 9 pokušaja da se setite da zalepite Do not forget anything 9 times
Često korištene "dvotačka-komande" (Colon Commands, Ed/Ex Commands):
:w imeDatoteke --> čuvanje datoteke
:q --> izlazak iz datoteke
:q! --> izlazak iz datoteke poništavajući izmene
:e! --> ponovo učitava dokument, bez čuvanja izmena
:set nu --> prikazuje brojeve linija
:set nonu --> poništava prikaz s brojevima linija
:a,bd (gde su a i b dva broja) - briše linije od a zaključno sa b (:1,8d briše prvu liniju, zaključno s osmom, a vidiće se i napomena: 8 fewer lines u donjem levom uglu ekrana).
:set all - pregled svih podešavanja
:#',#'' co #''' - kopira linije od #' do #'' na lokaciju ispod #''' ; na primer 1,8 co 84 kopira linije od prve do osme, ispod linije 84.
:#',#'' m #''' - premešta linije od #' do #'' na lokaciju ispod #''' ; na primer :1,8 m 99 premešta linije od 1 do 8, na mesto ispod 99.
:n - otvara sledeću datoteku za obradu (ako je otvoreno više datoteka); ako dođemo do kraja niza, :rew "premotava" pokazivač na prvu datoteku.
:args - prikazuje ime tekućeg fajla (ako je otvoren), odnosno sve otvorene fajlove, redom.
:set ic - postavlja pretragu, zadatu preko komande "/" da ignoriše velika i mala slova (/mycity će da pronađe za rezultat i mycity i MyCity i sl.)
:!neka_komanda - izvršavanje komandi bez napuštanja Vi(m)-a.
Primer: :!dir će izlistati direktorijum bez napuštanja programa, :!date će izvršiti shell komadu i prikazati datum...
:sh - pokreće shell. Da bi se vratili u Vim, kucamo exit.
Još malo komandi
u - poništava (undo) poslednju komandu (ponovni pritisak na taster u će uraditi redo, dakle, poništiti undo)
U - poništava promene nad linijom u kojoj se nalazimo, u tekućoj sesiji !
. (tačka) - ponavljanje zadnje akcije (može se koristiti i batch mode, tipa 10.)
Važi i za uneti tekst, ukoliko ukucamo "MyCity forum" pa Esc i pritiskamo . , tekst će se prikazati više puta kroz linije.
mneko_slovo - markira tekuću liniju pod slovom neko_slovo (od a do z). Na primer ma markira tekuću liniju kao a. Poenta je da možete skoknuti na tu liniju u svaka doba koristeći 'a (tilda+tilda+a) ili umesto broja te linije iskoristiti tu referencu (primera radi, ako ukucamo d'a, briše se ta linija ili ako ukucamo y'a - janknućemo tu liniju u bafer i posle moći da je zalepimo preko p ).
~ (tilda) menja slovni karakter, označen kursorom, iz malog slova u veliko i obrnuto.
ZZ - spašava promene nad fajlom i izlazi iz fajla.
// dok ne bude ostalih dopuna, iščitajte dole literaturu
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
~
~
~
Napomene i Bonus:
- Prazne linije se prikazuju kao tilde (~). Dakle, ne vide se u dokumentu, te ne pokušavajte da ih obrišete.
- Koji su sve klonovi editora vi?
--> STvi (STevie), elvis, vile, vim, nvi, xvi... (evo linkova: 1, 2).
- + U kom smo režimu rada?If you type: "echo set showmode >> $HOME/.exrc" at the Unix command line, it will make is so that each time vi is started it will default to showing the mode on the bottom right of the screen.
- Mnemonik za pamćenje j/k - dole/gore: kada pišemo rukom - j zadire i ispod linije (dakle, kursor dole), a k iznad linija sveske (dakle, gore).
- + Reformatiranje tekstaIf your computer has the program fmt on it, all you need to do is
type !}fmt from command mode (without a : before it). This will
reformat the text from the current location until the end of the
paragraph. If your machine does not have fmt, you need to find a
similar program. (I gather there are many such programs available from
the public domain, but I do not know much about them.)
You may also want to look into par. Par is similar to fmt in
function, but has more feature. Par can be downloaded from:
http://www.cs.berkeley.edu/~amc/Par.
|