vi i vim bez paniki
Po tej lekcji: kursant rozumie tryby vima, umie wejść w pisanie, wrócić, zapisać, wyjść (także bez zapisu), usuwać, kopiować i wklejać linijki, cofać zmiany, szukać i zamieniać tekst, a dalej uczy się sam w vimtutor.
Wstęp
Wpisujesz vi plik.txt. Ekran pełen tyld. Zaczynasz pisać „Dzień dobry”. Kursor skacze, coś znika, gdzieś się pojawia „D”. Panika. Ctrl+C. Na dole napis: Type :qa! and press <Enter> to abandon all changes and exit Vim. Jakby z Ciebie kpił.
A teraz druga scena. Doświadczony admin w vimie: trzy klawisze i linijka zniknęła. Dwa i wróciła. Jeden znak i plik zapisany. Wygląda jak magia, a to tylko kilkanaście skrótów. Dziś poznasz te, które wystarczą, żeby przeżyć. Resztę doda czas.
Czemu w ogóle vi
Dlaczego uczyć się czegoś, co na start wygląda jak zemsta programistów? Bo vi jest wszędzie. Standard uniksowy, POSIX i Single UNIX Specification, opisuje go z nazwy, więc systemy zgodne ze standardem praktycznie zawsze go mają. Serwer w chmurze, router, stary Unix w banku, minimalny kontener ratunkowy: nano może nie być, vi będzie prawie na pewno.
vi napisał Bill Joy w 1976 roku, jeszcze jako doktorant na uniwersytecie w Berkeley. Vim, czyli „Vi IMproved”, ulepszony vi, to jego młodszy, rozbudowany następca, którego autorem był Bram Moolenaar. Na większości Linuxów, kiedy wpisujesz vi, i tak uruchamia się vim, tylko w mniejszej wersji.
[Ubuntu] Na Ubuntu vi to zwykle okrojony vim. Pełną wersję dostaniesz przez sudo apt install vim. [RHEL] Na Red Hacie vi pochodzi z pakietu vim-minimal, a pełny vim to sudo dnf install vim-enhanced.
Tryby: jeden pilot, trzy przyciski zmiany kanału
Cała tajemnica vima to tryby. Wyobraź sobie pilota od telewizora, który ma przycisk „tryb klawiatury”. W jednym trybie przyciski przełączają kanały. W drugim te same przyciski piszą litery. Jak nie wiesz, w którym trybie jesteś, naciskasz „5” i zamiast kanału piątego wpisujesz piątkę w wyszukiwarkę. Właśnie to dzieje się z początkującymi w vimie.
Vim ma trzy tryby, które musisz znać:
- Tryb normalny: tu startujesz. Klawisze to komendy.
dnie wpisuje litery „d”, tylko znaczy „usuń”. To jest pilot w trybie kanałów. - Tryb wstawiania: tu piszesz tekst, jak w Notatniku. Na dole widać
-- INSERT --. - Tryb komend: po naciśnięciu dwukropka. Na dole ekranu pojawia się
:i piszesz polecenie, na przykład zapisz albo wyjdź.
I jedna złota zasada: Esc zawsze wraca do trybu normalnego. Zgubiłeś się? Esc. Nie wiesz, co się dzieje? Esc dwa razy. Esc to Twój koc ratunkowy.
Pierwsze wejście i wyjście
Zaczynamy od tego, czego wszyscy się boją. Otwieram plik:
vim sshd_test.confPort 22
PermitRootLogin yes
PasswordAuthentication yes
X11Forwarding yes
"sshd_test.conf" 4L, 73B 1,1 AllNa dole: nazwa pliku, 4 linijki, 73 bajty, kursor w linii 1, kolumnie 1. Tryb normalny.
Naciskam i. „i” jak „insert”, wstaw.
-- INSERT -- 1,8 AllTeraz piszę jak w każdym edytorze. Dopisuję na początku # test . Koniec pisania: Esc. Napis INSERT znika, jestem w trybie normalnym.
Teraz wyjście. Dwukropek, q jak „quit”, Enter:
E37: No write since last change (add ! to override)Vim nie wypuszcza, bo są niezapisane zmiany. I tu się zaczyna legendarna panika. A wystarczy przeczytać: „dodaj wykrzyknik, żeby wymusić”. Masz trzy wyjścia ewakuacyjne:
:wqzapisz i wyjdź. „w” jak „write”.:q!wyjdź bez zapisywania, wyrzuć zmiany. Wykrzyknik to „tak, wiem, co robię”.:wtylko zapisz i zostań.
Zapisz sobie to na karteczce: Esc, dwukropek, q, wykrzyknik, Enter. Z tym jednym zdaniem nigdy nie utkniesz w vimie. Możesz już oficjalnie mówić, że umiesz wyjść z vima. Część programistów z dziesięcioletnim stażem nie może.
Wejście do pisania na trzy sposoby
izaczynasz pisać przed kursorem.azaczynasz pisać za kursorem. „a” jak „append”, dopisz.orobi nową linijkę pod bieżącą i od razu w niej piszesz. DużeOrobi linijkę nad.
o jest najczęściej używany w plikach konfiguracyjnych. Stoisz na linijce PermitRootLogin yes, naciskasz o, piszesz MaxAuthTries 3, Esc:
1 PermitRootLogin yes
2 MaxAuthTries 3
3 PasswordAuthentication yesNowa opcja wstawiona w jednym ruchu.
Usuwanie, kopiowanie, wklejanie, cofanie
Wszystko w trybie normalnym. Wciskasz Esc, zanim zaczniesz.
ddusuwa całą linijkę. Dokładniej: wycina, bo trafia do schowka.yykopiuje linijkę. „y” jak „yank”, szarpnij.pwkleja pod kursorem. DużePwkleja nad.ucofa ostatnią zmianę. „u” jak „undo”. Ctrl+R przywraca.xusuwa jeden znak pod kursorem.
Pokaz: na pierwszej linijce dd, potem G, czyli skok na koniec pliku, i p:
1 PermitRootLogin yes
2 PasswordAuthentication yes
3 X11Forwarding yes
4 Port 22Port 22 przeniesione z góry na dół. Dwie litery i jedna. To jest moment, w którym vim zaczyna się podobać.
A teraz uwaga: liczby. 3dd usuwa trzy linijki. 5yy kopiuje pięć. gg skacze na początek pliku, G na koniec, a 10G do linii dziesiątej. Vim to język: liczba, czasownik, rzeczownik. „Trzy razy usuń linijkę”. Jak zamówienie w barze: „dwa razy pierogi”.
Szukanie: /szukaj i n
W trybie normalnym ukośnik, słowo, Enter:
/RootKursor skacze do pierwszego Root. n następne trafienie, N poprzednie. Ukośnik to, nawiasem mówiąc, ta sama komenda co w less i w man. Nauczysz się raz, używasz w trzech miejscach.
Zamiana: :%s/a/b/g
Teraz najmocniejsze narzędzie w tej lekcji:
:%s/yes/no/g 1 Port 22
2 PermitRootLogin no
3 PasswordAuthentication no
4 X11Forwarding no
3 substitutions on 3 linesRozbieramy:
:tryb komend,%w całym pliku,szamień, od „substitute”,/yes/no/co na co,gwszystkie trafienia w linijce, a nie tylko pierwsze.
Bez % zamiana działa tylko w bieżącej linijce. Dopisz na końcu c, czyli :%s/yes/no/gc, a vim przy każdym trafieniu zapyta „zamienić?”. Przy plikach konfiguracyjnych to dobry nawyk, bo yes może siedzieć też w komentarzu, którego nie chcesz ruszać.
Numery linii: :set number
:set numberNumery po lewej. :set nonumber je chowa. Żeby były zawsze, dopisz set number do pliku ~/.vimrc. A plik od razu na konkretnej linii otworzysz tak jak w nano: vim +37 plik.
Jak to działa pod spodem
Vim nie pisze od razu w Twoim pliku. Wczytuje go do pamięci, do bufora, a obok zakłada plik wymiany: ukryty plik .nazwa.swp w tym samym folderze. Tam na bieżąco odkłada Twoje zmiany. Jeśli zerwie się połączenie SSH albo padnie prąd, z pliku wymiany odzyskasz pracę. Dopiero :w zapisuje bufor do prawdziwego pliku.
A tryby? To po prostu stan programu. Ten sam klawisz d trafia do vima, a vim patrzy: jestem w trybie normalnym, więc to komenda. Jestem w trybie wstawiania, więc to litera. Pomysł z czasów, kiedy łącza do serwera były tak wolne, że każdy znak się liczył. Zamiast myszki i strzałek wystarczyła jedna litera. Do dziś to najszybszy sposób edycji przez słabe łącze. I dlatego klawisze h, j, k, l w vimie przesuwają kursor: lewo, dół, góra, prawo. Bill Joy pracował na terminalu ADM-3A, a tam strzałki były narysowane właśnie na tych klawiszach.
Nauka dalej: vimtutor
vimtutor plInteraktywny kurs vima, po polsku, w samym vimie. Około pół godziny. Uczy przez robienie, poprawiasz błędy w tekście, który sam Cię prowadzi. Jeśli masz zrobić z tej lekcji jedną rzecz, zrób vimtutor. Jeśli komendy vimtutor nie ma, doinstaluj pełnego vima pakietem z początku lekcji.
Ściąga flag
| Gdzie | Klawisz / komenda | Co robi |
|---|---|---|
| zawsze | Esc | wraca do trybu normalnego |
| normalny | i / a | pisz przed / za kursorem |
| normalny | o / O | nowa linijka pod / nad |
| normalny | dd | wytnij linijkę |
| normalny | yy | kopiuj linijkę |
| normalny | p / P | wklej pod / nad |
| normalny | u / Ctrl+R | cofnij / ponów |
| normalny | x | usuń znak |
| normalny | gg / G | początek / koniec pliku |
| normalny | /tekst | szukaj |
| normalny | n / N | następne / poprzednie trafienie |
| normalny | 3dd, 5yy | liczba powtórzeń |
| komend | :w | zapisz |
| komend | :q | wyjdź |
| komend | :wq | zapisz i wyjdź |
| komend | :q! | wyjdź bez zapisu |
| komend | :%s/a/b/g | zamień a na b w całym pliku |
| komend | :set number | numery linii |
| powłoka | vim +N plik | otwórz na linii N |
| powłoka | vimtutor pl | kurs vima po polsku |
⚠ Typowy błąd
Otwierasz plik i zamiast tekstu wita Cię ściana:
E325: ATTENTION
Found a swap file by the name ".sshd_test.conf.swp"
owned by: root dated: Tue Nov 03 16:33:56 2026
modified: no
process ID: 29546 (STILL RUNNING)
...
Swap file ".sshd_test.conf.swp" already exists!
[O]pen Read-Only, (E)dit anyway, (R)ecover, (Q)uit, (A)bort:To plik wymiany, o którym przed chwilą mówiłem. Vim mówi: ktoś już edytuje ten plik, albo poprzednia sesja się wysypała. Najważniejsza linijka to process ID. Jeśli jest dopisek STILL RUNNING, ten plik jest właśnie otwarty w innym oknie. Może u Ciebie, może u kolegi na tym samym serwerze. Naciśnij Q i najpierw sprawdź, kto edytuje. Dwie osoby edytujące ten sam plik konfiguracyjny to przepis na sytuację, w której wygrywa ten, kto zapisze ostatni.
Jeśli STILL RUNNING nie ma, poprzednia sesja padła, na przykład przez zerwane SSH. Wtedy R odzyska zmiany z pliku wymiany. Po sprawdzeniu, że wszystko jest w porządku, usuń stary plik .swp, inaczej vim będzie pytał przy każdym otwarciu.
I drugi częsty: edytujesz plik z /etc bez uprawnień, :w i:
E45: 'readonly' option is set (add ! to override)Tu wykrzyknik nie pomoże, bo problemem są klucze do pokoju, a nie vim. Zapisz pracę gdzie indziej, :w /tmp/kopia, wyjdź i otwieraj takie pliki przez sudoedit z poprzedniej lekcji. Po export EDITOR=vim otworzy Ci się vim. I jak zawsze przy plikach systemowych: najpierw kopia, a ćwiczenia na maszynie wirtualnej.
✎ Zadanie
- Skopiuj
/etc/passwddo swojego folderu jakopasswd-test. - Otwórz kopię w vimie i włącz numery linii.
- Znajdź linijkę ze swoim użytkownikiem przez
/. - Skopiuj ją
yyi wklej trzy razy na końcu pliku. - Zamień w całym pliku
/bin/bashna/bin/zshjedną komendą. - Cofnij zamianę jednym klawiszem.
- Zapisz i wyjdź. Potem przejdź pierwsze dwie lekcje
vimtutor pl.
Podpowiedź do punktu 5: w zamianie ukośnik oddziela części, a w ścieżce też są ukośniki. Vim pozwala użyć innego separatora, na przykład #.
Pokaż rozwiązanie
cp /etc/passwd ~/passwd-test
vim ~/passwd-testW vimie:
:set number
/^eryk
yy
G
p
p
p
:%s#/bin/bash#/bin/zsh#g
u
:wqU siebie zamiast eryk wpisz swoją nazwę użytkownika. Daszek ^ w szukaniu znaczy „na początku linijki”, żeby nie trafić na Twoją nazwę gdzieś w środku cudzej linijki. Po zamianie vim napisał u mnie:
19 substitutions on 19 linesA po u:
19 changes; before #4 0 seconds agoWszystkie zamiany cofnięte jednym klawiszem, bo cała komenda :%s to dla vima jedna zmiana. Najważniejszy trik to # zamiast / w zamianie. Ze zwykłym ukośnikiem musiałbyś pisać :%s/\/bin\/bash/\/bin\/zsh/g. Wygląda jak płot po wichurze i tak samo łatwo się w nim pomylić.
Co dalej
Edytory już masz. A co, jeśli chcesz po prostu przenieść kilkadziesiąt plików, przejrzeć foldery i coś skopiować, ale bez wpisywania ścieżek? W następnej lekcji Midnight Commander: dwa panele, klawisze funkcyjne i zarządzanie plikami jak w latach dziewięćdziesiątych, tylko że na serwerze z 2026 roku.