vim-main2

Wybrałem dla was 5 wtyczek, które zmieniają Vima w jeszcze lepszy edytor tekstowy oraz przybliżają go do pełnoprawnego IDE.

1. Vim-projectionist

Największą zaletą projectionist jest szybkie przełączanie pomiędzy plikiem bazowym, a jego, wcześniej zdefiniowanym, plikiem alternatywnym (“alternate”), który możemy zdefiniować dla każdego języka osobno:

{
  "src/main/java/*.java": {"alternate": "src/test/java/{}.java"},
  "src/test/java/*.java": {"alternate": "src/main/java/{}.java"}
}

Mając tak zdefiniowane pliki alternatywne i po wpisaniu :A, gdy znajdujemy się w modelu, zostanie otwarty plik zawierający jego testy. Istnieje kilka odpowiedników komendy :A - różnią się one miejscem, w którym ma zostać otwarty plik alternatywny:

  • obecnym oknie (:A)
  • obecny oknie, ale w podziale horyzontalnym (:AS)
  • obecnym oknie, ale w wertykalnym podziale okna (:AV)
  • w nowej zakładce (:AT)

Oprócz “alternate”, możemy zdefiniować także szkielet jaki ma być wstawiony do każdego nowego pliku w podanym folderze.

{
  "app/models/*.rb": {
    "template": [
      "class \{} < ApplicationRecord",
      "end"
    ]
  }
}

Przy tworzeniu szkieletów możemy wykorzystać wbudowane funkcje, które odpowiednio zmodyfikują wpisany tekst:

{snakecase}
{dirname}
{underscore}
{backslash}
{camelcase}
{colons}
{hyphenate}
{blank}
{uppercase}
{capitalize} --- alias jako \\{}
{basename}
{dot}
{singular}
{plural}
{open}
{close}

2. Vim-test

Testy można uruchamiać na wiele sposobów: począwszy od ręcznego uruchamiania wszystkich, pojedynczych plików testowych, po automatyczne (przy użyciu narzędzi śledzących zmiany w plikach np. guard).

Wtyczka vim-test pozwala na szybkie uruchamianie testów z poziomu Vima. Posiada wsparcie dla większości języków programowania. Wynik testow wyświetlany jest wewnątrz edytora więc nie musimy się przełączać między oknami. Cały czas pozostajemy w Vimie, co umożliwia nam szybkie poruszanie się, kopiowanie oraz wyszukiwanie w wyniku testów.

vim-test-select

Testy możemy uruchamiać w zależności od pożądanego zakresu, co daje nam ogromną kontrolę nad wykonywanymi testami oraz znacznie przyspiesza ich wykonywanie. Poniżej przedstawiam zakresy wraz z przykładowymi skrótami klawiszowymi:

nmap <silent> <leader>t :TestNearest<CR> " Uruchamia najbliższy
test względem aktualnej pozycji w otwartym pliku

nmap <silent> <leader>T :TestFile<CR> " Uruchamia cały plik
testowy, który mamy aktualnie otwarty

nmap <silent> <leader>a :TestSuite<CR> " Uruchamia wszystkie pliki
testowe

nmap <silent> <leader>l :TestLast<CR> " Uruchamia ostatni test

nmap <silent> <leader>g :TestVisit<CR> " Otwiera ostatni plik
testowy, który mieliśmy otwarty np. przed serią poprawek w kodzie
projektu.

Wtyczka umożliwia również zdefiniowanie własnej domyślnej komendy uruchomieniowej testów, dzięki czemu z łatwością uruchomimy je np. na dockerowym kontenerze.

let test#ruby#rspec#executable = 'docker-compose -f ../compose.yml run container_name rspec'

Kolejnym przydatnym ustawieniem jest możliwość zmiany strategii, jeśli nie chcemy, aby wynik testów pojawiał się wewnątrz edytora. Można zamienić ją na np. vtr oraz zainstalowanie pluginu vim-tmux-runner co spowoduje wyświetlenie testów w małym oknie Tmuxa.

let test#strategy = { 'suite': 'vtr' }

Strategie możemy ustawiać osobno dla każdego z zakresów wykonywanych testów (najbliższy, całość itp.). Dodatkowo vim-test przy pomocy pluginu projectionist pozwala na uruchamianie testów z poziomu plików nietestowych ustawionych jako pliki alternatywne.

3. Vim-rails

Vim-rails może okazać się dla was niezbędną wtyczką, jeśli jesteście deweloperami Ruby i korzystacie z frameworka Ruby on Rails. Istnieją odpowiedniki tego pluginu dla innych frameworków np. vim-phoenix które maja zbliżoną funkcjonalność.

Podstawową funkcjonalnością jest integracja z projectionist pod kątem frameworka, co daje nam możliwość skorzystania z pomocnych komend, takich jak:

  • Emodel nazwa_pliku - edycja modelu o podanej nazwie

  • Eview nazwa_pliku - edycja widoku o podanej nazwie

  • Econtroller nazwa_pliku - edycja kontrolera o podanej nazwie

Powyższe komendy mają swoje odpowiedniki w zależności od sposobu, w jaki ma zostać otwarty plik:

  • ! - plik o podanej nazwie zostanie utworzony, gdy nie istnieje na dysku. Dodatkowo, będzie zawierał szkielet, jeśli jest dla niego zdefiniowany. Znak ten należy dodać na końcu nazwy pliku.

  • S - plik zostanie otwarty horyzontalnym podziale okna, gdy zastąpimy E w nazwie komendy.

  • V - plik zostanie otwarty wertykalnym podziale okna, gdy zastąpimy E w nazwie komendy.

  • T - plik zostanie otwarty w nowej zakładce, gdy zastąpimy E w nazwie komendy.

Wtyczka integruje również Railsową konsole, generatory oraz serwer, co pozwala nam na pozostanie wewnątrz Vima i wykonywanie praktycznie wszystkich czynności związanych z rozwojem projektu.

  • Rake - pozwala na uruchamianie zadań rake

  • Rails - opakowuje komendę rails

  • Generate - krótsza forma Rails generate

  • Rails console - uruchamia konsole Rails

  • Rails server - uruchamia serwer aplikacji

Bardzo przydatną funkcjonalnością, jaką dostarcza wtyczka jest :Extract. Po zaznaczeniu bloku tekstu oraz wywołaniu tej komendy, zostajemy przeniesieni do nowego pliku z wydzielonym kodem. Zostaje on również automatycznie dołączony do pliku bazowego. W ten sposób możemy wydzielać concerny dla modeli i controllerów oraz partiale dla widoków.

4. Vim-surround

Surround to wtyczka do szybkiego usuwania, modyfikowania, dodawania otaczających tekst nawiasów, tagów xml i html oraz apostrofów.

5. Fzf.vim

Aby wygodnie wyszukiwać i otwierać pliki z poziomu Vima możemy, użyć popularnego pluginu ctrlp, który spełnia swoje zadanie, lecz wymaga cache’owania i odświeżania zaindeksowanych plików. Czasami potrafi działać powoli, a znalezienie konkretnego pliku nie zawsze jest łatwe, zwłaszcza, jeśli mamy wiele plików o tej samej nazwie lub w bardzo zagnieżdżonych folderach.

Lekarstwem na wszystkie bolączki jest plugin fzf, który wykorzystuje fuzzy finder fzf napisany w Go. Zaletą fzf jest błyskawiczne indeksowanie plików, co eliminuje potrzebę cache’owania. Autor przygotował wiele przydatnych, gotowych funkcji oraz api do integracji fzf z własnymi funkcjami. Każda z funkcji zwraca wynik, w którym to możemy wyszukiwać za pomocą fzf fuzzy finder.

Oto lista najbardziej przydatnych:

  • Files - zwraca listę wszystkich plików w projekcie
  • GFiles - zwraca listę plików znalezionych z użyciem git ls-files
  • Ag - zwraca listę plików wraz z numerem linii oraz jej zawartością, w których występuje wyszukiwana fraza
  • Lines - zwraca listę linii ze wszystkich plików znajdujących się w buforze
  • BLines - zwraca listę linii w aktualnym pliku
  • Commits - lista commitów wraz z podglądem zmian
  • BCommits - lista commitów dla aktualnego pliku wraz z podglądem zmian

Dodatkowo, każdą z funkcji można uruchomić dodając na końcu !, co spowoduje otwarcie wyniku w pełnym oknie, ignorując nasze wcześniejsze ustawienia rozmiaru okna.

Po wiecej pluginów wraz z ich ustawieniami oraz inne przydatne konfiguracje (tmux, fish shell), odsyłam do moich dotfiles, które umieściłem na githubie.

W kolejnym artykule, Kazik przedstawi 5 wtyczek, których używa na co dzień.

---

https://github.com/daktyr/dotfiles/blob/master/nvim/init.vim

https://github.com/junegunn/fzf

https://github.com/junegunn/fzf.vim

https://github.com/tpope/vim-projectionist

https://github.com/tpope/vim-surround

https://github.com/tpope/vim-rails

https://github.com/janko-m/vim-test

https://github.com/guard/guard

https://github.com/ctrlpvim/ctrlp.vim

https://github.com/avdgaag/vim-phoenix