Dla mnie vi jest jak Zen.
Używać vi to jak praktykować Zen.
Każda komenda jest koanem.
Mocarny dla tego, który ogarnął,
nieogarniony dla niewtajemniczonych.
Odkryjesz prawdę o nim za każdym razem, gdy go użyjesz.
–reddy@lion.austin.com
Tłumaczenie tekstu J. McPherson Efficient editing with vim
Ten poradnik zakłada podstawową wiedzę o vimie – trybie wstawiania, trybie komend, ładowanie i zapisywanie plików itd. Nowicjusze dzięki niemu pogłębią swoją wiedzę aby efektywniej go używać.
Notacja <Ctrl+X> oznacza, aby przy wciśniętym klawiszu Ctrl nacisnąć klawisz X. Wiele z tu użytych komend jest opisanych we wbudowanym w vima helpie, który można wywołać wpisując :help command, gdzie command jest tym, czego szukasz.
Efektywne poruszanie się
Trzymaj się z dala od trybu wstawiania
Ogólnie rzecz biorąc spędzaj w trybie wstawiania tak mało czasu, jak to tylko jest niezbędne, ponieważ w tym trybie vim zachowuje się jak prymitywny edytor. To dlatego tak wielu początkujących użytkowników vima tak wiele czasu spędza w tym trybie – to czyni vima łatwym w obsłudze. Ale prawdziwa potęga vima leży w trybie komend! Przekonasz się, że im lepiej będziesz znał vima, tym mniej czasu będziesz spędzał w trybie wstawiania.
Używaj h, j, k i l
Pierwszy krok na drodze do efektywnego używania vima to oduczyć się klawiszy strzałek. Jedną z zalet konstrukcji trybów vima jest to, że nie musisz wciąż przesuwać rąk pomiędzy klawiszami strzałek i główną częścią klawiatury; gdy jesteś w trybie komend litery h, j, k i l odpowiadają kierunkowi odpowiednio w lewo, na dół, do góry i w prawo. Wymaga to pewnej wprawy, ale naprawdę odczujesz różnicę w sprawności posługiwania się vimem, gdy się z tym oswoisz.
Gdy edytujesz e-maila, albo inny tekst sformatowany w paragrafy możesz zauważyć, że przemieszczasz się po tekście o więcej linii, niż oczekiwałeś. To dlatego, ponieważ paragraf jest jedną długą linią dla vima. Wciśnij g przed h, j, k lub l aby przesuwać się o linie ekranowe, zamiast linie tekstu.
Używaj przesunięć do przemieszczania się w bieżącej linii
Większość edytorów ma tylko najprostsze komendy do przemieszczania kursora (lewo, prawo, do góry, na dół, do początku linii, na koniec itd.). Vim posiada bardzo zaawansowane komendy do poruszania kursorem; nazywane są one przesunięciami. Gdy kursor przemieszcza się z jednego punktu tekstu do innego, tekst między tymi punktami nazywany jest ominiętym (to będzie ważne w dalszej części poradnika). Poniżej jest kilka z bardziej użytecznych przesunięć:
| fx | Przesuń kursor do przodu (forward) do następnego wystąpienia znaku x w bieżącej linii (oczywiście znak x może być dowolnym znakiem). To niezwykle użyteczna komenda. Możesz naciskać ; aby powtórzyć ostatnią komendę f. |
|---|---|
| tx | To samo, co powyżej, ale przesuwa kursor w prawo przed ten znak, nie cały dystans do niego. (Bardzo użyteczne, naprawdę). |
| Fx | Przesuwa kursor w tył do poprzedniego wystąpienia znaku x w bieżącej linii. |
| w | Przesuwa kursor o słowo do przodu. |
| b | Przesuwa kursor do tyłu o słowo. |
| 0 | Przesuwa kursor na początek bieżącej linii. |
| ^ | Przesuwa kursor na pierwszy znak bieżącej linii. |
| $ | Przesuwa kursor na koniec bieżącej linii. |
| ) | Przesuwa kursor do przodu do następnego zdania. (Użyteczne podczas edycji e-maili lub dokumentów tekstowych). |
| ( | Przesuwa kursor o zdanie do tyłu. |
Efektywne poruszanie się w obrębie pliku
Vim ma wiele komend, które przemieszczą Cię w dowolne miejsce pliku – rzadko będziesz musiał musiał przewijać tekst ręcznie. Poniższe skróty klawiszowe nie są technicznie rzecz biorąc przemieszczeniami, jako że poruszają Cię one w obrębie pliku, a nie konkretnej linii.
| <Ctrl+F> | Przesuń kursor o jeden ekran do przodu (forward) |
|---|---|
| <Ctrl+B> | Przesuń kursor o jeden ekran wstecz (backward) |
| G | Przesuń kursor do końca pliku |
| numG | Przesuń kursor do linii num (np. 10G przesuwa do linii 10) |
| gg | Przesuń kursor do początku pliku. |
| H | Przesuń kursor na górę ekranu. |
| M | Przesuń kursor na środek ekranu. |
| L | Przesuń kursor na dół ekranu. |
| * | Przesuń kursor do następnego wystąpienia ciągu znaków, w którym jest kursor (np. jeśli kursor jest gdzieś w napisie „bob,”, kursor przesunie się do następnego jego wystąpienia, jeśli istnieje) |
| # | Jak wyżej, ale do poprzedniego wystąpienia ciągu znaków. |
/tekst |
Poczynając od pozycji, w której jest kursor znajdź następne wystąpienie ciągu „tekst” i przemieść się do niego. Przejście następuje po naciśnięciu klawisza Enter. Aby ponowić poszukiwanie naciśnij n (next). |
?tekst |
Podobnie jak /, ale poszukuje wstecz. |
| ma | Tworzy na pozycji kursora zakładkę (znacznik) w tekście o nazwie a. Nazwą może być dowolna mała litera. Znacznika nie widać, ale on tam jest! |
| `a | Przejdź do znacznika a. Uwaga: to jest odwrócony apostrof, nie prosty. Jest umieszczony na większości klawiatur na lewo od 1. |
| `. | Przejdź do ostatnio edytowanej linii. To jest użyteczne! Jeśli musisz przewinąć plik, aby coś odszukać, możesz wrócić do miejsca w którym byłeś używając komendy `. |
Efektywne pisanie
Używanie dopełniania wyrażeń
Vim ma bardzo przyjemny system uzupełniania słów. Oznacza to, że możesz napisać początek słowa, nacisnąć przycisk i vim dopisze słowo do końca. Na przykład jeśli masz gdzieś w kodzie zmienną „iAmALongAndAwkwardVarName”, podejrzewam, że nie chcesz jej wpisywać wszędzie tam, gdzie będzie użyta. Aby użyć autodopełnianiapo prostu wpisz początek słowa i naciśnij <Ctrl+N> (to znaczy przy wciśniętym klawiszu Ctrl naciśnij dodatkowo N) lub <c-p></c-p>. Jeśli vim nie dopełni do tego słowa, którego oczekujesz, próbuj dalej. Vim cyklicznie przejdzie przez wszystkie dopełnienia, które znajdzie.
Włączaj tryb wstawiania inteligentnie
Większość nowych użytkowników wchodzi w tryb wstawiania klawiszem i. To działa, ale o wiele częściej jest niepraktyczne gdy vim ma wiele różnych komend przestawiających vima w tryb wstawiania. Oto najbardziej popularne:
| i | Wstawiaj na lewo od pozycji kursora |
|---|---|
| I | Wstawiaj na początku bieżącej linii |
| a | Wstawiaj na prawo do pozycji kursora |
| A | Wstawiaj na końcu linii |
| o | Wstaw nową linię poniżej pozycji kursora i przejdź na jej początek |
| O | Wstaw nową linię powyżej kursora i przejdź na jej początek |
| c{przemieszczenie} | Skasuj tekst aż do miejsca określonego jako c ustaw tryb wstawiania pozwalając na jego zamianę (change). Na przykład c$ skasowałoby tekst do końca linii pozostając w trybie wstawiania. ct! skasowałoby tekst do następnego wykrzyknika (wyłącznie) i pozostawiło vima w trybie wstawiania. Skasowany tekst jest kopiowany do schowka i może być wstawiony. |
| d{przemieszczenie} | Skasuj tekst do miejsca określonego przez {przemieszczenie}. Podobnie jak c{przemieszczenie}, ale nie wchodzi w tryb wstawiania. |
Efektywne przesuwanie bloków tekstu
Używaj trybu zaznaczania i jego różnych trybów
W odróżnieniu od oryginalnego vi, vim pozwala Ci na podświetlanie zaznaczenia tekstu i operacjach na nim. Są trzy główne tryby selekcji wizualnej (trybu zaznaczania tekstu). Są to:
| v | Zaznaczanie na poziomie znaków. To tryb do których większość osób jest przyzwyczajona, dlatego wypróbuj go przed przed innymi trybami selekcji. |
|---|---|
| V | Zaznaczanie na poziomie linii. Zawsze zaznaczane są całe linie.Ten tryb jest bardziej przydatny, gdy chcesz kopiować lub przenosić grupę linii. |
| <Ctrl+V> | Zaznaczanie blokowa. Ekstremalnie użyteczne narzędzie i dostępne w nielicznych edytorach. Możesz zaznaczyć prostokątny blok i każdy tekst w nim będzie podświetlony. |
Wszystkie standardowe klawisze ruchu w trybach selekcji wizualnej działają normalnie – na przykład vwww przestawi edytor w tryb selekcji wizualnej i zaznaczy trzy następujące słowa. Vjj przestawi vim-a w tryb selekcji wizualnej linii i zaznaczy bieżącą i dwie następne linie.
Wycinanie i wklejanie w trybie zaznaczania wizualnego
Gdy tekst jest już zaznaczony i podświetlony, prawdopodobnie chcesz coś z nim zrobić. Oto kilka z bardziej użytecznych komend, które możesz wydać, gdy zaznaczony jest fragment tekstu:
| d | Wytnij (delete) podświetlony tekst i wstawienie go do schowka. |
|---|---|
| y | Kopiuj (słowo yank jest vim-ologią oznaczającą kopiowanie) zaznaczony tekst do schowka. |
| c | Wytnij podświetlony tekst do schowka. To jest jak d,ale pozostawia vima w trybie wstawiania. |
Wycinanie i kopiowanie bez podświetlania
Jeśli dokładnie wiesz, co chcesz wyciąć lub skopiować, możesz to zrobić bez wchodzenia do trybu podświetlania. To oszczędza czas.
| d{przemieszczenie} | Wycina tekst do {przemieszczenia} wstawiając go do schowka. Dla przykładu dw wycięłoby słowo, a dfS wycięłoby tekst do następnego wystąpienia S w bierzącej linii. |
|---|---|
| y{przemieszczenie} | Kopiuje tekst do {przemieszczenia}. |
| c{przemieszczenie} | Wycina tekst do {przemieszczenia} i pozostawia edytor w trybie wstawiania. |
| dd | Wycina bieżącą linię |
| yy | Kopiuje bieżącą linię |
| cc | Wycina bieżącą linię i pozostawia edytor w trybie wstawiania. |
| D | Wycina od kursora do końca bieżącej linii. |
| Y | Kopiuje całą linię, tak jak yy. (Tak, to jest niekonsekwentne. Możesz użyć y$ aby osiągnąć to samo co przez Y. |
| C | Wycina od kursora do końca bieżącej linii pozostawiając vima w trybie wstawiania. |
| x | Wycina bieżący znak. (To jest command-line’owy backspace.) |
| s | Wycina bieżący znak pozostawiając edytor w trybie edycji. |
Wstawianie
Wstawianie jest proste. Umieść kursor tam, gdzie chcesz wstawić tekst i naciśnij p.
Używanie wielu schowków
Większość edytorów ma jeden schowek. Vim ma ich wiele; schowki w vimie są nazywane rejestrami. Możesz wyświetlić listę wszystkich używanych rejestrów i ich zawartość wpisując :reg. Zazwyczaj będziesz używał rejestrów oznaczonych małymi literami; inne są używane wewnętrznie przez vima i są przydatne tylko okazyjnie.
Aby użyć określonego rejestru do operacji kopiowania albo wstawiania, po prostu naciśnij "a przed tą operacją, gdzie a jest nazwą rejestru, którego chcesz użyć. Na przykład aby skopiować bieżącą linię do rejestru k naciśnij "kyy. (możesz również użyć V"ky. Wiesz dlaczego to działa?). Ta linia pozostanie w rejestrze k dopóki nie wstawisz czegoś nowego właśnie do rejestru k. Wtedy możesz użyć "kp aby wstawić tekst z rejestru k.
Unikanie powtarzania czynności
Niezwykła komenda „.”
W vi naciśnięcie . (kropki) spowoduje powtórzenie ostatnio wykonanej komendy. Na przykład jeśli Twoją ostatnią komendą było dw (kasowanie słowa), vi skasuje następne słowo.
Używanie liczników
Liczniki są jednym z najpotężniejszych narzędzi w vimie oszczędzających czas. Każda komenda może być poprzedzona liczbą. Liczba ta mówi vimowi ile razy ma powtórzyć wydana komendę. Oto kilka przykładów:
- 3j – przeniesie kursor trzy linie w dół
- 10dd – skasuje dziesięć linii
- y3" – kopiuje tekst od kursora do trzeciego znaku cudzysłowa od kursora w bieżącej linii
Nagrywanie makr
Od czasu do czasu zorientujesz się, że robisz te same operacje na blokach tekstu kilka razy. Vim pozwala Ci nagrać makro w locie aby wykonać te operacje.
| q{rejestr} | Rozpocznij nagrywanie makra do oznaczonego rejestru. Na przykład qa rozpocznie nagrywanie i zachowa makro w rejestrze a. |
|---|---|
| q | Zakończenie nagrywania. |
| @{rejestr} | Odtworzenie makra zachowanego w rejestrze. Na przykład @a odtworzy makro z rejestru a. |
Pamiętaj, że makra nagrywają naciśnięcia klawiszy i odtwarzają je; nie ma tam żadnej magii. Nagrywanie jest prawie sztuką, ponieważ jest tyle komend, którymi możesz wykonać swoje zadanie i musisz być bardzo uważny używając makra, ponieważ będzie działało we wszystkich miejscach, w których planujesz je uruchomić.
Pisanie kodu w vimie
vim jest wspaniałym edytorem do pisania kodu, ponieważ posiada wiele funkcji stworzonych specjalnie dla programistów. Poniżej kilka najbardziej poręcznych:
| ]p | Podobnie jak p, ale automatycznie wyrównuje poziom wcięcia wklejonego kodu dopasowując go do tego, w który został wklejony. Spróbuj! |
|---|---|
| % | Po ustawieniu kursora na nawiasie naciśnięcie % powoduje przeniesienie kursora do odpowiedniego nawiasu w tej parze nawiasów. Świetne do wykrywania błędów w wielokrotnie zagnieżdżonych blokach kodu. |
| >> | Wcina podświetlony kod (Patrz: wcześniejszy rozdział o efektywnym zaznaczaniu tekstu. Jeśli żaden tekst nie jest zaznaczony, wcinana jest bieżąca linia). |
| << | Jak >>, ale usuwa wcięcie. |
| gd | Skocz (go) do definicji (lub deklaracji) funkcji lub zmiennej pod kursorem. |
| K | Skocz do strony podręcznika hasła znajdującego się pod kursorem. (Na przykład, jeśli kursor znajduje się na słowie sleep, zobaczysz manual o komendzie sleep.) |
Tłumaczenie: Artur Kaminski, skład: mars3n

JakiLinux


Wreszcie, myslałem że już się nie doczekam naprawdę dobrego poradnika. Od kilku chyba m-cy coś co można przeczytać od początku do konca
W niniejszym poradniku wybrano może trochę lepszy podzbiór funkcjonalności do omówienia, niż w vimtutorze, ale na zupełny brak dobrego poradnika bym nie narzekał – vimtutor istnieje od dość dawna :-).
Za każdym razem, kiedy czytam podobny poradnik do vima, jestem zachwycony funkcjonalnością tego narzędzia. Choć słowem tu nie wspomniano o jego zdolności odpalania zewnętrznych narzędzi (np. sed), i tak przedstawione funkcje są liczne. A później odpalam po raz kolejny vima i co? I posługuję się strzałkami, znam tylko dd, yy i to wszystko… Bo uczyć się trzeba, a nie ma poważnej okazji.
Mala poprawka:
x – dziala jak delete (nie jak backspace),
X – dziala jak backspace :)
Artykul bardzo dobry i nauczylem sie kilku ciekawych skrotow. Wielkie dzieki dla tlumacza :)
Dobrze wiedzieć, że delete i backspace działają jak x i X:). Nie wiedziałem, że one też kopiują usuwany tekst.
Do formatowania kodu jest jeszcze bardzo dobre ctrl=. W połączeniu z % pozwala na najlepsze wcinanie jakie widziałem we wszystkich edytorach.
nie raz już próbowałem zmusić się do vima czytając o jego zaletach, ale zawsze przyzwyczajenie wygrywa i używam nano.
podstawową znajomość wypada jednak mieć. wczoraj miałem okazję pracować przez ssh na koncie użytkownika i niestety nie było mojego nano, od razu przypomniał mi się stary linuksowy dowcip
"-jak uzyskać losowy ciąg znaków
-posadzić newbie przed vimem i kazać mu z niego wyjść"
…i oczywiście nie miałem pojęcia ani jak wprowadzić tekst, ani jak zapisać plik ;))
dobrze, że jest sporo poradników w necie.
thx za artykuł, napisany jest bardzo przystępnie.
Odnośnie tego "hjkl" di oiryszabua,,, przepraszam: do poruszania :) się po edytorze – dziwię się, że nie wybrali jednak jkl; – byłoby chyba wygodniej.
Poza tym, tak sobie myślę, że vi to mistrzostwo logicznego interfejsu – proste (nie nieskomplikowane), dobre narzędzie uniksowe, które jest tak dobrze określane przez motto występujące na początku artykułu. :)
Autor wybrał hjkl ze względu na to, że o wiele częściej poruszasz się pionowo po jednej linii niż poziomo po jednym znaku. Do poziomego poruszania najczęściej używa się w/b albo f a potem ;.
To miłe, że ktoś zadał sobie trud pisania o Vimie, ale czy uczyć się go nie jest prościej odpalając vimtutor? Dostępny w prawie każdej dystrybucji, zwykle nawet po polsku, nie tylko opisuje, ale też zawiera ćwiczenia o rosnącej trudności do wykonania…
Jedno z bardziej dla mnie użytecznych narzędzi, to możliwość łatwego przeklejania tekstu środkowym klawiszem myszy w trybie wstawiania, o tak:
1) odpalamy w trybie komend :set paste
2) przechodzimy w tryb wstawiania
3) klik klik i jest
zachowuje nawet oryginalne odstępy, co dla czytelności przeklejanego kodu ma spore znaczenie.
Zeby wyjść z trybu wklejania, dajemy :set nopaste
Dla leniwych – mapujemy set paste/nopaste na F11 lub inny klawisz;)
a dla mnie vi jest jednyie kawałkiem dobrego kodu:)
ja nie wiem po co używacie vi/vim skoro jest pico/nano i zawsze go używałem, vi(m) to udziwnienie.
zgadzam się do połowy. dużo szybsze w okiełznaniu i użytkowaniu (bo honorujące ludzkie przyzwyczajenia i intuicję) do krótkich, nagłych zadań jest takie nano. jednak do programowania czy przeglądania plików źródłowych, gdzie niezbędna jest funkcjonalność podświetlania składni, jak również wszystko inne, co vim oferuje, nano i podobne już się nie nadają lub nadają się co najwyżej średnio. lubię vim bo programuję, ale kiedy chcę szybko przejrzeć i zmienić literkę w jakimś pliku czy coś szybko wkleić i zapisać wolę nano. podobnie w windzie. do edycji np. plików html używam pspada, ale jak coś nagle musze zapisać, wolę kombinację win+r+notepad.
mimo wszystko vim to kawał dobrej roboty. żeby tak dobrze pisane były sterowniki lub oprogramowanie do multimediów, to linuksy byłyby już dawno w każdym domu.
Składnia nie jest "podświetlana", składnia jest *kolorowana*.
ja nie wiem po co używacie worda/pico/nano skoro jest vi/vim i zawsze go używałem, word/pico/nano to udziwnienie.
Do vima przekonałem sie niedawno, i w sumie bardzo dobrze mi zastępuje nawet całe środowiska programistyczne, na razie pisze lekkie programy w C/C++, więc napewno i notatnik by wystarczył, ale możliwość skakania po błędach jak w zwykłym IDE,i inne ułatwienia… jest naprawde czymś wielkim i sam interfejst vima, jest naprawde przyjazny jak się go pozna choćby lekko, ja bym dodał tutaj jeszcze zakładki(tab) i split-screen, jak dla mnie do operacji na plikach niezbędne.
W sumie za dużo by mówić ;p
edytor wart polecenia, i jeśli ktoś nie mógł się do te pory zabrać sie za niego, polecam usunąc prędzej używane narzędzie i zostawić vima hehe
pozdrawiam.
@pavel "split screen" . Proszę bardzo: :-)
ctrl+w s – split podział poziomy
ctrl+w v – podział pionowy
ctrl+w strzałka – przeskakuje do podziału w kierunku strzałki
ctrl+w q – zamyka aktualny podział
ctrl+w n – nowy podział poziomy z pustym plikiem
Zakładki:
:tabnew
Trochę tego dużo się robi, jak masz zakładki, w każdej zakładce kilka okien, a do tego jeszcze bufory. Przyznaje jednak, że czasem się przydaje :)
P.
Z vi (vim'em) jest tak: najpierw ktoś (np. pracodawca) musi Ciebie zmusić do pracy w tym edytorze przez pół roku, ale później nie będziesz chciał używać żadnego innego!
Pozdrawiam
Przemek
PS. Artykuł bardzo przydatny, choć używając vim'a od 15 to niczego nowego nie odkryłem, ale miło sobie przypomnieć.
Więcej! :)
Nie żebym się czepiał, ale polecenie kopiowania yank widziałem bardzo dawno temu na Amidze w edytorze… Micro Emacs ;)
Mam małe pytanie: w vim'ie istnieje bardzo dobry skrót – C^o pozwalający wejść do trybu poleceń tylko na jedno polecenie, a czy istnieje skrót działający na odwrót? Czyli wejście do trybu insert tylko na 1 znak(ew. z mnożnikiem na więcej)?
Dlaczego pytam o takie coś?
Przykładowo chce na szybko skomentować '#' kilka wierszy z rzędu. Pytanie jak to zrobić najsprawniej i raczej bez używania strzałek (czyli bardziej po "vim'owsku" :)) i zakładając, że nie mam żadnej nakładki typu cvim.
Nie wiem nic o skrócie, ale komentowanie wierszy robię tak:
- przechodzę na początek pierwszej komentowanej linii
- ctrl+v (tryb zaznaczania kolumnowego)
- zjeżdzam do ostatniej komentowanej linii
- shift+i (wstaw przed znakiem)
- wpisuję znak(i) komentarza
- esc
gotowe, wszystkie linie zakomentowane.
Wielkie dzięki, działa świetnie. Ależ potężny jest Vim, a to zaznaczanie blokowe to prawdziwe mistrzostwo.
Dla tych którzy korzystają często vi/vim lub chcą się go nauczyć przydatny może być "kubek vi". zwykły kubek do picia z nadrukowanymi komendami edytora vi: http://www.continuum.com.pl/vi/vi_mug.html