Przejdź do treści
Lekcja 12 z 117

Kurs › Moduł 1 › Lekcja 12

vi i vim bez paniki

⏱ ok. 9 min czytania· moduł 1: Praca w powłoce

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. d nie 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.conf
Port 22
PermitRootLogin yes
PasswordAuthentication yes
X11Forwarding yes
"sshd_test.conf" 4L, 73B                                      1,1           All

Na dole: nazwa pliku, 4 linijki, 73 bajty, kursor w linii 1, kolumnie 1. Tryb normalny.

Naciskam i. „i” jak „insert”, wstaw.

-- INSERT --                                                  1,8           All

Teraz 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:

  • :wq zapisz i wyjdź. „w” jak „write”.
  • :q! wyjdź bez zapisywania, wyrzuć zmiany. Wykrzyknik to „tak, wiem, co robię”.
  • :w tylko 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

  • i zaczynasz pisać przed kursorem.
  • a zaczynasz pisać za kursorem. „a” jak „append”, dopisz.
  • o robi nową linijkę pod bieżącą i od razu w niej piszesz. Duże O robi 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 yes

Nowa opcja wstawiona w jednym ruchu.

Usuwanie, kopiowanie, wklejanie, cofanie

Wszystko w trybie normalnym. Wciskasz Esc, zanim zaczniesz.

  • dd usuwa całą linijkę. Dokładniej: wycina, bo trafia do schowka.
  • yy kopiuje linijkę. „y” jak „yank”, szarpnij.
  • p wkleja pod kursorem. Duże P wkleja nad.
  • u cofa ostatnią zmianę. „u” jak „undo”. Ctrl+R przywraca.
  • x usuwa 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 22

Port 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:

/Root

Kursor 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 lines

Rozbieramy:

  • : tryb komend,
  • % w całym pliku,
  • s zamień, od „substitute”,
  • /yes/no/ co na co,
  • g wszystkie 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 number

Numery 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 pl

Interaktywny 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

GdzieKlawisz / komendaCo robi
zawszeEscwraca do trybu normalnego
normalnyi / apisz przed / za kursorem
normalnyo / Onowa linijka pod / nad
normalnyddwytnij linijkę
normalnyyykopiuj linijkę
normalnyp / Pwklej pod / nad
normalnyu / Ctrl+Rcofnij / ponów
normalnyxusuń znak
normalnygg / Gpoczątek / koniec pliku
normalny/tekstszukaj
normalnyn / Nnastępne / poprzednie trafienie
normalny3dd, 5yyliczba powtórzeń
komend:wzapisz
komend:qwyjdź
komend:wqzapisz i wyjdź
komend:q!wyjdź bez zapisu
komend:%s/a/b/gzamień a na b w całym pliku
komend:set numbernumery linii
powłokavim +N plikotwórz na linii N
powłokavimtutor plkurs 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

  1. Skopiuj /etc/passwd do swojego folderu jako passwd-test.
  2. Otwórz kopię w vimie i włącz numery linii.
  3. Znajdź linijkę ze swoim użytkownikiem przez /.
  4. Skopiuj ją yy i wklej trzy razy na końcu pliku.
  5. Zamień w całym pliku /bin/bash na /bin/zsh jedną komendą.
  6. Cofnij zamianę jednym klawiszem.
  7. 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-test

W vimie:

:set number
/^eryk
yy
G
p
p
p
:%s#/bin/bash#/bin/zsh#g
u
:wq

U 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 lines

A po u:

19 changes; before #4  0 seconds ago

Wszystkie 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.