V poslední době se věnuji vývoji v Javě a nejraději volím editory Visual Studio Code a Neovim. Moje nastavení vimu je nakonfigurováno tak, aby formátovalo zdrojové soubory Javy pomocí google-java-format, ale měl jsem problém dosáhnout stejného chování ve Visual Studio Code. Tento příspěvek zkoumá, jak formátovat zdrojové soubory jazyka Java pomocí google-java-format ve VS Code.
TL;DR
Instalace emeraldwalk/vscode-runonsave:
$ code --install-extension emeraldwalk.RunOnSave
Instalace google-java-format pro váš systém:
# Example using Homebrew on OS X$ brew install google-java-format
Konfigurace RunOnSave v nastavení Visual Studio Code:
{ "emeraldwalk.runonsave": { "commands": , },}
Pozadí
Google publikuje slovní průvodce styly Google Java a také google-java-format, který přeformátuje kód Java podle tohoto průvodce. Formátovač je k dispozici ve formátu Java JAR a prostřednictvím populárních správců balíčků. Chcete-li například nainstalovat formátovač v systému OS X:
$ brew install google-java-format
Chcete-li formátovat zdrojové soubory jazyka Java, předejte je jako argumenty příkazu:
$ google-java-format -i ./MyClass.java
Existující práce
Pro prostředí IDE, jako jsou Eclipse a IntelliJ, již existují populární zásuvné moduly google-java-format. Pro Visual Studio Code bohužel v době psaní tohoto článku žádné oficiální neexistují. Než jsem přišel s vlastním řešením, trochu jsem hledal na internetu.
Nejpopulárnější odpověď pochází z redhat-developer/vscode-java#419, která nás odkazuje na stránku Wiki s návodem na úpravu některých konfigurací 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",}
Tím editoru nařídíte, aby při formátování kódu používal „GoogleStyle“ místo vestavěného stylu. To se mi zdálo jako velmi vhodné, protože již používám podporu jazyka Java od RedHatu.
Přestože se tím změní výchozí formátování kódu, při mém testování se neshodovalo s výstupem při spuštění google-java-format
přímo z příkazového řádku. A co hůř, měnilo to věci jako licenční hlavičky, čímž se stávaly neplatnými.
Narazil jsem také na Dev-Snippets/vscode-google-java-format-provider, který vypadal slibně, ale nepodařilo se mi ho zaregistrovat jako formátovač (a nejsem jediný).
Řešení
Pustil jsem se cestou psaní vlastního zásuvného modulu Visual Studio Code pro spuštění google-java-format
jako formátovače. Asi po deseti minutách cvičení jsem si uvědomil, že tento zásuvný modul bude docela hloupý:
- Zjistit, zda je soubor Java
- Spustit
google-java-format -i ${file}
- Hlásit případné chyby zpět uživateli
Tyto kroky jsou v podstatě „spustit příkaz při uložení“, a ukázalo se, že někdo už napsal rozšíření! emeraldwalk/vscode-runonsave načte nastavení Visual Studio Code, porovná soubory na základě regulárního výrazu a poté spustí příkaz zadaný uživatelem. To se ukázalo jako minimální, ale dokonalé řešení!
Nainstaloval jsem RunOnSave a google-java-format
na svůj Mac:
$ code --install-extension emeraldwalk.RunOnSave$ brew install google-java-format
Poté jsem nakonfiguroval RunOnSave tak, aby spouštěl google-java-format
na soubory, které v nastavení Visual Studio Code končí na .java
:
{ "emeraldwalk.runonsave": { "commands": , },}
To vyžaduje, aby google-java-format
byl v mém $PATH
. Pokud by tam nebyl, mohl bych místo něj zadat úplnou cestu k binárnímu souboru:
{ "cmd": "/usr/local/bin/google-java-format --replace ${file}"}
Po několika hodinách strávených snahou o dosažení parity mezi formátem google-java a formatOnSave
ve Visual Studio Code mám pocit, že jsem dosáhl dokonalého řešení.