Am făcut recent ceva dezvoltare Java, iar editorii mei preferați sunt Visual Studio Code și Neovim. Configurația mea vim este configurată pentru a formata fișierele sursă Java folosind google-java-format, dar mă străduiam să obțin același comportament în Visual Studio Code. Această postare explorează modul de formatare a fișierelor sursă Java utilizând google-java-format în VS Code.
TL;DR
Instalați emeraldwalk/vscode-runonsave:
$ code --install-extension emeraldwalk.RunOnSave
Instalați google-java-format pentru sistemul dumneavoastră:
# Example using Homebrew on OS X$ brew install google-java-format
Configurați RunOnSave în setările Visual Studio Code:
{ "emeraldwalk.runonsave": { "commands": , },}
Background
Google publică un ghid de stil Google Java verbos, precum și google-java-format care reformatează codul Java în conformitate cu acest ghid de stil. Formatorul este disponibil ca un JAR Java și prin intermediul managerilor de pachete populare. De exemplu, pentru a instala formatorul pe OS X:
$ brew install google-java-format
Apoi, pentru a formata fișierele sursă Java, treceți-le ca argumente la comanda:
$ google-java-format -i ./MyClass.java
Lucrări existente
Există deja plugin-uri populare pentru google-java-format pentru IDE-uri precum Eclipse și IntelliJ. Din păcate, nu există niciunul oficial pentru Visual Studio Code la momentul scrierii acestui articol. Înainte de a veni cu propria mea soluție, am făcut câteva căutări pe Internet.
Cel mai popular răspuns vine de la redhat-developer/vscode-java#419 care ne îndreaptă către o pagină Wiki cu instrucțiuni de editare a unor configurări pentru 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",}
Aceasta va instrui editorul să folosească „GoogleStyle” atunci când formatează codul în loc de stilul încorporat. Acest lucru părea să se potrivească foarte bine, deoarece folosesc deja suportul pentru limbajul Java de la RedHat.
În timp ce acest lucru schimbă formatul implicit al codului, în testele mele nu s-a potrivit cu rezultatul executării google-java-format
direct din linia de comandă. Mai rău, a modificat lucruri precum antetele de licență, făcându-le invalide.
Am dat și peste Dev-Snippets/vscode-google-java-format-provider, care părea promițător, dar nu am reușit să-l fac să se înregistreze ca formator (și nu sunt singurul).
Soluție
Am pornit pe calea scrierii propriului meu plugin Visual Studio Code pentru a rula google-java-format
ca formator. După aproximativ 10 minute de exercițiu, mi-am dat seama că acest plugin va fi destul de prostesc:
- Detectați dacă fișierul este Java
- Executați
google-java-format -i ${file}
- Raportează orice eroare utilizatorului
Acești pași sunt, în esență, „executați o comandă la salvare”, și se pare că cineva a scris deja o extensie! emeraldwalk/vscode-runonsave citește setările Visual Studio Code, potrivește fișierele după o expresie regulată și apoi execută o comandă furnizată de utilizator. Aceasta s-a dovedit a fi o soluție minimă, dar perfectă!
Am instalat RunOnSave și google-java-format
pe Mac-ul meu:
$ code --install-extension emeraldwalk.RunOnSave$ brew install google-java-format
Apoi am configurat RunOnSave pentru a rula google-java-format
pe fișierele care se termină în .java
în setările Visual Studio Code:
{ "emeraldwalk.runonsave": { "commands": , },}
Aceasta necesită ca google-java-format
să fie în $PATH
meu. Dacă nu era, aș putea specifica în schimb calea completă către binar:
{ "cmd": "/usr/local/bin/google-java-format --replace ${file}"}
După ce am petrecut câteva ore încercând să ajung la paritate între google-java-format și formatOnSave
din Visual Studio Code, simt că am ajuns la o soluție perfectă.