VIM Tutorial
W tym tutorialu staram się podać najbardziej podstawowe polecenia używane w VIM'ie, w nagłówkach każdej sekcji w nawiasie podam w jakim trybie trzeba
je wpisywać. Tryby te to: NORMAL, INSERT, VISUAL. Z trybu NORMAL do trybu INSERT przełączamy się poprzez i lub inne z wymienionych klawiszy w sekcji
Edycja tekstu -> Dodawanie tekstu. Z trybu NORMAL do trybu VISUAL przełączamy się (oraz wyłączamy tryb VISUAL) poprzez klawisz v. Z trybu INSERT/VISUAL do trybu NORMAL przełączamy się za pomocą klawisza ESC.
ZAŁOŻENIA:
- Wiesz co to tryby VIM'a. Jeśli nie, to odsyłam Cię do Wikipedii, albo man vim :)
- Wszystkie polecenia zaczynające się od dwukropka (:) zakończone są naciśnięciem klawisza ENTER!
- W nawiasach < > wpisane są nazwy przycisków klawiatury! (np. <ENTER>, <HOME>, itd.)
Wszystkie te polecenia (oraz dużo dużo więcej) możesz znaleść w dokumentacji, poprostu zebrałem je w jedną całość, w razie gdyby ktoś zapomniał i nie chciało mu się specjalnie szukać :)
- Wchodzenie do VIM'a (przez konsole):
- vim - Otwiera VIM'a (bez skojarzonego pliku). Podczas zapisu trzeba będzie podać nazwę pliku, patrz :w nazwa poniżej.
- vim nazwa.txt - Otwiera VIM'a wraz ze skojarzonym plikiem (użyteczne podczas pisania kodu np w C, php, html, itp., gdy wpiszmy odrazu nazwe pliku i rozszerzenie (np 1.c) oraz gdy opcja kolorowania składni będzie włączona, VIM automatycznie będzie kolorował składnie dla danego typu plików), podczas zapisu wystarczy :w.
- vim plik1 plik2 - Otwieranie z powłoki systemowej dwóch plików: plik1, plik2.
- vim *.c - Otwieranie z powłoki systemowej wszystkich plików z rozszerzeniem .c.
- Wychodzenie z VIM'a (-- NORMAL --):
- :q - Zamyka plik pod warunkiem, że nie był zmodyfikowany, jeśli był, patrz niżej.
- :q! - Zamyka plik bez zapisywania zmian.
- :w - Zapisuje zmiany.
- :w nazwa - Zapisuje zmiany do pliku o nazwie 'nazwa'.
- :wq - Zapisuje zmiany i zamyka plik.
Gdy edytujemy jeden plik, możemy zapisać i zakończyć używając polecenia :wq i włączyć drugi plik do edycji za pomocą vim plik2, gdzie plik2 to nazwa drugiego pliku. VIM oferuje inne, wygodniejsze rozwiązanie.
- :vi plik2, gdzie plik2 to nazwa drugiego pliku. Włączamy to z poziomu vima, edytując plik pierwszy. Jeśli nie zapiszemy zmiań w pliku pierwszym, VIM nas o tym poinformuje.
- :vi! plik2, gdzie plik2 to nazwa drugiego pliku. Plik, który aktualnie edytujemy zostanie zamknięty, bez zapisywania ostatnio dokonanych zmian. Oraz zostanie włączony plik2 do edycji.
- :e plik2 Działa dokładnie tam samo, jak powyższe polecenie :vi plik2
- :view plik2 Działa prawie tak samo jak polecenia wyżej (:vi plik2, :e plik2) z tym, że plik2 zostanie otwarty tylko do odczytu.
- Poruszanie się (-- NORMAL --):
- h / strzalka w lewo (również -- INSERT --) - lewo
- l / strzalka w prawo (również -- INSERT --) - prawo
- j / strzalka w dół (również -- INSERT --) - dół
- k / strzałka do góry (również -- INSERT --) - góra
- 0 / <HOME> - Przesuwa kursor na początek
- $ / <END> - Przesuwa kursor na koniec
- <^> - Przesuwa kursor na pierwszy nie-biały znak, np w zdaniu " Ala ma kota", kursor zostanie ustawiony na literę 'A'
- w - Przesuwa kursor na początek następnego wyrazu
- e - Przesuwa kursor na koniec następnego wyrazu
- b - Przesuwa kursor na początek poprzedniego wyrazu
- ge - Przesuwa kursor na koniec poprzedniego wyrazu
- gg - Przesuwa kursor do pierwszego wiersza w pliku
- G - Przesuwa kursor do ostatniego wiersza w pliku
- :n - Przesuwa kursor do wiersza n - tego (:12 - Przesuwa kursor do wiersza 12).
- nG - gdzie n to numer wiersza. Działanie takie samo jak :n (np 30G - przeniesie do 30 wiersza)
- :$ - To samo co G.
- CTRL-G - Pokazuje położenie w pliku i status pliku
- CTRL-U - Przesuwa ekran o połowę tekstu do góry.
- CTRL-D - Przesuwa ekran o połowę tekstu w dół.
- :next - Przechodzi do następnego pliku, pod warunkiem, że plik aktualny nie był zmodyfikowany, jeśli był, VIM pokaże ostrzeżenie.
- :previous - Analogicznie do polecenia wyżej, tylko, że przechodzi do poprzedniego pliku.
- :wnext - Przechodzi do następnego pliku, oraz zapisuje aktualnie edytowany plik.
- :wprevious - Analogicznie do polecenie wyżej, tylko, że przechodzi do poprzedniego pliku.
- :next! - Przechodzi do następnego pliku, nie zapisując zmian jakie zostały zrobione w aktualnym pliku.
- :previous! - Analogicznie do polecenia wyżej, tylko, że przechodzi do poprzedniego pliku.
- :2next - Przesuwa się nie na następny a jeden dalej plik. Analogicznie istnieją opcję w tył, w przód z/bez zapisu.
- :args - Pokazuje otwarte pliki, oraz w nawiasach kwadratowych, aktualnie edytowany plik, np. plik1.txt [plik2.txt] plik3.txt
- :rewind - Przenosi do pierwszego otwartego pliku (zakladamy, że mamy otwartych kilka plików) nie ważne, który aktualnie plik edytujemy.
- :first - To samo co wyżej.
- :last - Przenosi do ostatniego otwartego pliku (zakładamym, że mamy otwartych kilka plików) nie ważne, który aktualnie plik edytujemy.
- Mnożniki dla ruchu (-- NORMAL --):
- Można zastosować mnożnik ruchu, który pozwoli przesunąć kursor o większą ilość wyrazów, np.
- 2w - Przesuwa kursor na początek 2 wyrazu w prawo (licząc od pozycji kursora).
- 2e - Przesuwa kursor na koniec 2 wyrazu w prawo (licząc od pozycji kursora).
- 2b - Przesuwa kursor na początek 2 wyrazu w lewo (licząc od pozycji kursora).
- 2ge - Przesuwa kursor na koniec 2 wyrazu w lewo (licząc od pozycji kursora). itp, itd.
- 9k - Przesuwa kursor o 9 pozycji w górę (równoważne z: kkkkkkkkk)
- 3j - Przesuwa kursor o 3 pozycje w dół (równoważne z: jjj)
- 5l - Przesuwa kursor o 5 pozycji w prawo (równoważne z: lllll)
- 2h - Przesuwa kursor o 2 pozycje w lewo (równoważne z: hh)
- Edycja tekstu (-- NORMAL --):
- Dodawanie tekstu:(-- NORMAL --)
- i - Wstawianie tekstu przed kursorem.
- a - Wstawianie tekstu za kursorem.
- A - Wstawianie tekstu na końcu linii.
- o - Wstawianie tekstu do nowej (następnej) linii.
- O - Wstawianie tekstu do nowej (poprzedniej) linii.
- Mnożniki używane podczas wstawiania tekstu są bardzo użyteczne. Np, jeśli chciałbyś wstawić 10 liter 'A' obok siebie, lub każda w nowym wierszu, oczywiście możesz to wpisywać ręcznie, ale VIM udostępnia mnożniki, tak więc, aby wpisać 10 liter 'A' szybciej, przejdź do trybu NORMAL oraz:
- 10iA<ESC> - Wstawienie 10 liter 'A' za kursorem
- 10oFraza<ESC> - Wstawienie 10 wyrazów 'Fraza', każdy w nowej linii. Zauważ, że po naciśnięciu '10o' VIM przechodzi w tryb INSERT, co za tym idzie, wszystko co wpiszesz, po naciśnięciu ESC zostanie skopiowane tyle razy ile podałeś w poleceniu (tutaj 10 razy).
- Kopiowanie i wklejanie tekstu (-- NORMAL -- / -- VISUAL --):
- y - Operator kopiowania, używać go można w trybie wizualnym (opisany na dole), lub z operatorami ruchu.
- yw - Kopiuje jeden wyraz
- y3w - Kopiuje 3 wyrazy
- :ny - Gdzie n to numer wiersza, np. :30y - Skopiuje wiersz 30.
- p - Operator wklejania.
- np - Gdzie n to wielokrotność kopiowanego tekstu, np. 10p - Wkleji 10 razy, to co zostało skopiowane.
- Łączenie linii (-- NORMAL --):
- J - Łaczy 2 linie (kursor trzeba ustawić na najwyższej). Pomiędzy liniami dodaje spacje
- 5J - Łaczy 5 linii, między każdą dodaje spacje.
- Usuwanie tekstu (-- NORMAL --):
- x / del - Usuwa znak pod kursorem.
- dw - Usunięcie jednego wyrazu do pierwszego znaku nowego wyrazu (innymi słowami: usuwa wyraz i spacje przed następnym wyrazem).
- de - Usunięcie jednego wyrazu do ostatniego znaku usuwanego wyrazu (innymi słowami: usuwa tylko wyraz a spacja przed następnym wyrazem zostaje).
- d$ - Usunięcie tekstu od kursora do końca linii.
- dd - Usunięcie całego wiersza niezależnie od położenia kursora.
- Mnożniki: (-- NORMAL --)
- Mnożniki dla edycji tekstu działają właściwie tak samo, jak mnożniki ruchu.
- d2e - Usunięcie 2 wyrazów.
- d2w - Usunięcie 2 wyrazów (różnice pomiędzy de i dw zostały opisane wyżej).
- d3d - Usunięcie 3 linii, itp. itd.
- Oznaczenie (Mark) (-- NORMAL --):
- ma - 'm' to operator zaznaczenia, 'a' to tak jakby miejsce zaznaczenia. Można wybrać zamiast 'a' litery od a do z. Operator zaznaczenia przydaje się np do usuwania znaczniej ilości bloków tekstu.
- 'a - Po tym jak zaznaczymy pewne miejsce przez operator 'm', to odwołujemy się do niego poprzez 'a (apostrof a, jak wyżej wspomniano, zamiast a, może być inna litera alfabetu).
- d'a - Dzięki takiej konstrukcji, VIM usuwa wszystko od miejsca zaznaczenia (ma) do miejsca, w którym znajduje się kursor
- y'a - Dzięki takiej konstrukcji, VIM kopiuje wszystko od miejsca zaznaczenia (ma) do miejsca, w którym znajduje się kursor
- :marks - Pokazuje listę wszystkich zaznaczeń.
- :marks args - Zamiast 'args' możesz wpisać konretne zaznaczenie, np. a, b, itp., które chcesz zobaczyć. Lub wpisać to polecenie tak jak jest, razem z args.
- Cofanie (-- NORMAL --):
- u - Cofa skutki ostatniego polecenia
- U - Cofa skutki dla całej linii
- CTRL-R - Cofa cofnięcia, innymi słowy: Cofnij/Do przodu.
- Wstawianie (-- NORMAL --):
- p - Wstawia ostatnio usunięte / skopiowane znaki.
- Zamienianie (-- NORMAL --):
- r - Po naciśnięciu tego klawisza VIM czeka, aż podasz znak, na który ma zamienić wskazywany przez kursor znak.
- 5ra - Zamienia 5 znaków na prawo od aktualnej pozycji kursora na literę 'a'.
- R - Zamienia więcej niż jeden znak, działa na takiej samej zasadzie, jakbyś pisał z wciśniętym insertem (przycisk na klawiaturze, nie tryb pracy VIM'a).
- ce - Usuwa wyraz od miejsca wskazywanego przez kursor do końca wyrazu, przechodzi w tryb INSERT i czeka na wprowadzenie wyrazu.
- cw - Prawie to samo co ce, różnica jest taka sama jak pomiędzy de i dw.
- c$ - Usuwa linie od miejsca wskazywanego przez kursor do końca linii, przechodzi w tryb INSERT i czeka na wprowadzenie wyrazu.
- Mnożniki również tu występują. Zasada jest analogiczna: cnw, gdzie n to liczba całkowita (1, 2, ..., n), zamiast w, może być e, $, itp.
- c2e - Usuwa 2 wyrazy od miejsca wskazywanego przez kursor do końca 2 wyrazu i przechodzi w tryb INSERT, czeka na wprowadzenie nowych wyrazów.
- ~ - (tylda) Zamienia znak nad którym znajduje się kursor z dużego na mały i odwrotnie.
- 10~ - Zmienia wielkość 10 znaków na prawo od miejsca, w który znajduje się kursor.
- xp - Przydatne w sytuacji, gdy popełnisz literówkę, np. 'teh' zamiast 'the', ustaw kursor w słowie 'teh' na 'e' i wydaje to polecenie.
- Szukaj (-- NORMAL --):
- /nazwa_blad<ENTER> - VIM szuka od początku pliku frazy: nazwa_blad
- ?nazwa_blad<ENTER> - VIM szuka od tyłu pliku frazy: nazwa_blad
- /<ENTER> - Znajduje kolejne wystąpienie słowa szukanego, w tym przypadku będzie to nazwa_blad
- /^word<ENTER> - Znajduje wyraz 'word' jeśli on zaczyna linię.
- /word$<ENTER> - Znajduje wyraz 'word' jeśli on kończy linię.
- /c.m<ENTER> - Znajduje słowo zaczynające się na c, drugi znak dowolny a trzeci znak to m.
- /xxx\c<ENTER> - Wyszukuje frazę 'xxx' bez uwzględnienia wielkości liter (przełącznik \c).
- n - VIM szuka kolejnych wystąpień szukanej frazy od początku do końca.
- 10n - Szuka dziesiątego wystąpienia szukanej frazy w przód.
- N - VIM szuka kolejnych wystąpień szukanej frazy od końca do początku.
- 10N - Szuka dziesiątego wystąpienia szukanej frazy w tył
- /<UP> - <UP> - Strzałka do góry. Przeszukuje historie szukania.
- /<DOWN> - <DOWN> - Strzałka w dół. Przeszukuje historie szukania.
- CTRL-O - Przenosi kursor w poprzednie wystąpienie szukanej frazy (tam, gdzie byłeś)
- CTRL-I - Przenosi kursor w następne wystąpienie szukanej frazy (tam, gdzie byłeś)
- fx - Szuka znaku 'x' na prawo od kursora. Ustawia kursor na pierwszym znalezionym znaku 'x'.
- 5fa - Przeszukiwanie oraz ustawienie kursora na piątej literze 'a' występującej na prawo od miejsca kursora
- 10f(spacja) - Przesukiwanie oraz ustawienie kursora na 10 spacji występującej na prawo od miejsca kursora
- Fi - Szuka znaku 'i' na lewo od kursora. Ustawia kursor na pierwszym znalezionym znaku 'i'
- 2Fo - Przeszukiwanie oraz ustawianie kursora na drugiej literze 'o' występującej na lewo od miejsca kursora
- to - Szuka znaku 'o' na prawo od kursora. Ustawia kursor na znaku poprzedzającym znak 'o'.
- To - Szuka znaku 'o' na lewo od kursora. Ustawia kursor na znaku poprzedzającym znak 'o'.
- Szukanie brakujących nawiasów ( (, ), [, ], {, } )(-- NORMAL --):
- % - Szuka brakującego nawiasu, przenosi do miejsca, w którym występuje zamykający/otwierający brakujący nawias.
- Substitute (znajdź i zamień)(-- NORMAL --):
- :s/xxx/yyy - Zamienia frazę 'xxx' na 'yyy' w linii, gdzie znajduje się kursor. Zauważ, że polecenie to zamieni tylko jedno wystąpienie frazy 'xxx', co jeśli chcemy zamienić wszystkie wystąpienia tejże frazy w tej linii? odpowiedź niżej.
- :s/xxx/yyy/g - Zamienia wszystkie wystąpienia frazy 'xxx' na 'yyy' w linii, w której znajduje się kursor.
- :s/xxx/yyy/gc - Zamienia wszystkie wystąpienia frazy 'xxx' na 'yyy' w lini, w której znajduje się kursor, prosząc za każdym razem o potwierdzenie.
- :10s/xxx/yyy - Zamienia frazę 'xxx' na 'yyy' w linii nr. 10 (kursor nie musi być ustawiony w tej linii, polecenie to jest bardziej precyzyjne)
- :10s/xxx/yyy/g - Zamienia wszystkie wystąpienia frazy 'xxx' na 'yyy' w linii nr. 10
- :10s/xxx/yyy/gc - Zamienia wszystkie wystąpienia frazy 'xxx' na 'yyy' w linii nr. 10, za każdym razem prosząć o potwierdzenie akcjii.
- :%s/xxx/yyy/g - Zamienia wszystkie wystąpienia frazy 'xxx' na 'yyy' w całym pliku
- :%s/xxx/yyy/gc - Zamienia wszystkie wystąpienia frazy 'xxx' na 'yyy' w całym pliku, lecz za każdym razem prosząc o potwierdzenie.
- :#,#s/xxx/yyy/g - Zamienia wszystkie wystąpienia frazy 'xxx' na 'yyy' zawierającej się pomiędzy wierszami #, #.
- :#,#s/xxx/yyy/gc - Zamienia wszystkie wystąpienia frazy 'xxx' na 'yyy' zawierającej się pomiędzy wierszami #,# za każdym razem prosząc o potwierdzenie
- Polecenie zewnętrzne (-- NORMAL --):
- :!nazwa_polecenia - powłoka wykona polecenie 'nazwa_polecenia' (np. :!ls -l pokaże listę plików katalogu, w którym jesteśmy).
- Wybranie tekstu do zapisu (-- VISUAL --):
- v - Przełącza do trybu wizualnego. Możesz używać strzałek do zaznaczenia tekstu i jak już pewnie zobaczyłeś tekst jest podświetlony, ale również możesz używać operatorów ruchu: w (słowo), e (słowo), $ (cała linia od kursora). Wciśnij :, a na dole pojawi się coś takiego: :'<,'>. Wpisz za tym 'w nazwa' (oczywiście bez ''), gdzie nazwa to nieistniejącego pliku. Mniej więcej powinno wyglądać to tak: :'<,'>w nazwa. Teraz, aby sprawdzić, czy zaznaczony tekst zapisał się do nowego pliku wystarczy wpisać :!cat nazwa
- Filtrowanie (-- NORMAL --):
- !20Gsort<ENTER> - Jeśli ustawimy 20 wierszy, w każdym będzie jakaś liczba, to po wydaniu tego polecenia, VIM posortuje je rosnąco.
- !Gsort<ENTER> - Posortuje wiersze od miejsca, w którym znajduje się kursor do końca pliku.
- !!ls -l - Wstawi listę znajdujących się plików w katalogu. Dla użytkowników MS Windows: !!dir
- !!date - Wstawi date systemową.
- Wstawienie i łączenie plików (-- NORMAL --):
- :r nazwa - Gdzie nazwa to nazwa pliku wstawianego. Można również wstawić zawartość polecenia zewnętrznego, tj. :r !ls -l
- Ustawianie opcji (-- NORMAL --):
- :set ic - ic (Ignore Case) po ustawieniu tej opcji, wyrazy będą przeszukiwane bez względu na wielkość ich liter.
- :set noic - Wyłącza opcje ic.
- :set hlsearch - Włącza podświetlenie wyszukiwanego tekstu.
- :set nohl - Wyłącza podswietlenie wyszukiwanego tekstu.
- :set incsearch - Włącza częściowe dopasowanie tekstu podczas szukania.
- :set noxxx - Wyłącza opcję xxx
- :set autowrite - Włącza opcje autozapisywania.
- :set noautowrite - Wyłącza opcję autozapisywania.
- Używanie tabulacji (-- NORMAL --)
- << - (nawias trójkątny) Przesuwa linię w lewo, w której znajduje się kursor o wartość tabulacji.
- >> - Przesuwa linię w prawo, w której znajduje się kursor o wartość tabulacji.
- #,#> - #,# - Numery wierszy. Przesuwa w prawo o wartość tabulacji wiersze podane jako argumenty.
- #,#<< - #,# - Numery wierszy. Przesuwa w lewo o 2 wartości tabulacji wiersze podane jako argumenty.
- Używanie Makr (-- NORMAL --)
Posiadasz taką o to listę:
- stdio.h
- stdlib.h
- sys/types.h
- sys/stat.h
- unistd.h
- fcntl.h
- errno.h
I chcesz, żeby wyglądała ona tak (za pomocą jednego polecenia):
- #include <stdio.h>
- #include <stdlib.h>
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <unistd.h>
- #include <fcntl.h>
- #include <errno.h>
Wykonuj pokolei wypunktowane poniżej polecenia, ale zanim to zrobisz przenieś kursor do pierwszego znaku w pierwszej linii:
- qa - Zaczyna nagrywać makro, przypisując je literze a. Litera musi być z przedziału <a,z>
- ^ - Przenosi na początek linii
- i#include <<ESC> - Wstawia napis #include < na początku linii. (pamiętaj, że to <ESC> to jest przycisk na klawiaturze!)
- $ - Przechodzi na koniec linii
- a><ESC> - Dodaje znak: > na końcu linii.
- j - Przechodzi do następnej linii
- q - Kończy nagrywanie makra
Teraz, żeby się odwołać do tego makra, przenieś kursor na pierwszy znak w pierwszej linii i w trybie normal wydaj polecenie: @a. Żeby to zrobić dla wszystkich naraz wpisz: 7@a.
- Dwuznaki (Digraphs) (-- NORMAL -- / -- INSERT --):
- :digraphs - Wyświetla listę dostępnych znaków
- CTRL-Kxy - (Tryb INSERT), x, y - oznaczają znaki, które można odczytać z :digraphs. Dajmy na to przykład, żeby otrzymać znak: Ц (C= Ц 1062, Informacja z :digraphs) musimy nacisnąć CTRL-K i wpisać C= (dwa znaki: C, =)
- CTRL-KD% - Analogicznie da inny znak, w tym wypadku ten znak to: Ђ. (Informacje z digraphs: D% Ђ 1026)
- Okna (-- NORMAL --)
- :split - Polecenie to dzieli okno VIMa na 2 okna, w których edytuje ten sam plik.
- CTRL-Ww / CTRL-W CTRL-W - Przełącza okna
- CTRL-Wj - Przełącza z górnego okienka do dolnego
- CTRL-Wk - Przełącza z dolnego okienka do górnego
- ZZ / :q / CTRL-Wc - Zamyka jedno okienko
- :split plik2.txt - Otwiera w drugim okienki plik: plik2.txt
- :15 split plik2.txt - Otwiera plik2.txt w drugim oknie o rozmiarze 15 wierszy
- :new - Prawie to samo co split, tylko, że otwiera nowy plik, w oknie.
- :10 new - Otwiera nowy plik w oknie o rozmiarze 10 wierszy.
- :sview plik2.txt - Otwiera plik2.txt w nowym oknie, tylko do odczytu.
- 10 sview plik2.txt - Otwiera plik2.txt w nowym oknie o rozmiarze 10 wierszy, tylko do odczytu.
- 10CTRL-W+ - Powiększa okno o 10 wierszy.
- 10CTRL-W- - Pomniejsza okno o 10 wierszy.
- 12CTRL-W_ - Ustawia rozmiar okna na 12 wierszy.
- CTRL-W_ - Ustawia okno na nawiększą możliwość
- CTRL-W= - Ustawia okna na takie same rozmiary (albo bardzo zbliżone)
Wiecej informacji na temat programu vim znajdziesz w podreczniku systemowym man.
Wpisujac w konsoli man vim