Vim - mniej znane, a przydatne polecenia
Wpis przeznaczony dla użytkowników Vima, którzy mają już jakieś doświadczenie. Nie będę tu omawiał podstaw.
O Vimie słyszała pewnie większość zaawansowanych użytkowników komputerów. Jedni go kochają, drudzy nienawidzą, jeszcze inni boją, ale nie można mu odmówić ogromnych możliwości. Nie ma raczej osoby, która wiedziałaby o nim wszystko (no, może Bram Moolenaar czyli autor, ale też wątpię - pamięć bywa bardzo zawodna). Mam na co dzień styczność z wieloma użytkownikami Vima i widzę jak go używają. Często zauważam, że znam jakąś adekwatną do danej sytuacji sztuczkę czy komendę, której taka osoba nie używa. Nie wątpię, że oni też wiedzą o wielu rzeczach, o których ja nie mam pojęcia, niemniej postanowiłem zrobić spis moim zdaniem najprzydatniejszych znanych mi rzeczy.
Text Objects
Tzw. text objects to części tekstu, które Vim jest w stanie rozpoznać i wyodrębnić z reszty. Można mu taki obiekt kazać np. usunąć lub skopiować. Przykładowymi obiektami są word, tag czy sentence. Każdy obiekt ma swoje... powiedzmy, że separatory, które oddzielają go od reszty tekstu (spacje dla tekstu, tagi "brzegowe" dla tagów xml/html itd.). Mówię o tym, bo za chwilę będą mieć znaczenie. Stosuje się je poprzez użycie odpowiedniej komendy (np. d - skasowanie, c - zastąpienie, y - skopiowanie), potem "a" lub "i" - to pierwsze wpływa również na separatory. Na koniec trzeba podać o jaki obiekt nam chodzi - w dla słów (duże W wyznacza słowa TYLKO według spacji, bez innych algorytmów), t dla tagów, "(" lub ")" dla nawiasów (inne nawiasy też działają) i tak dalej. Można doczytać w manualu. Odkąd się dowiedziałem o text objectach, moje życie stało się prostsze.
Zapis sesji
Jedną z bardziej przydatnych komend, zwłaszcza przy pisaniu programów i innych wieloplikowych rzeczy, jest :mksession (w skrócie :mks). Komenda ta zapisuje aktualnie otwarte pliki, układ kart i splitów czy - zależnie od ustawień - włączone opcje Vima (polecam wyłączyć - set ssop-=options - inaczej nie będzie ponownie wczytywany vimrc, a więc i ewentualne zmiany w nim). Sesja domyślnie zapisuje się pod nazwą Session.vim. Aby wczytać taką sesję, najłatwiej uruchomić Vima z parametrem -S <nazwa sesji gdy inna niż domyślna>. Niestety sesja przechowuje ścieżkę bezwzględną (chociaż ma to swoje zalety), więc przy przenoszeniu plików trzeba uważać. Dodam, że gdy już istnieje plik z sesją, po mks trzeba dopisać wykrzyknik, żeby zaznaczyć, że Vim ma ten plik nadpisać.
Undofile
Od wersji 7.3 Vim pozwala na przechowywaniu historii zmian między uruchomieniami. Pozwala to cofnąć zmiany nawet po zakończeniu edycji pliku. Specjalnie dla tej funkcji skompilowałem sobie ręcznie nowszego Vima niż jest w repo używanego przeze mnie (jeszcze) Ubuntu 10.04. Nawiasem mówiąc, oni nie zamierzają aktualizować programów w tym repo? Nie tak rozumiem wsparcie... No ale wróćmy do tematu tego wpisu. Fabrycznie undofile można niestety włączyć jedynie globalnie - dla wszystkich plików. Na szczęście ktoś był na tyle miły, że napisał plugin, który zmienia taki stan rzeczy. Proponuję włączyć dla plików typu xorg.conf, vimrc, zshrc i innych tego typu - tam cofanie zmian może się bardzo przydać.
Modeline
Modeline to specjalna linijka w edytowanym pliku, która pozwala automatycznie ustawiać pewne opcje Vima jedynie dla tego pliku. Z bardziej przydatnych opcji wymienię ft - typ pliku (głównie chodzi o obsługę składni) i fdm - sposób zwijania tekstu (o tym za chwilę). Linijkę umieszcza się na początku (pierwsze dwie linijki) lub końcu pliku, najczęściej w komentarzu. Format to: vim: set OPCJE :. Dla skryptów shellowych dodamy # na początku, a w C++ będzie to //.
Fold
Nie każdy o tym wie, ale Vim pozwala na obecne w niemal wszelkich IDE zwijanie fragmentów tekstu. Domyślnie robi się to ręcznie - komendą zf. Z innych podstawowych komend z tym związanych: zo otwiera fold, zc zamyka, zd kasuje. Jeszcze mniej osób wie o możliwości robienia foldów stałych, które będą dalej istniały po ponownym otwarciu pliku. Aby to zrobić, trzeba przestawić opcję fdm na coś innego niż manual. Omówię tutaj moje ulubione ustawienie - marker - ale jest ich więcej. W trybie marker, zawijane jest wszystko pomiędzy linijką zawierającą {{{ a linijką zawierającą }}}. Najlepiej umieścić to w komentarzu i dopisać krótki komentarz do początku folda. Można robić foldy zagnieżdżone. Tryb robienia działania foldów najwygodniej chyba ustawiać przez wspomniane modeline.
Nie chciałem pisać o wtyczkach, ale ta mnie ostatnio zauroczyła. Znam ją od niespełna tygodnia, więc pewnie wielu rzeczy o niej jeszcze nie wiem. Możliwe, że są lepsze wtyczki tego typu, nie miałem czasu poszukać. No ale do rzeczy! tskeleton pozwala robić szablony do wybranych typów plików. Przykładowo ustawiłem sobie Makefile z paroma bajerami, nad którymi nie chce mi się za każdym razem myśleć. Jak na wtyczkę do szablonów przystało, tskeleton umożliwia wstawianie do szablonu różnych zmiennych np. fragmentu nazwy pliku czy ścieżki. Wtyczka ta nie jest jakimś wielkim odkryciem, ale mimo wszystko znacznie poprawia komfort pracy. Jeśli ktoś ma pomysł jakie pliki można by "zszablonować", to chętnie posłucham. Mam już cpp, c, hpp, h i Makefile.
Na pewno znalazłoby się jeszcze wiele rzeczy do omówienia. Pewne komendy mogłem uznać za zbyt oczywiste, a o wielu zwyczajnie nie wiem. Co by nie myśleli niektórzy moi znajomi, Vim nadal ma przede mną wiele tajemnic. I bardzo możliwe, że to jest to co mnie przy nim trzyma - odkrywanie tych tajemnic. Nawiasem mówiąc, z tego samego powodu czasem mam ochotę nauczyć się też obsługi Emacsa.
Zachęcam do pisania w komentarzach o swoich ulubionych funkcjach Vima.