VIM - podstawowy edytor tekstu

Krzysztof Jagielski
20.08.2015

O ile w każdym systemie Unix powinien znajdować się edytor VI, o tyle w nowszych systemach tegoż samego typu powinien znajdować się i program VIM. Szczerze mówiąc kiedyś nie miałem do niego przekonania. Używałem wtedy programów pico i mcedit (mowa oczywiście o edytorach konsolowych). Po pewnym czasie użytkowania Linuksa uznałem, że VIM jest godny uwagi i warto się go nauczyć...

Początkujący użytkownicy często niechętnie korzystają z tego programu, a wręcz go unikają. Powody są co najmniej dwa: ubogi wygląd i trudność obsługi. Bynajmniej jedno wiąże się z drugim. W programie tym nie istnieje menu takie, jak np. w mcedit, czy windowsowym notatniku - tutaj trzeba posługiwać się komendami niczym w wierszu poleceń. Komendy te trzeba oczywiście znać, ale jak się za chwilę okaże, nie jest to nic kosmicznego.


Jest jeszcze trzecia "wada" VIM'a - nieestetyczny wygląd samego tekstu. Standardowo pisząc w tym edytorze tekst nie tylko zawijany na końcu, ale i łamany. Jak się później okaże można i temu zaradzić, ale niemniej jednak uważam, że jest to typowy edytor kodu i nie nadaje się do czytania długich artykułów.
Mimo to VIM chętnie używany jest przez programistów systemów UNIX i jego odmian (także innych systemów).

Rys. 1. VIM. Możesz mi wierzyć lub nie, ale artykuł, który teraz czytasz
został napisany właśnie w VIM-ie


Trochę historii


Visual In ex

Czysty program został napisany w 1976 roku przez nijakiego Bill Joy'a (William Nelson Joy) na potrzeby systemu BSD. Edytor posiada dwa tryby pracy. Pierwszy tryb to pisanie (wprowadzanie). Drugi zaś przypomina menu graficznych edytorów, z tą jednak różnicą, że nie używamy zakładek, a wpisujemy polecenia edytora vi lub ex (otwórz, zapisz, wyjdź).
VI iMproved


W podręczniku systemowym (manual) możemy przeczytać: "vim - udoskonalony vi, tekstowy edytor programistów". Autorem programu jest Bram Moolenaar. Holenderski programista opublikował go w 1991 roku. Otrzymał on wsparcie innych programistów w trakcie tworzenia programu oraz po jego opublikowaniu. Program uważany jest za rozszerzoną wersję edytora vi, bowiem program zachował wysoki stopień kompatybilności z poprzednikiem.


Podstawowe zmiany jakie istnieją pomiędzy tymi edytorami to wielokrotne cofanie zmian (undo), gdzie VIM daje możliwość tysiąckrotnego cofnięcia, natomiast VI - jednokrotnego. Do tego VIM umożliwia przewijanie ekranu w poziomie, zwiększenie limitu długości wierszy oraz rozmiaru pliku. Ponadto rozszerzony program posiada 26 rejestrów (tzw. schowków), w których można przechowywać fragmenty tekstów. Oprócz tego program umożliwia kolorowanie składni oraz wsparcie dla narzędzi programistycznych (m.in. kompilatory, debugery).


Jako ciekawostkę warto wspomnieć, że oprócz konsolowego edytora można spotkać się z wersja graficzną - gvim. Istnieją wersje programu działające także na innych systemach, nie tylko Unix (np. Windows).


Polecenia


Jak już wspomniałem program posiada 2 tryby pracy - tryb wprowadzania, czyli pisania (VISUAL) i poleceń (NORMAL). Tryb normal z kolei umożliwia wprowadzenie dwóch typów poleceń: polecenia vim (w tym vi) oraz ex.
W trybie wizualnym widzimy i bezpośrednio modyfikujemy tekst. W trybie poleceń możemy zmodyfikować tekst nie patrząc na niego (np. zamienić dowolny wyraz na inny).
Standardowo po otwarciu programu zostaniemy poczęstowani trybem NORMAL (polecenia). Aby przejść do pisania możemy użyć klawisza [a] (ang. append - dopisywanie za lub przed znakiem, dosł. dołączać) lub [i] (ang.  insert - wstawianie, nadpisywanie wyrazów, dosł. wkładać) - często w edytorach graficznych możemy wywołać te dwa tryby klawiszem [Insert] na klawiaturze.


Aby powrócić do poleceń wciskamy [ESC].


Polecenie ex

:q - Wyjście z programu, jeśli zapisano zmiany (quit)
:q! - Bezwzględne wyjście z programu
:w - Zapis (write)
:w nowa_nazwa - Zapisuje plik pod inną nazwą
:e nazwa_pliku - Edytuje plik o podanej nazwie
:help - Pomoc programu - otwiera plik help.txt (warto zerknąć)

Aby usprawnić pracę możemy połączyć niektóre polecenia, np. :wq (zapis i natychmiastowe wyjście).
Znając powyższe polecenia można już śmiało używać VIM'a.

Polecenia vi:

ZZ - Zapis oraz wyjście (to samo co w ex - :wq)
l (małe "L") - Kursor w prawo (o jeden znak)
h - Kursor w lewo (j/w)
k - Kursor w górę (j/w)
j - Kursor w dół (j/w)
b - Kursor o słowo w lewo
w - Kursor o słowo w prawo
0 (cyfra zero) - Przenosi kursor na początek wiersza
$ - Ustawia kursor na końcu wiersza
a - Tryb wprowadzania z dopisywaniem (ang. append)
i - Tryb wprowadzania z nadpisywaniem (ang. insert)
x - Usuwa znak - standardowo ten, który jest podświetlany kursorem


W niektórych przypadkach można polecenie poprzedzić liczbą, która będzie oznaczała ilość powtórzeń wykonania polecenia. Przykładowo polecenie: 15l będzie oznaczać przesunięcie kursora w prawo o 15 znaków, lub 15x - usunięcie kolejnych 15 znaków.
Jak na razie wymieniłem tylko przykładowe polecenia dla ex oraz vi. Jak widać nie są wcale trudne i można łatwo je zapamiętać.
Polecenia vim też nie powinny sprawiać specjalnych kłopotów...

Polecenia vim
W związku z tym, że vim jest w wysokim stopniu kompatybilny z edytorem vi jego podstawowe polecenia nie ulegają zmianie. W każdym razie vim posiada szereg nowych, których vi już nie ma.
Poniżej znajdują się oczywiście najbardziej przydatne polecenia w skróconej formie. Aby dowiedzieć się pełnej nazwy polecenia wystarczy wpisać: :h nazwa_polecenia

Tryb NORMAL
ga - Wartość znaku spod kursora w ASCII (w postaci dziesiętnej, szesnastkowej i ósemkowej)
g8 - Jak wyżej tylko, że dla kodowania UTF-8
50% - Skok o połowę pliku (w %)
100go - Wykonuje skok do setnego bajtu pliku
15G - Wykonuje skok do 15-go wiersza
g ctrl+g - Informacje na temat położenia kursora, tj. kolumna, wiersz, słowo i bajt (np. Kol 5 z 18; Wiersz 1 z 1; Słowo 1 z 1; Bajt 5 z 19)
q: - Wyświetla historię poleceń trybu ex

Sex w trybie ex
Czyli polecenia, które zawierają przynajmniej jedną literę wyrazu "sex".

:Sex - Otwiera okno wyświetlające zawartość bieżącego katalogu (ang. Split file EXplore)
:as - To samo co polecenie ga trybu NORMAL
:se wrap | se nolist | se lbr - Zawijanie wierszy na granicy słowa (słowo nie będzie przerywane)
:se noma - Blokada pliku (bufora) przed modyfikacją
:se ff=unix - Wymuszenie uniksowego, pojedynczego znaku końca wierszy (spod dowolnego systemu)
:se is | se hls - Podświetlenia znaków spełniających warunki wyszukiwania wyszukiwania
:se vb - Włącza sygnał optyczny (ang. visual bell) w miejscu sygnału akustycznego
:sp file_name - Otwiera nowe okno edycji w poziomie
:vsp file_name - Jak wyżej, ale w pionie
:syntax on - Podświetlanie składni danego języka (język programowania może być rozponany przez rozszerzenie nazwy pliku, np. nazwa.cpp)
:se syn=css - Wymuszenie podświetlania składni wg. reguł języka CSS2 (gdy rozszerzenie nie oddaje zawartości - np. .txt zamiast .css)

Za pomoca poleceń trybu ex możemy ułatwić sobie proces edycji pliku...
:%s/tekst aktualny lub wyrażenie regularne/nowy tekst lub

Polecenie to umożliwia zamiane jednego wyrazu na drugi. Znak procentu oznacza, że polecenie ma dotyczyć całego tekstu w pliku. Ukośniki służą za separatory poleceń, litera g oznacza wykonywanie polecenia aż zostanie napotkana granica zakresu (w tym wypadku EOF - koniec pliku), natomiast litera c włącza tryb potwierdzeń "krok po kroku" dla wykonywanego polecenia w przypadku spełnionego kryterium wyszukiwania
- jeżeli nie użyjemy c polecenie zostanie wykonane całe automatycznie!
Zapamiętaj, że pierwszy wyraz jest wzorem zamienianym na drugi, a nie odwrotnie (czyli zamieniasz coś / coś_innego).
Napisałem, że ukośniki [/] są separatorami. A co zrobić, jeśli chcemy zamienić ukośniki występujące w tekście? Poprostu poprzedzamy ukośnik backslashem [\], czyli jako argument do zamiany wpisujemy nie / tylko: \/
- i tak możemy robić w obie strony.

Ponadto możemy napotkać inne problemy ze znakami tego typu (mającymi znaczenie w składni polecenia) - jeżeli występują takie w tekście i chcemy je zamienić to również poprzedzamy je backlslashem.
Przykładowo, jeżeli w tekście zamieniamy \n na coś innego to w tym poleceniu wpisujemy \\n.

Możemy oczyścić ładnie tekst z tagów HTML:
:%s/<[^>\n]*>//g
Polecenie wycina wszystko co się zaczyna od "<" i kończy na ">" włącznie - nawet, jeśli tag przeciąga się na kilka nowych wierszy.
Zamiast nawiasów, trójkątnych możemy wstawić dowolne inne, wtedy zamiast tagów HTML wytniemy to co jest w tych nawiasach. Oczywiście, jeśli dla ostrożności chcesz wybrać tryb potwierdzeń dodaj na końcu c.
Pamiętaj, że polecenie ma na końcu 2x [ / ]. Dlaczego? Ponieważ całe to polecenie oznacza zamianę wszystkiego co znajduje się pomiędzy nawiasami trójkątnymi na to co jest pomiędzy tymi dwoma ukośnikami - można tam wstawić spację albo inny wyraz lub znak.

A w następujący sposób usuwamy puste wiersze:
:g/^\s*$/d

W ten sposób wiersze, które nie zawierają żadnego znaku zostaną usunięte i tekst będzie linijka pod linijką.

VIM i kodowanie

Poniższe polecenia ustawiają kodowanie znaków (bardzo przydatne, jeżeli piszemy po polsku i nie chcemy narazić się na "krzaczenie").

:se enc=iso-8859-2  Vim będzie kodował znaki w standardzie ISO
:se tenc=utf8 - Informuje vim-a, że na konsoli obowiązuje kodowanie Unicode (UTF-8)
- można ustawić też inne kodowanie podając odpowiedni rodzaj (np. iso-8859-1)...

Konfiguracja VIM-a
VIM jest programem, który można dostosować do swoich preferencji. Można zmienić w nim wiele rzeczy, np. włączyć podświetlanie składni, ustawić długość tabulacji czy nadać kolory, itd...
Poniżej znajduje się lista poleceń, które można wpisać, albo w trybie ex (poprzedzając je dwukropkiem), albo w pliku konfiguracyjnym (plik konfiguracyjny dla systemów GNU/Linux i Unix nosi nazwę .vimrc i powinien znajdować się w /home/nazwa_uzytkownika/, natomiast dla systemów Microsoftu plik ten nosi nazwę mu_vimrc.

syntax on - podświetlanie składni języka programowania
set textwidth=n - ustawia długość wiersza na n znaków
set noet ts=n sw=n - ustawia długość tabulacji na n znaków (białych)
set autoindent / noautoindent - włącza / wyłącza auto-wcięcia
set incsearch - wyszukuję ciąg w trakcie wpisywania wzorca (literka po literce)
set number - numerowanie wierszy
set ruler - statystyki
set nocompatible - wyłącza kompatybilność z edytorem vi
set backspace=ident,eol,start - zawija tekst przy końcu wiersza
set backupdir=/katalog/backupy - określa katalog dla kopii bezpieczeństwa
set backup - robi kopię zapasową
let g:html_use_css="1" - korzystanie ze styli CSS dla plików HTML

W niektórych przypadkach anulowanie ustawionej opcji, można wykonać poprzez poprzedzenie nazwy przedrostkiem no, np. set noautoindent czy set nonumber. W odpowiednio innych przypadkach należy wartośc ustawić na 0...
Wiecej o konfigurowaniu i pliku konfiguracyjnym (dla różnych systemów) możesz przeczytać w pliku pomocy odnoszącego się do konfigu - wpisz polecenie :h vimrc.
Zaawansowani użytkownicy Linuksa mogą w pliku konfiguracyjnym zastosować także funkcje programistyczne (skrypty). Więcej na ten temat przeczytasz w pliku pomocy wpisując polecenie :help source.

Na zakończenie...
Jak widzisz edytor VIM nie jest wcale taki straszny, jaki mógłby się wydawać na na pierwszy rzut oka. Jak napisałem wcześniej - sam nie miałem co do niego pewności. Teraz używam go do wszelkich modyfikacji kodu w Linuksie. Napisałem w nim również ten artykuł. :)

Zgłoś swój pomysł na artykuł

Więcej w tym dziale Zobacz wszystkie