wtorek, 3 kwietnia 2012

Vim i Makefile

Ostatnio się bardzo opuszczam w publikowaniu postów ale postaram się to naprawić. Dzisiaj będzie o kompilowaniu w Vimie. Pewnie jesteście przyzwyczajeni do środowisk IDE, w których aby skompilować program wystarczy po prostu kliknąć kompiluj. Mało tego, gdy w kodzie są jakieś błędy wyświetli nam się ich lista z możliwością przejścia od razu do danej linii. Oczywiście dzisiejsze IDE oferują nam nawet sprawdzanie poprawności kodu w trakcie pisania ale nie będę się akurat tą opcją dzisiaj zajmował (choć da się również to zrobić w Vimie).

Identyczną funkcjonalność w naszym edytorze otrzymamy za pomocą komendy make. Chodzi mi tutaj o polecenie w Vimie, a nie o program o tej samej nazwie. Polecenie to uruchamia program ustawiony pod zmienną makeprg i parsuje komunikaty, które ten program wyrzuca na ekran. Domyślnie pod makeprg ustawiony jest program make ale możemy to zmienić w bardzo prosty sposób:

:set makeprg=g++

Zamiast g++ możemy wpisać dowolną nazwę programu.

No dobrze, czyli polecenie make uruchamia zewnętrzny program, parsuje jego komunikaty ale skąd ma wiedzieć co one oznaczają? Otóż porównuje je z wzorcem zapisanym w zmiennej errorformat. Wzorce zapisane są w odpowiednim formacie, o którym można dokładnie poczytać w :help errorformat. Ja ograniczę się tylko do pokazania przykładu, który z resztą był mi bardzo pomocny.

Domyślnie w tej zmiennej zapisane są wzorce komunikatów programu make ale jedynie tych angielskich. Jako, że ja mam ustawiony język polski w systemie to make również komunikuję się ze mną po polsku. I w tym momencie na domyślnych ustawieniach Vim sobie nie radzi. Dopisałem więc do errorformat dodatkowe reguły:

%Dmake[%*\\d]:\ Wejście\ do\ katalogu\ `%f',%Xmake[%*\\d]:\ Opuszczenie\ katalogu\ `%f',%D%*\\a:\ Wejście\ do\ katalogu\ `%f',%X%*\\a:\ Opuszczenie\ katalogu\ `%f'

Po krótce omówię symbole, których tu użyłem:
  • Pierwsza linia (tzn. do przecinka) mówi o tym, że make zmienia katalog, w którym kompiluje pliki. Jest to bardzo ważne, ponieważ Vim sobie zapamiętuje, w których katalogach są one kompilowane. Przydaje się to w momencie, w którym jesteśmy aktualnie w katalogu A i błąd wyskoczył w pliku, który znajduje się w zupełnie innym katalogu. Bez tej opcji nie moglibyśmy od razu do niego przeskoczyć.

    Dokładniej mówiąc %D oznacza, że Vim ma się spodziewać zmiany katalogu. Wraz z %D musi wystąpić %f w tej samej linii. %f określa miejsce, w którym pojawi się nowy katalog.

    Cała linijka mówi tyle, że gdy napotkasz wyrażenie make[jakakolwiek_liczba]: Wejście do katalogu `ścieżka' to wiedz, że zostały zmieniony aktualny katalog na ten w ścieżce.

  • Druga linijka jest analogiczna. %X oznacza opuszczenie katalogu i tak samo z %X w parze musi wystąpić %f.

  • Dwa ostatnie wzorce mówią dokładnie to samo, z tą tylko różnicą, że zamiast spodziewać się make[jakakolwiek_liczba] Vim może spodziewać się jakiegokolwiek ciągu liter i/lub liczb.

Kolejny upierdliwy problem (tym razem związany z programem make) polega na tym, że nie zawsze jesteśmy akurat w katalogu, który zawiera plik Makefile. I co wtedy? Wykonanie polecenia :make zakończy się komunikatem, że nie znaleziono pliku Makefile. Na szczęście program make posiada opcję -C która określa katalog, w którym znajduje się ten plik. Vim jest na tyle sprytny, że pozwala nam na przekazanie dowolnych parametrów do wykonywanego programu. Dla przykładu będąc w katalogu A i wiedząc, że plik Makefile znajduje się w katalogu wyżej możemy po prostu wywołać :make -C ..

Można sprawę jeszcze bardziej uprościć pisząc funkcję w Vimie, która sprawdzi gdzie jest plik Makefile i automatycznie uruchomi program make z odpowiednią opcją. Ale o tym może innym razem. Dodam jeszcze tylko, że listę błędów i ostrzeżeń po wykonaniu :make możemy wyświetlić za pomocą :copen i najeżdżając kursorem na odpowiednią linię oraz wciskając enter przejdziemy automatycznie do odpowiedniej linii w danym pliku.

To tyle na dziś. Miłego kodowania!

Brak komentarzy:

Prześlij komentarz