vi za preživljavanje — režimi, kretanje i deset komandi koje su dovoljne

Pre nego što bilo šta drugo pročitaš, zapamti ovo:

Esc  :q!  Enter   — izlazak bez čuvanja izmena
Esc  :wq  Enter   — snimi i izađi

To je devedeset odsto razloga zbog kojih ljudi traže pomoć oko vi-ja. Ako si trenutno zaglavljen u editoru koji se otvorio sam od sebe — pritisni Esc, otkucaj :q! i pritisni Enter. Ostatak lekcije možeš u miru.

A zašto uopšte učiti editor koji izgleda neprijateljski? Zato što uvek postoji. Na svežoj instalaciji, na minimalnom kontejneru, na tuđem serveru u tri ujutru — nano možda nije instaliran, vi jeste. Ovo nije lekcija o tome kako da postaneš vim korisnik. Ovo je onaj minimum koji te izvlači iz svake situacije.

Zašto je vi čudan: režimi

Skoro svi editori koje znaš imaju jedan režim rada: kucaš i slova se pojavljuju. vi ima više režima, a razlog je istorijski — nastao je kad tastature nisu imale pouzdane Ctrl i Alt kombinacije, pa su same tipke morale da budu komande.

Za preživljavanje su ti dovoljna tri:

  • Komandni režim — u njemu editor startuje. Slova nisu tekst, nego naredbe. d briše, x briše znak, i prebacuje u unos.
  • Režim unosa — kucanje radi kako očekuješ. Ulaziš sa i, izlaziš sa Esc.
  • Ex režim — kucaš : i komanda se ispisuje u dnu ekrana. Tu žive :w, :q, pretraga i zamena.

Esc uvek vraća u komandni režim. Kad ne znaš gde si, pritisni Esc dvaput. To je nulti refleks — kao pwd kad ne znaš gde si u fajl sistemu.

Moderni vim u dnu ekrana ispiše -- INSERT -- kad si u režimu unosa. Ako te dva reda nema, u komandnom si režimu.

Otvaranje fajla

$ vi beleske.txt

Ako fajl ne postoji, vi otvara prazan bafer i napraviće ga tek kad snimiš. Na dnu piše ime i status:

"beleske.txt" 12L, 284B

Na većini distribucija vi je zapravo simbolički link na vim ili na vim-tiny — što je i lep primer linkova iz lekcije Inode-ovi i linkovi. Proveri sa:

$ readlink -f $(which vi)
/usr/bin/vim.basic

Deset komandi koje su dovoljne

Sve što sledi kucaš u komandnom režimu. Ako nisi siguran da si u njemu — Esc.

1. i — počni da kucaš

Ubacuje tekst ispred kursora. Postoji i a (iza kursora) i o (otvara nov red ispod), ali ti je dovoljan i.

2. Esc — prestani da kucaš

3. Strelice — kretanje

Klasični hjkl je efikasniji, ali strelice rade u svakom modernom vi-ju i jedna briga manje. Ako te zanima: h levo, j dole, k gore, l desno.

4. x — obriši jedan znak

5. dd — obriši ceo red

Ispred se može staviti broj: 5dd briše pet redova. Obrisano ide u međumemoriju, pa se sa p ubacuje ispod kursora — što je zapravo premeštanje reda.

6. u — poništi poslednju izmenu

Može više puta zaredom. Vraćanje poništenog je Ctrl+r.

7. /tekst Enter — pretraga

Traži unapred. n ide na sledeće pojavljivanje, N na prethodno. Ovo je najbrži način da se nađeš u dugom konfiguracionom fajlu.

8. :w — snimi

Snima i ostavlja te u editoru. Korisno usred dužeg rada.

9. :q i :q! — izlaz

:q radi samo ako nema nesnimljenih izmena. Ako ih ima, dobićeš:

E37: No write since last change (add ! to override)

Uzvičnik znači „znam šta radim, odbaci izmene".

10. :wq — snimi i izađi

Isto radi i ZZ u komandnom režimu, bez dvotačke.

To je to. Sa ovih deset komandi možeš da izmeniš bilo koji konfiguracioni fajl na bilo kom serveru.

Još pet koje se brzo isplate

  • gg — na početak fajla
  • G — na kraj fajla
  • :42 Enter — skoči na 42. red (ovako se lovi red iz poruke o grešci)
  • 0 i $ — početak i kraj reda
  • :%s/staro/novo/g — zameni svuda u fajlu

Poslednja komanda ima istu logiku kao sed, i to nije slučajnost — sed je nastao iz istog porodičnog stabla. Ako želiš potvrdu za svaku zamenu, dodaj c:

:%s/8080/9090/gc

Situacije u kojima ćeš zaista naleteti na vi

Otvorio se sam, a ti nisi tražio

Najčešće preko visudo, crontab -e ili git commit poruke. Sve troje podrazumevano koriste vi ako promenljiva EDITOR nije postavljena:

$ echo $EDITOR

$ export EDITOR=nano

Prazan ispis znači da nije postavljena. Ako hoćeš trajno, red ide u ~/.bashrc. Ali savet: nemoj bežati od vi-ja na tuđim serverima, jer tamo tvoj .bashrc ne postoji.

Fajl je samo za čitanje

Otvorio si sistemski fajl bez sudo, sve si izmenio i onda:

E45: 'readonly' option is set (add ! to override)

Ne moraš da izgubiš posao. Ovaj red snima kroz sudo, iz samog vi-ja:

:w !sudo tee % > /dev/null

Zvuči kao magija, ali su to poznate komande: % je ime tekućeg fajla, sadržaj se šalje kroz tee pokrenut sa sudo pravima, a ispis se odbacuje u /dev/null. Posle toga vi pita da li da ponovo učita fajl — odgovori L. Ovo je i lep podsetnik na lekciju Piping i redirekcija.

Poruka o swap fajlu

E325: ATTENTION
Found a swap file by the name ".sshd_config.swp"
Swap file ".sshd_config.swp" already exists!
[O]pen Read-Only, (E)dit anyway, (R)ecover, (D)elete it, (Q)uit, (A)bort:

Ovo znači da je prethodna sesija prekinuta — pukla veza, zatvoren terminal, pao server. vi je čuvao radnu kopiju izmena.

  • Ako si siguran da niko drugi ne uređuje fajl i da ti izmene ne trebaju: D pa nastavi normalno.
  • Ako su ti izmene bitne: R, pa snimi, pa obriši .swp fajl.
  • Ako neko drugi trenutno uređuje isti fajl: O ili Q, i pitaj kolegu.

Zaostale swap fajlove nalaziš ovako:

$ ls -a /etc/ssh
.  ..  .sshd_config.swp  sshd_config  ssh_config

Slova se ne kucaju, nego se dešavaju čudne stvari

U komandnom si režimu. Pritisni i. Ako si u međuvremenu napravio štetu — u više puta.

Druga varijanta: uključen Caps Lock. U vi-ju velika i mala slova su različite komande, pa J spaja redove umesto da ide dole, a D briše do kraja reda. Ako se editor „ponaša neobjašnjivo“, proveri Caps Lock pre svega ostalog.

Kopiranje iz browsera pravi stepenice

ime:
    prvo
        drugo
            trece

Krivo je automatsko uvlačenje koje se primenjuje i na već uvučen tekst. Rešenje pre lepljenja:

:set paste

Nalepi, pa :set nopaste. Neophodno kod YAML fajlova, gde uvlačenje nosi značenje.

Minimalni ~/.vimrc

Na sopstvenoj mašini, ova četiri reda čine razliku:

set number
set hlsearch
set ignorecase
syntax on

Redom: brojevi redova, isticanje rezultata pretrage, pretraga bez razlike velikih i malih slova, i bojenje sintakse. Namerno ništa više — poenta je da ti vi radi isto i tamo gde ovog fajla nema.

Isključivanje isticanja posle pretrage: :noh.

Kad si zaista u nevolji

Neke sisteme prati samo vi iz busybox-a, bez vim proširenja. Tamo ne rade ni u kroz istoriju ni :set paste. Ipak rade: i, Esc, x, dd, :w, :q! — dakle sve iz spiska od deset.

Ako te zanima da naučiš više, u sistemu već postoji kompletan kurs:

$ vimtutor

Traje oko trideset minuta i radi se direktno u editoru. Nema boljeg utrošenog pola sata za nekoga ko će raditi po serverima. Podsetnik na to kako se čita ostatak dokumentacije je na stranici man.

Kratka referenca

  • Esc — nazad u komandni režim
  • i — unos teksta
  • x — obriši znak · dd — obriši red · p — nalepi
  • u — poništi · Ctrl+r — vrati poništeno
  • /tekst — traži · n / N — sledeće / prethodno
  • gg / G — početak / kraj fajla · :42 — na 42. red
  • :%s/staro/novo/g — zameni svuda
  • :w — snimi · :q — izađi · :wq — snimi i izađi
  • :q! — izađi bez čuvanja
  • :w !sudo tee % > /dev/null — snimi fajl otvoren bez sudo

Vežba

Napravi bezopasnu kopiju pravog konfiguracionog fajla i radi na njoj:

$ cp /etc/ssh/sshd_config ~/vezba.conf
$ vi ~/vezba.conf

Redom:

  1. Skoči na kraj fajla, pa na početak.
  2. Pronađi red koji sadrži Port, bez pomeranja strelicama.
  3. Obriši taj red, pa ga vrati.
  4. Dodaj na kraj fajla red #moja izmena.
  5. Zameni svako pojavljivanje reči yes sa no, pa sve to poništi.
  6. Izađi bez čuvanja — pa proveri sa diff da fajl zaista nije diran:
$ diff ~/vezba.conf /etc/ssh/sshd_config
$

Prazan ispis znači da si sve uradio kako treba.


Poređenje vi-ja sa nano editorom i kad koji ima smisla ima na stranici Tekstualni editori.

Cela lekcija je deo vodiča Linux osnove.

Comments

Popular posts from this blog

Početak u Linuxu — šta je i zašto se uči

Konverzija tipova podataka u Pythonu

groupadd