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:
- Wykryj, czy plik jest w Javie
- Uruchom
google-java-format -i ${file}
- 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.