Używanie google-java-format z VS Code

Ostatnio pracowałem nad rozwojem Javy, a moje preferowane edytory z wyboru wahają się pomiędzy Visual Studio Code i Neovim. Moja konfiguracja vima jest skonfigurowana do formatowania plików źródłowych Java przy użyciu google-java-format, ale miałem problemy z osiągnięciem tego samego zachowania w Visual Studio Code. Ten post wyjaśnia jak formatować pliki źródłowe Java używając google-java-format w VS Code.

TL;DR

Instalacja emeraldwalk/vscode-runonsave:

$ code --install-extension emeraldwalk.RunOnSave

Instalacja google-java-format dla systemu:

# Example using Homebrew on OS X$ brew install google-java-format

Konfiguracja RunOnSave w ustawieniach Visual Studio Code:

{ "emeraldwalk.runonsave": { "commands": , },}

Tło

Google publikuje zwięzły przewodnik po stylach Google Java, a także google-java-format, który przeformatowuje kod Java zgodnie z tym przewodnikiem po stylach. Formatter jest dostępny jako Java JAR i poprzez popularne menedżery pakietów. Na przykład, aby zainstalować formatter na OS X:

$ brew install google-java-format

Aby sformatować pliki źródłowe Javy, należy przekazać je jako argumenty do polecenia:

$ google-java-format -i ./MyClass.java

Istniejące prace

Istnieją już popularne wtyczki do google-java-format dla IDE takich jak Eclipse i IntelliJ. Niestety w chwili pisania tego tekstu nie istnieją żadne oficjalne dla Visual Studio Code. Zanim wymyśliłem własne rozwiązanie, trochę poszukałem w Internecie.

Najpopularniejsza odpowiedź pochodzi z redhat-developer/vscode-java#419, która kieruje nas do strony Wiki z instrukcjami edycji konfiguracji Visual Studio Code:

{ "java.format.settings.profile": "GoogleStyle", "java.format.settings.url": "https://raw.githubusercontent.com/google/styleguide/gh-pages/eclipse-java-google-style.xml",}

To poinstruuje edytor, aby używał „GoogleStyle” podczas formatowania kodu zamiast wbudowanego stylu. Wyglądało to na świetne dopasowanie, ponieważ już używam Java Language Support RedHata.

Pomimo, że zmienia to domyślny format kodu, w moich testach nie pasowało to do wyniku uruchomienia google-java-format bezpośrednio z wiersza poleceń. Co gorsza, zmodyfikowało to rzeczy takie jak nagłówki licencji, czyniąc je nieważnymi.

Natknąłem się również na Dev-Snippets/vscode-google-java-format-provider, który wydawał się obiecujący, ale nie udało mi się go zarejestrować jako formatera (i nie jestem jedyny).

Rozwiązanie

Zacząłem pisać własną wtyczkę do Visual Studio Code, aby uruchomić google-java-format jako formater. Po około 10 minutach ćwiczenia, zdałem sobie sprawę, że ta wtyczka będzie dość głupia:

  1. Wykryj, czy plik jest w Javie
  2. Uruchom google-java-format -i ${file}
  3. Raportuj wszelkie błędy z powrotem do użytkownika

Te kroki są zasadniczo „uruchom polecenie przy zapisie”, a okazuje się, że ktoś już napisał rozszerzenie! emeraldwalk/vscode-runonsave odczytuje ustawienia Visual Studio Code, dopasowuje pliki na podstawie wyrażenia regularnego, a następnie uruchamia komendę podaną przez użytkownika. Okazało się to minimalnym, ale doskonałym rozwiązaniem!

Zainstalowałem RunOnSave i google-java-format na moim Macu:

$ code --install-extension emeraldwalk.RunOnSave$ brew install google-java-format

Potem skonfigurowałem RunOnSave, aby uruchamiał google-java-format na plikach, które kończą się na .java w ustawieniach Visual Studio Code:

{ "emeraldwalk.runonsave": { "commands": , },}

To wymaga, aby google-java-format znajdował się w moim $PATH. Gdyby tak nie było, mógłbym zamiast tego podać pełną ścieżkę do pliku binarnego:

{ "cmd": "/usr/local/bin/google-java-format --replace ${file}"}

Po spędzeniu kilku godzin na próbach osiągnięcia parytetu pomiędzy google-java-format i Visual Studio Code’s formatOnSave, czuję, że osiągnąłem idealne rozwiązanie.