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:
- Detektera om filen är Java
- Kör
google-java-format -i ${file}
- 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.