Tech Handbook Null Yard

Vi, Vim, gVim i Neovim

Vi, Vim, gVim i Neovim należą do tej samej rodziny modalnych edytorów, ale różnią się zakresem funkcji i konfiguracji. Na minimalnym serwerze vi może wskazywać na różne implementacje, dlatego przed założeniem konkretnego zestawu funkcji warto sprawdzić vi --version, vim --version albo nvim --version.

Powiązane tematy: Debian - shell, FreeBSD - shell, SSH i zdalna administracja oraz Visual Studio Code.

1. Jak sprawdzić, z czym pracujesz

Na różnych systemach polecenie vi może uruchamiać klasyczne vi, Vim w wariancie minimalnym albo inną zgodną implementację.

Sprawdzenie:

command -v vi vim gvim nvim
vi --version
vim --version
nvim --version

Nie zakładaj, że vi na każdym serwerze ma ten sam zestaw funkcji.


2. Czego używać i kiedy

vi

Uruchomienie:

vi plik.conf

Używaj go przede wszystkim jako:

  • treningu bazowego vi,
  • edytora awaryjnego,
  • przygotowania do pracy na minimalnych systemach,
  • sposobu na poprawienie configu przez SSH,
  • wspólnego mianownika dla świata Unix/Linux.

To nie jest oryginalny historyczny vi, lecz zachowuje jego podstawowy model pracy.

vim

Uruchomienie:

vim plik.txt

Pełny Vim działający w terminalu.

W porównaniu z vi dostajesz m.in.:

  • lepsze kolorowanie składni,
  • więcej opcji,
  • więcej komend,
  • bufory,
  • splity,
  • taby,
  • makra,
  • pluginy,
  • rozbudowaną konfigurację.

Do normalnej pracy w CLI jest wygodniejszy od minimalnego vi.

gvim

Uruchomienie:

gvim plik.txt

To pełny Vim w graficznym oknie.

Dostajesz:

  • normalne okno GTK,
  • obsługę myszy,
  • integrację ze schowkiem systemowym,
  • menu,
  • łatwiejsze korzystanie na GNOME/KDE.

Wewnątrz nadal jest to Vim i obowiązuje ten sam model:

NORMAL -> INSERT -> NORMAL

oraz te same komendy typu:

i
Esc
dd
:w
:wq

nvim

Uruchomienie:

nvim plik.txt

Neovim to nowoczesny fork Vima.

Podstawowa obsługa pliku jest praktycznie taka sama jak w Vimie:

i
Esc
dd
yy
p
:w
:q
/

Największe różnice pojawiają się później:

  • nowocześniejsza architektura,
  • Lua do konfiguracji,
  • LSP,
  • Tree-sitter,
  • współczesny ekosystem pluginów,
  • łatwiejsze budowanie terminalowego IDE.

Do prostego edytowania configu różnica między Vimem a Neovimem jest niewielka.


3. Najważniejsza rzecz: tryby

Edytory z rodziny vi są modalne.

Po uruchomieniu pliku jesteś zwykle w trybie:

NORMAL

W nim klawisze są poleceniami.

Aby zacząć pisać:

i

Przechodzisz do:

INSERT

Aby wrócić:

Esc

Podstawowy rytm pracy:

NORMAL
  |
  | i
  v
INSERT
  |
  | Esc
  v
NORMAL

Jeżeli nie wiesz, w jakim jesteś trybie:

Esc

To najbezpieczniejszy odruch.


4. Otwieranie plików

vi plik.txt
vim plik.txt
gvim plik.txt
nvim plik.txt

Plik systemowy:

sudo vi /etc/example.conf

Nowy plik:

vim nowy.txt

Jeśli nie istnieje, zostanie utworzony przy zapisie.


5. Zapis i wyjście

Najważniejsze polecenia:

:w

zapisz plik.

:q

wyjdź.

:wq

zapisz i wyjdź.

:q!

wyjdź bez zapisywania zmian.

Najbezpieczniejszy schemat:

Esc
:wq
Enter

Jeśli zrobiłeś bałagan i chcesz porzucić wszystko:

Esc
:q!
Enter

Alternatywnie:

ZZ

w trybie NORMAL zapisuje plik i wychodzi.

Do nauki lepiej jednak używać:

:wq

6. Wchodzenie w tryb pisania

i

i

Insert - pisz przed kursorem.

a

a

Append - pisz za kursorem.

I

I

Pisz od początku tekstu w bieżącej linii.

A

A

Pisz na końcu bieżącej linii.

o

o

Utwórz nową linię poniżej i zacznij pisać.

O

O

Utwórz nową linię powyżej i zacznij pisać.

Najbardziej praktyczne na początku:

i
a
o
O

7. Poruszanie kursorem

Możesz używać strzałek.

Klasyczne sterowanie vi:

h   lewo
j   dół
k   góra
l   prawo

Przydatniejsze ruchy:

w   następne słowo
b   poprzednie słowo
e   koniec słowa

Początek i koniec linii:

0   początek linii
^   pierwszy niepusty znak linii
$   koniec linii

Początek i koniec pliku:

gg  początek pliku
G   koniec pliku

Konkretny numer linii:

50G

przejdź do linii 50.

W Vimie i Neovimie możesz również:

:50

8. Przewijanie

Ctrl-f   ekran w dół
Ctrl-b   ekran w górę
Ctrl-d   pół ekranu w dół
Ctrl-u   pół ekranu w górę

Na początku możesz zwyczajnie używać Page Up / Page Down, jeśli terminal poprawnie je obsługuje.


9. Usuwanie

Usuń znak pod kursorem:

x

Usuń całą linię:

dd

Usuń kilka linii:

3dd

Usuń słowo:

dw

Usuń od kursora do końca linii:

d$

Ważna zasada:

d + ruch

czyli:

dw   delete word
d$   delete to end of line

10. Cofanie i ponawianie

Cofnij:

u

Ponów:

Ctrl-r

W minimalnym vi / vim.tiny nie wszystkie zaawansowane mechanizmy undo muszą być tak rozbudowane jak w pełnym Vimie lub Neovimie.


11. Zmiana istniejącego tekstu

Zmiana słowa:

cw

Vim usuwa fragment i automatycznie przechodzi do INSERT.

Zmiana całej linii:

cc

Zmiana od kursora do końca linii:

C

Zastąp pojedynczy znak:

r

Przykład:

rX

zamieni znak pod kursorem na X.


12. Kopiowanie i wklejanie

W terminologii Vima kopiowanie to yank.

Kopiuj linię:

yy

Wklej:

p

Wklej przed kursorem:

P

Kopiuj słowo:

yw

Kopiuj kilka linii:

3yy

Usuń linię i wklej ją gdzie indziej:

dd

przejdź w inne miejsce:

p

W Vimie usuwanie również trafia do rejestru, dlatego dd + p działa jak wytnij/wklej.


13. Wyszukiwanie

Szukaj w dół:

/tekst

potem:

Enter

Następny wynik:

n

Poprzedni wynik:

N

Szukaj w górę:

?tekst

Przykład:

/PermitRootLogin

Bardzo przydatne w długich configach.


14. Zamiana tekstu

Zamiana pierwszego wystąpienia w bieżącej linii:

:s/stare/nowe/

Wszystkie wystąpienia w bieżącej linii:

:s/stare/nowe/g

W całym pliku:

:%s/stare/nowe/g

Z potwierdzeniem każdej zamiany:

:%s/stare/nowe/gc

To działa w pełnym Vimie i Neovimie.

W minimalnym vim.tiny część bardziej zaawansowanych możliwości może być ograniczona.


15. Liczby przed komendami

Wiele poleceń można poprzedzić liczbą.

Przykłady:

5j

pięć linii w dół.

3w

trzy słowa naprzód.

4dd

usuń cztery linie.

10x

usuń dziesięć znaków.

To jeden z najbardziej użytecznych mechanizmów vi.


16. Tryb VISUAL

Pełny Vim i Neovim mają tryb zaznaczania.

v

zaznaczaj znakami.

V

zaznaczaj całymi liniami.

Potem:

d   usuń
y   kopiuj
c   zmień

Przykład:

V
j
j
d

zaznaczy kilka linii i je usunie.

vim.tiny może mieć bardziej ograniczony zestaw funkcji niż pełny Vim.


17. Powtarzanie ostatniej zmiany

W Vimie i Neovimie:

.

powtarza ostatnią zmianę.

Przykład:

  • zmieniłeś jedno słowo,
  • przechodzisz do kolejnego podobnego miejsca,
  • naciskasz ..

To bardzo charakterystyczna i potężna funkcja Vima.


18. Praca z nawiasami

Skok między pasującymi nawiasami:

%

Działa m.in. dla:

()
[]
{}

Przydatne w kodzie i plikach konfiguracyjnych.


19. Operacje „wewnątrz” elementu

To jest już bardziej Vim niż klasyczne minimum vi.

Przykład:

ci"

change inside quotes.

Masz:

name="old"

ustawiasz kursor wewnątrz old:

ci"

i wpisujesz nową wartość.

Podobnie:

ci(
ci[
ci{

Usuń wnętrze:

di"
di(
di[
di{

Bardzo wygodne w Vimie i Neovimie.


20. Kilka plików

Vim / Neovim

Otwórz inny plik:

:e plik.txt

Lista buforów:

:ls

Następny bufor:

:bn

Poprzedni:

:bp

gVim

To samo działa w GUI.

vi / vim.tiny

Do prostych operacji lepiej traktować go jako edytor jednego pliku.


21. Splity

Pełny Vim / gVim / Neovim:

Poziomy:

:split plik.txt

krócej:

:sp plik.txt

Pionowy:

:vsplit plik.txt

krócej:

:vsp plik.txt

Przełączanie między oknami:

Ctrl-w h
Ctrl-w j
Ctrl-w k
Ctrl-w l

22. Tab-y

Pełny Vim / gVim / Neovim:

Nowy tab:

:tabnew

Otwórz plik w tabie:

:tabedit plik.txt

Następny tab:

gt

Poprzedni:

gT

W Vimie tab nie jest dokładnie tym samym, czym tab w Sublime czy przeglądarce. Jest raczej zestawem okien.


23. Uruchamianie poleceń shella

Pełny Vim / Neovim:

:!ls
:!git status
:!make
:!go test ./...

Powrót następuje po zakończeniu komendy.

Można również uruchomić shell:

:shell

Powrót:

exit

24. Numery linii

W Vimie / gVim / Neovim:

:set number

Wyłącz:

:set nonumber

Numery względne:

:set relativenumber

Przydatne do poleceń takich jak:

5j
3dd

25. Kolorowanie składni

Pełny Vim:

:syntax on

Neovim domyślnie zapewnia nowoczesne mechanizmy highlightingu i może być dodatkowo rozbudowany przez Tree-sitter.

gvim korzysta z tego samego mechanizmu co Vim, tylko renderuje go w GUI.

vim.tiny ma mniej funkcji niż pełny Vim.


26. Schowek systemowy

To ważne przy GUI.

gVim

Najwygodniejszy z całej rodziny Vima pod kątem klasycznego desktopowego schowka.

pełny Vim

Jeśli build ma obsługę clipboardu:

"+y

kopiuje do schowka systemowego.

"+p

wkleja ze schowka systemowego.

Sprawdzenie:

vim --version | grep clipboard

Neovim

Potrafi integrować się ze schowkiem systemowym, ale w środowisku Wayland/X11 może wymagać odpowiedniego programu pomocniczego, np. wl-clipboard.

vi / vim.tiny

Nie traktuj go jako narzędzia do wygodnej pracy ze schowkiem GUI.


27. Konfiguracja

vi / vim.tiny

Do treningu nie konfiguruj.

Ma przypominać środowisko minimalne.

Vim / gVim

Główny config:

~/.vimrc

Przykład:

set number
set tabstop=4
set shiftwidth=4
set expandtab
syntax on

gVim może dodatkowo używać:

~/.gvimrc

Neovim

Nowoczesny config:

~/.config/nvim/init.lua

lub starszy styl:

~/.config/nvim/init.vim

Przykład Lua:

vim.opt.number = true
vim.opt.tabstop = 4
vim.opt.shiftwidth = 4
vim.opt.expandtab = true

28. Najważniejsze różnice

Funkcja vi / vim.tiny Vim gVim Neovim
Terminal tak tak nie jako główny tryb tak
GUI nie nie tak przez osobne frontend-y
Tryby vi tak tak tak tak
Podstawowe komendy vi tak tak tak tak
Syntax highlighting ograniczony tak tak tak
Bufory ograniczone tak tak tak
Splity ograniczone tak tak tak
Taby ograniczone tak tak tak
Pluginy praktycznie nie tak tak tak
Lua nie nie jako główny model nie jako główny model tak
LSP nie pluginy pluginy nowoczesna integracja
Tree-sitter nie nie jako rdzeń nie jako rdzeń tak / integracja
Najlepsze zastosowanie awaria / minimum pełny CLI desktop GUI nowoczesny CLI/IDE

29. Co warto znać absolutnie na pamięć

Jeżeli masz znać tylko minimum do pracy z configiem:

i       pisz
a       pisz za kursorem
o       nowa linia poniżej
O       nowa linia powyżej

Esc     wróć do NORMAL

h       lewo
j       dół
k       góra
l       prawo

0       początek linii
$       koniec linii
gg      początek pliku
G       koniec pliku

x       usuń znak
dd      usuń linię
u       cofnij

/tekst  szukaj
n       następny wynik

:w      zapisz
:q      wyjdź
:wq     zapisz i wyjdź
:q!     wyjdź bez zapisu

30. Minimum trochę wygodniejsze

Kiedy podstawy wejdą w ręce, dodaj:

w       następne słowo
b       poprzednie słowo
dw      usuń słowo
cw      zmień słowo
yy      kopiuj linię
p       wklej
Ctrl-r  redo
.       powtórz zmianę

To już wystarcza do bardzo sprawnej edycji configów.


31. Typowy scenariusz edycji configu

Otwierasz:

sudo vi /etc/example.conf

Szukasz:

/hostname
Enter

Przechodzisz do odpowiedniego miejsca.

Edytujesz:

i

lub:

cw

Po zmianie:

Esc

Zapisujesz:

:w
Enter

Jeśli wszystko jest OK:

:q
Enter

albo od razu:

:wq
Enter

Jeśli coś poszło źle:

:q!
Enter

32. Najważniejszy model mentalny

Nie myśl:

Vim = dziwny Notatnik

Lepiej:

NORMAL = wydaję polecenia
INSERT = wpisuję tekst

Typowa operacja:

i
tekst
Esc
:wq

Po kilku dniach Esc zaczyna działać automatycznie.


33. Którego używać na co

Na obcym/minimalnym systemie:

vi

Na swoim Debianie w CLI:

nvim

lub:

vim

Jeżeli chcesz klasycznego Vima w GUI:

gvim

Jeżeli chcesz rozwijać własne nowoczesne środowisko programistyczne:

nvim

Dobra praktyka:

naucz się języka vi
używaj narzędzia, które jest najwygodniejsze

Dzięki temu potrafisz pracować zarówno na gołym FreeBSD przez SSH, jak i w pełnym środowisku desktopowym.


34. Ściąga końcowa

TRYBY
i       INSERT
Esc     NORMAL

RUCH
h j k l
w b
0 $
gg G

EDYCJA
x       usuń znak
dd      usuń linię
dw      usuń słowo
cw      zmień słowo
yy      kopiuj linię
p       wklej
u       undo
Ctrl-r  redo

SZUKANIE
/tekst
n
N

ZAPIS
:w
:q
:wq
:q!

PRZYDATNE
o       nowa linia poniżej
O       nowa linia powyżej
.       powtórz zmianę
%       pasujący nawias

PEŁNY VIM / NVIM
:e plik
:ls
:bn
:bp
:sp plik
:vsp plik
:tabedit plik
:!polecenie

Najważniejsze dwa zestawy ratunkowe:

Esc
:wq
Enter

oraz:

Esc
:q!
Enter

Oficjalne źródła

  • Vim documentation: https://www.vim.org/docs.php
  • Neovim documentation: https://neovim.io/doc/