Logo programu | |
Autor | Bram Moolenaar i inni |
---|---|
Pierwsze wydanie | 1991 |
Aktualna wersja stabilna | 9.1.0 (2 stycznia 2024) [±] |
Język programowania | C, Vim script |
System operacyjny | Wieloplatformowy |
Rodzaj | edytor tekstu |
Licencja | Charityware |
Strona internetowa |
Vim (skrót od ang. vi improved) – wieloplatformowy klon edytora tekstu vi, napisany przez holenderskiego programistę Brama Moolenaara. Vim należy do grupy wolnego oprogramowania o otwartym kodzie źródłowym. Pierwsza wersja została wydana w 1991 roku.
Vim wydawany jest na własnej licencji typu charityware, kompatybilnej z GPL. Oznacza to, iż użytkownik Vima, otrzymując go nieodpłatnie, jest zachęcany przez autora do dokonywania wpłat na cele charytatywne – tutaj na pomoc ofiarom AIDS w Ugandzie.
Vim w ostatnich latach był kilkukrotnie wybierany na najpopularniejszy edytor tekstowy wśród czytelników „Linux Journal”, wyprzedzając m.in. Emacsa.
Tryby pracy
Vim jest przede wszystkim edytorem modalnym, tzn. mającym więcej niż jeden tryb pracy. Zależnie od sposobu liczenia, Vim ma od trzech trybów „elementarnych” (NORMAL, INSERT i COMMAND-LINE/EX) do jedenastu. Według twórcy Vima można wyróżnić aż 6 trybów podstawowych (basic modes) i 5 dodatkowych (additional modes). Ich opis znajduje się w bardzo obszernej dokumentacji podręcznej, dostępnej z poziomu Vima. Wprowadzenie w terminologię i specyfikę trybów uzyskuje się po wpisaniu :help vim-modes w tzw. trybie Ex. Przejście w tryb Ex zawsze zaczyna się od dwukropka (poprzedzonego wciśnięciem klawisza Esc w przypadku trybu wyjściowego innego niż NORMAL).
Zmiana trybu
Dalszy opis skupia się na trybach NORMAL, VISUAL i REPLACE. Tryb INSERT nie wymaga osobnego opisu jako wspólny wszystkim edytorom pełnoekranowym.
Domyślnie edytor Vim wita użytkownika trybem NORMAL. Zmiana trybu NORMAL na VISUAL wymaga wpisania małej litery v (należy zwracać uwagę na stan klawisza ⇪ Caps Lock). Z kolei zmiana na tryb REPLACE możliwa jest z dwóch trybów: z trybu NORMAL przez wpisanie wielkiego R oraz z trybu INSERT po wciśnięciu klawisza Insert.
Wizualna edycja w trybie REPLACE
Prosty przykład edycji
Nietypowe (niespotykane gdzie indziej) zasady edycji w edytorze Vim zostaną zademonstrowane na przykładzie trybu REPLACE, formalnie będącego rozszerzeniem trybu INSERT.
Najpierw proste zastępowanie (ang. replace) kolejnych, pojedynczych znaków innymi znakami: jest to zadanie stosunkowo intuicyjne, ponieważ po przejściu w tryb REPLACE każdy wpisany znak nadpisuje inny znak. Tak aż do naciśnięcia klawisza Esc, czyli opuszczenia trybu.
Trudniejszy przykład edycji
Szybka podmiana dłuższego fragmentu tekstu bez zmiany liczby znaków w pliku wynikowym jest trudniejsza, przynajmniej z punktu widzenia użytkownika przyzwyczajonego do intuicyjności edytorów niemodalnych.
- Włączyć tryb VISUAL (v).
- W dowolny sposób zaznaczyć ciąg znaków do skopiowania, który ma zastąpić ciąg dotychczasowy. Źródło ciągu docelowego nie jest w tym momencie istotne – może to być nawet zewnętrzny plik wyświetlony w innym oknie edytora. W trybie VISUAL, do zaznaczenia można użyć zarówno myszki, jak i jednego z czterech klawiszy kierunkowych na klawiaturze. W obu przypadkach skopiowanie zaznaczonego ciągu do pamięci podręcznej edytora (rejestru) następuje po wciśnięciu litery y (yank). Uwaga: maksymalnie można zaznaczyć do 26. fragmentów, ale wtedy każdy z nich musi zostać skopiowany do osobnego, nazwanego rejestru sekwencją trzech znaków: cudzysłowu, dowolnie wybranej litery alfabetu oraz – jak poprzednio – litery y.
- Zmienić tryb na REPLACE (R).
- Ustawić kursor edytora w miejscu, od którego ma nastąpić podmiana ciągu znaków. Aby uzyskać dostęp do pamięci rejestru, należy przytrzymać jednocześnie klawisze Ctrl oraz R (w dokumentacji ta kombinacja oznaczana jest jako CTRL-R). W rezultacie, znak stojący pod kursorem zostanie chwilowo (tylko na ekranie) zastąpiony znakiem podwójnego cudzysłowu. Na kolorowym terminalu będzie on wyróżniony kolorem niebieskim dla podkreślenia jego tymczasowego charakteru.
- Ręcznie wpisać znak cudzysłowu (ostatnio skopiowany fragment zawsze trafia do tak oznaczonego, domyślnego rejestru). Ciąg znaków zostanie wklejony, co w trybie REPLACE oznacza jego podmianę. Edycja dobiegła końca.
Uwaga: w przypadku potrzeby odwołania się do innej pozycji w rejestrze trzeba podać przyporządkowaną tej pozycji literę alfabetu. Lista wszystkich rejestrów pamięci wraz z ich zawartością dostępna jest w 2. identycznych poleceniach trybu Ex: :registers (krótko :reg) oraz :display (:di).
Wklejanie w wierszu poleceń
Kombinacja CTRL-R + litera (a-z) jest pomocna także przy wklejaniu skopiowanego tekstu w wiersz poleceń (COMMAND-LINE/Ex) edytora Vim. Pozwala to skutecznie uniknąć prozaicznych błędów wynikających ze żmudnego przepisywania fraz, a co za tym idzie, przyspieszyć i uczynić przyjemniejszą pracę nad tekstem.
Przykład polecenia w trybie Ex
Typowy przykład najczęściej używanego polecenia trybu Ex:
:%s/wyrażenie regularne lub tekst dotychczasowy/tekst docelowy/gc
Znak procentu wyznacza cały plik jako zakres działania dla polecenia zamiany tekstu. Ukośniki separują poszczególne części polecenia. Przedostatnie g (od global) nakazuje wykonać polecenie maksymalną liczbę razy (domyślnie tylko raz dla każdego z wierszy). Końcowe, opcjonalne c wymusza interaktywność – potwierdzanie wykonania polecenia w przypadku odnalezienia ciągu spełniającego podane kryterium.
Konfigurowalność
Vim jest edytorem dającym się w dużym stopniu konfigurować. W efekcie Vim może być surowy i nieprzyjazny jak jego protoplasta lub przeciwnie: cieszyć intelekt i oko bogactwem funkcji czy kolorów (patrz dla wiki). Informacja o bieżącym trybie pracy wyświetlana jest w ostatniej linii ekranu. Można ją włączyć specjalną zmienną. Odpowiednie polecenie wydaje się w trybie Ex :set showmode (lub krócej: :se smd) – zobacz :h smd). Powyższe polecenie, jak i większość innych, można dopisać do pliku konfiguracyjnego wczytywanego w czasie inicjalizacji. W systemach klasy GNU/Linux i Unix plik .vimrc znajduje się w katalogu domowym użytkownika. W systemach MS-DOS i Win32 odpowiada mu _vimrc (zob. :h vimrc).
Ograniczenia edytora
Mimo swoich imponujących możliwości – zwłaszcza w zakresie automatycznego przetwarzania tekstu – Vim standardowo oferuje dość ograniczone wsparcie dla operacji na pionowych blokach. Przy czym o ile skopiowanie pionowego bloku tekstu nie jest żadnym problemem (w trybie VISUAL BLOCK, włączanym kombinacją Ctrl-V, względnie Ctrl-Q w trybie symulowania klawiszy edytorów firmy Microsoft), to już zastąpienie takim blokiem w trybie REPLACE innego bloku z reguły nie przynosi spodziewanego rezultatu. Wynika to z faktu, że Vim w swej istocie pozostał edytorem wierszowym – nadającym się głównie do pisania kodu, więc niepraktycznym do tworzenia np. grafiki ASCII, gdzie swobodne manipulacje na pionowych blokach tekstu wymagają traktowania ekranu raczej jak matrycy znaków niż zbioru wierszy.
Z tego samego powodu nie należy do szczególnie wygodnych poruszanie się w pionie po długich, zawiniętych wierszach. Chyba że ustawimy to w pliku konfiguracyjnym. Należy umieścić poniższe linie:
map <Down>g<Down> map <Up>g<Up> nmap j gj nmap k gk vmap j gj vmap k gk
Jednakże ogromna konfigurowalność edytora i możliwość stworzenia skryptów zwiększających jego funkcjonalność powodują, że powyższe ograniczenia mogą być zlikwidowane.
W vi klawiszom ruchu w kierunku pionowym odpowiadają litery: k (góra) oraz j (dół). Tak też jest w Vimie, co weteranom trybu tekstowego pozwala zachować np. w GNU/Linuksie przynajmniej część przyzwyczajeń nabytych przy pracy z vi na systemie Unix.
Przykłady poleceń
Podstawowe polecenia są identyczne jak w vi. Vim jednak nie byłby tym, czym jest, gdyby nie miał setek nowych. Poniżej przykłady tych najciekawszych i najbardziej użytecznych (w wersjach najkrótszych, co oznacza: najpraktyczniejszych). Ich pełnobrzmiące nazwy można poznać wpisując :h nazwa_polecenia
Tryb NORMAL
- ga – wartość kodu ASCII znaku spod kursora (dziesiętnie, szesnastkowo, ósemkowo)
- g8 – wartość kodu znaku spod kursora przy założeniu, że jest to UTF-8
- 50% – skok na połowę pliku
- 10000go – skok do dziesięciotysięcznego bajta pliku
- 150G – skok do 150. wiersza
- g Ctrl-g – komplet informacji o pliku i położeniu kursora (kolumna, wiersz, słowo, liczba bajtów)
- q: – otwarcie okna z historią poleceń trybu Ex
Tryb ex
- :Sex – otwarcie okna z widokiem zawartości bieżącego katalogu (Split file explore)
- :as – wartość kodu ASCII znaku spod kursora (dziesiętnie, szesnastkowo, ósemkowo)
- :se wrap | se nolist | se lbr – zawinięcie długich wierszy z eleganckim łamaniem na granicy słów
- :se noma – skuteczna blokada pliku (bufora) przed modyfikacją
- :se ff=unix – wymuszenie uniksowego, pojedynczego znaku końca wierszy (spod dowolnego systemu)
- :se is | se hls – włączenie przyrostowego podświetlenia wystąpień znaków spełniających kryterium wyszukiwania
- :se vb – włączenie sygnału optycznego (visual bell) w miejsce akustycznego
- :sp nazwa_pliku – otwarcie nowego okna (bufora) edycyjnego w poziomie
- :vsp nazwa_pliku – otwarcie nowego okna (bufora) edycyjnego w pionie
- :%s/<[^>\n]*>//g – „oczyszczenie” pliku z kodu HTML
- :g/^\s*$/d – usunięcie wszystkich pustych linii
- :syntax on – włączenie reguł podświetlania składni (według rozszerzenia pliku)
- :se syn=css – wymuszenie podświetlania składni według reguł „języka” CSS2 (gdy rozszerzenie nie oddaje zawartości – np. .txt zamiast.css)
A oto para poleceń pomocna przy edycji Wikipedii na konsoli o zestawie znaków innym niż unikod (np. ISO-8859-2):
- :se enc=utf8 – ustawienie w Vimie kodowania UTF-8
- :se tenc=iso-8859-2 – poinformowanie Vima o obowiązującym kodowaniu na konsoli (terminal encoding)
Vim a vi
Vim został wyposażony w wielokrotne cofanie dokonanych zmian (tzw. undo) – domyślnie aż tysiąckrotne, podczas gdy vi pozostał przy jednokrotnym. Możliwe stało się wreszcie przewijanie ekranu w poziomie, przydatne przy edycji wierszy dłuższych niż szerokość ekranu. Brak też jest obecnie ograniczeń (odczuwalnych) na długość wierszy, ich liczbę czy rozmiar pliku.
Polecenia Vima i ich składnia są w pełni zgodne z vi, więc Vim oprócz tego samego przypisania klawiszy ma również system rejestrów (schowków) przeznaczonych do przechowywania fragmentów tekstu; tekst można kopiować do 26 rejestrów nazwanych dowolną literą alfabetu. Tak jak w vi, zakres A-Z służy do kopiowania tekstu między plikami. W Vimie jest to jednak znacznie wygodniejsze dzięki możliwości edycji pliku/plików w osobnych oknach (tzw. buforach). Vim potrafi znacznie więcej, oferując na przykład podświetlanie składni (prócz kilkuset języków programowania także dla HTML i CSS) oraz wsparcie dla narzędzi programistycznych takich jak ctags, make, CVS czy GCC.
Z pozostałych usprawnień wymienić można między innymi: przeglądanie katalogów (w osobnym oknie także na konsoli tekstowej i bez opuszczania edytowanego pliku), dostęp do historii wiersza poleceń trybu Ex, budowanie rozszerzeń, makr, zmianę w przypisaniach klawiszy, zapisywanie/otwieranie pliku w postaci zaszyfrowanej oraz obsługa rozszerzonych wyrażeń regularnych. To ostatnie w stopniu zbliżonym do wyspecjalizowanych, uniksowych narzędzi.
Chociaż Vim jest zasadniczo edytorem konsolowym, to istnieje wersja pod nazwą gvim, działająca w środowisku graficznym (również w systemach firmy Microsoft)
W odróżnieniu od vi, Vim może pracować zarówno w sposób modalny, jak i w trybie ciągłej edycji.