Använda google-java-format med VS Code

Jag har gjort en del Java-utveckling nyligen, och mina föredragna redaktörer av val bounce mellan Visual Studio Code och Neovim. Min vim-installation är konfigurerad för att formatera Java-källfiler med google-java-format, men jag kämpade för att uppnå samma beteende i Visual Studio Code. Det här inlägget undersöker hur man kan formatera Java-källfiler med google-java-format i VS Code.

TL;DR

Installera emeraldwalk/vscode-runonsave:

$ code --install-extension emeraldwalk.RunOnSave

Installera google-java-format för ditt system:

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

Konfigurera RunOnSave i inställningarna för Visual Studio Code:

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

Bakgrund

Google publicerar en utförlig Google Java-stilguide samt google-java-format som omformaterar Javakod enligt denna stilguide. Formateraren finns tillgänglig som ett Java JAR och via populära pakethanterare. För att till exempel installera formateraren på OS X:

$ brew install google-java-format

För att formatera Java-källfiler skickar du dem som argument till kommandot:

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

Existerande arbete

Det finns redan populära insticksmoduler för google-java-format för IDE:er som Eclipse och IntelliJ. Tyvärr finns inga officiella sådana för Visual Studio Code när detta skrivs. Innan jag kom på min egen lösning gjorde jag en del sökningar på Internet.

Det mest populära svaret kommer från redhat-developer/vscode-java#419 som hänvisar oss till en Wikisida med instruktioner för att redigera en del av konfigurationen för 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",}

Detta kommer att instruera redaktören att använda ”GoogleStyle” när den formaterar kod istället för den inbyggda stilen. Detta verkade passa bra eftersom jag redan använder RedHats Java Language Support.

Men även om detta ändrar standardformatet för koden, stämde det i mina tester inte överens med resultatet av att köra google-java-format direkt från kommandoraden. Vad värre är, det ändrade saker som licenshuvuden, vilket gjorde dem ogiltiga.

Jag snubblade också över Dev-Snippets/vscode-google-java-format-provider, som verkade lovande, men jag kunde inte få den att registrera sig som formaterare (och jag är inte den enda).

Lösning

Jag började skriva ett eget insticksprogram för Visual Studio Code för att köra google-java-format som en formaterare. Efter ungefär 10 minuter av övningen insåg jag att det här insticksprogrammet skulle bli ganska dumt:

  1. Detektera om filen är Java
  2. Kör google-java-format -i ${file}
  3. Rapportera eventuella fel tillbaka till användaren

De här stegen är i huvudsak ”kör ett kommando vid sparande”, och det visar sig att någon redan har skrivit ett tillägg! emeraldwalk/vscode-runonsave läser inställningar för Visual Studio Code, matchar filer med ett reguljärt uttryck och kör sedan ett kommando som tillhandahålls av användaren. Detta visade sig vara en minimal men perfekt lösning!

Jag installerade RunOnSave och google-java-format på min Mac:

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

Därefter konfigurerade jag RunOnSave så att det kör google-java-format på filer som slutar på .java i inställningarna för Visual Studio Code:

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

Detta kräver att google-java-format finns i min $PATH. Om det inte var det kunde jag ange den fullständiga sökvägen till binärfilen istället:

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

Efter att ha tillbringat några timmar med att försöka uppnå likvärdighet mellan google-java-format och Visual Studio Codes formatOnSave känns det som om jag har nått en perfekt lösning.