W poprzednim artykule przedstawiłem wam, jak zacząłem swoją przygodę z Vimem, i wspomniałem krótko o tym, że osobiście korzystam z dystrybucji LazyVim. Dzisiaj chciałbym po kolei wytłumaczyć, co to wszystko znaczy, przedstawić wam listę wtyczek, które mam zainstalowane, i pokazać, jak organizuję sobie pracę w tym środowisku.
Czym jest Neovim? Link to heading
Jak czytamy na stronie głównej projektu, jest to bazujący na Vimie, hiperrozszerzalny edytor tekstowy. Szukając więcej informacji, możemy też natknąć się na oficjalne repozytorium na GitHubie, które uzupełnia ten opis i zaznacza, że celem projektu jest mocna przebudowa bazowego Vima, aby ułatwić i zachęcić więcej osób do kontrybucji, rozdzielić pracę na większą liczbę programistów, umożliwić dodawanie zaawansowanych interfejsów użytkownika bez zbytniej ingerencji w rdzeń aplikacji oraz zwiększyć możliwości jej rozszerzania. To ostatnie osiągnięto poprzez dodanie, poza vimrc, obsługi języka Lua, co pozwoliło na dosłowną eksplozję ekosystemu. Coraz więcej ludzi zaczęło pisać swoje wtyczki dodające funkcjonalności, aż dotarliśmy do momentu, w którym można wręcz zmienić za ich pomocą Neovima w pełnoprawne środowisko programistyczne z kolorowaniem składni, podpowiedziami, interfejsami do debugowania kodu i uruchamiania testów, a nawet integracją z agentami AI.
Czym w takim razie są dystrybucje? Link to heading
W tym całym ekosystemie jest kilka problemów, ale największym na początku jest próg wejścia. Tworzenie własnej konfiguracji, dopasowanej do swoich potrzeb, potrafi być projektem samym w sobie. Sam tego próbowałem i udało mi się osiągnąć coś użytecznego, ale zdarzały się częste przypadki, że brakowało mi obsługi jakiejś specyficznej składni, a dodanie jej znowu zmieniało się w godziny szukania, jak to zrobić. Tu na scenę wkraczają dystrybucje, które są po prostu dopracowanymi paczkami konfiguracji, zapewniającymi wszystko, co może być potrzebne, żeby zacząć.
Jest wiele dystrybucji wartych wspomnienia, ale do najpopularniejszych zaliczają się:
- LazyVim
- NvChad
- LunarVim
- AstroNvim
- kickstart.nvim, który nie do końca jest dystrybucją, ale o tym troszkę później
Którą wybrać? Jeśli to i tak są wasze pierwsze kroki, to nie macie jeszcze swoich upodobań, więc polecam wybrać tę, która pasuje wam wizualnie, przeczytać dokumentację i spróbować. Jeśli nie będzie wam pasować obsługa, przejdźcie do następnej w kolejce. Jeśli macie już jakieś preferencje, to sami wiecie, czego chcecie.
Moim osobistym wyborem jest LazyVim, ale próbowałem też NvChada i Lunara. U mnie zadecydowały domyślne mapowania klawiszy, które wydały mi się najbardziej intuicyjne.
A o co chodzi z tym kickstart.nvim? Ten projekt to prosta konfiguracja w jednym pliku. Zawiera również pomocne komentarze, które mają przeprowadzić użytkownika przez cały proces tworzenia własnej konfiguracji. Jest to fajna alternatywa dla wszystkich chcących zgłębić ten proces, ale jak już wspomniałem wyżej, ja się od tego odbiłem.
Podstawy LazyVim w moim wydaniu Link to heading
Od razu zaznaczę, że nie będę tutaj opisywał całego procesu instalacji, ponieważ jest on wystarczająco dobrze wytłumaczony w dokumentacji, a nie lubię niepotrzebnego przepisywania czegoś, co już istnieje. W tym fragmencie chciałbym tylko wypisać, jakie wtyczki mam zainstalowane, jak ich używam i jak posługuję się całą dystrybucją na co dzień.
Jakie wtyczki, wariacie? Link to heading
No to zacznijmy od wtyczek i tego, jak je zainstalować. LazyVim dodaje nam bardzo fajny interfejs do zarządzania zestawami wtyczek według wybranych funkcjonalności. To menu otwieramy poprzez użycie komendy LazyExtras. Po uruchomieniu pokazuje nam się lista pogrupowana na kategorie: Enabled Plugins, Enabled Languages, Recommended Plugins, Plugins i Languages. Widzicie tutaj wszystkie rozszerzenia mające swoje konfiguracje w dystrybucji. Lista wyświetla również wszystkie zależności potrzebne do poprawnego działania, które zostaną zainstalowane. Dla mnie najbardziej użyteczne to:
- coding.mini-surround
- editor.harpoon2
- editor.inc-rename
- editor.snacks_explorer
- editor.snacks_picker
I oczywiście obsługa języków programowania oraz składni. W moim przypadku są to Go, Python, JavaScript, CSS, HTML, JSON, YAML i Markdown.
Which-key i leader - podstawy pomagające zrozumieć resztę Link to heading
Zacznijmy od podstaw. Czytając dokumentację LazyVim, często natkniecie się na skróty klawiszowe, które zaczynają się od <leader>. Co to za klawisz i dlaczego nie ma go na klawiaturze? Ta notacja oznacza główny klawisz funkcyjny, który w LazyVim jest domyślnie ustawiony na spację. Dokumentacja pokazuje też, w jakim trybie dostępne są poszczególne skróty, ale większość działa w trybie normalnym.
Aby nie przeskakiwać ciągle do przeglądarki i nie podglądać, jakie skróty co robią, możemy użyć wtyczki which-key, która jest włączona w tej dystrybucji od samego początku. Po wciśnięciu wspomnianego wcześniej leadera, czyli spacji, ukaże nam się okno z listą skrótów na aktualnym poziomie kombinacji. To świetne narzędzie do uczenia się obsługi albo szukania rzadziej używanych opcji.
Wyszukiwanie plików Link to heading
Teraz, znając podstawy, możemy przejść do tematu otwierania i szukania plików. W celu otwarcia bocznego panelu z widokiem drzewa możemy użyć kombinacji <leader>e bądź <leader>E, które odpowiednio otworzą go w głównym katalogu projektu, czyli tam, gdzie znajduje się .git, albo w aktualnym katalogu, z którego uruchomiliśmy Neovima. To metoda wizualna, która oczywiście jest dość wolna, jeśli wiesz, co dokładnie chcesz otworzyć, ale pomocna, gdy nie do końca wiesz, czego szukasz. Aby od razu przejść do wybranego pliku, możesz szukać po nazwie, używając <leader><leader> albo <leader>ff. W taki sam sposób możesz też przeszukiwać pliki po ich zawartości za pomocą skrótu <leader>/. Ostatnią pomocną dla mnie rzeczą jest wyszukiwanie tylko w obrębie otwartych plików, uruchamiane przez <leader>,.
Okna i bufory Link to heading
Kolejna rzecz, którą warto szybko zrozumieć, to różnica między oknami i buforami, bo na początku może się to trochę zlewać. Bufor to otwarty plik, a okno to widok na taki bufor. Możecie mieć więc kilka buforów otwartych w tle i tylko jeden widoczny na ekranie albo podzielić ekran na kilka okien i w każdym z nich oglądać inny plik.
Do takich podziałów w LazyVim służą bardzo proste skróty. <leader>| dzieli aktualny widok w pionie, a <leader>- dzieli go w poziomie. Później pomiędzy oknami poruszamy się dokładnie tak jak po Vimowych kierunkach, tylko z wciśniętym controlem: <C-h> idzie w lewo, <C-j> w dół, <C-k> w górę, a <C-l> w prawo. To jedna z tych kombinacji, które na początku wydają się dziwne, ale po chwili wchodzą w palce.
Bufory przełączam najczęściej przez <S-h> i <S-l>, czyli shift z h albo l, jeśli chcę po prostu przejść do poprzedniego lub następnego pliku. Alternatywnie działają też [b i ]b. Jeśli mam otwartych więcej plików i nie pamiętam kolejności, wracam do wspomnianego wcześniej <leader>,, bo wtedy widzę listę buforów i mogę wybrać konkretny. Do zamykania aktualnego bufora służy <leader>bd. Piszę “bufora”, a nie “pliku”, bo to nie usuwa niczego z dysku, tylko zamyka aktualnie otwarty widok w Neovimie.
LSP - czyli definicje i diagnostyka kodu Link to heading
LSP, czyli Language Server Protocol, to dla mnie moment, w którym Neovim zaczyna zachowywać się jak pełnoprawne IDE. To właśnie dzięki temu mamy podpowiedzi, informacje o błędach, przechodzenie do definicji, wyszukiwanie referencji, zmianę nazw symboli czy formatowanie kodu. Sam Neovim jest edytorem, ale dopiero połączenie go z serwerami językowymi daje ten poziom wygody, który znamy z większych środowisk.
Najczęściej używam gd, żeby przejść do definicji funkcji, typu albo zmiennej. Jeśli chcę zobaczyć, gdzie coś jest używane, wciskam gr. Pod K kryje się szybka dokumentacja elementu pod kursorem, co jest bardzo wygodne, kiedy nie pamiętam sygnatury funkcji albo chcę sprawdzić opis typu bez opuszczania pliku. Do zmiany nazwy symbolu używam <leader>cr, a do akcji proponowanych przez serwer językowy <leader>ca. To drugie przydaje się na przykład przy automatycznych importach albo prostych poprawkach sugerowanych przez narzędzia języka.
Diagnostyka też ma kilka skrótów, które warto znać. [d przenosi do poprzedniego problemu, ]d do następnego, a <leader>cd pokazuje szczegóły błędu lub ostrzeżenia w aktualnej linii. Jeśli projekt ma skonfigurowane formatowanie, <leader>cf formatuje aktualny plik albo zaznaczony fragment. W praktyce ten zestaw skrótów zastępuje mi większość klikania po IDE i pozwala bardzo szybko sprawdzać, co się dzieje w kodzie.
Bonus: LazyGit, czyli nowa jakość obsługi gita Link to heading
Na koniec coś, co nie jest konieczne do używania LazyVim, ale bardzo dobrze pasuje do pracy w terminalu. LazyVim ma oczywiście swoje skróty do gita. Możemy podejrzeć status przez <leader>gs, diff przez <leader>gd, blame aktualnej linii przez <leader>gb albo log przez <leader>gl. To wystarcza do szybkiego sprawdzenia, co się zmieniło, bez wychodzenia z edytora.
Ja jednak bardzo lubię dorzucić do tego LazyGita. To terminalowy interfejs do gita, w którym bardzo wygodnie robi się stage i unstage plików, commity, stashowanie, przeglądanie historii czy rozwiązywanie prostych konfliktów. Nie trzeba pamiętać wszystkich komend, a jednocześnie nadal zostajemy w terminalowym workflow.
Można go uruchomić po prostu instalując a potem używając polecenia w osobnym terminalu albo z poziomu Neovima z zainstalowanym LazyVim użyć skrótu <leader>gg.