VSCode の Java 開発環境にフォーマッターを設定する

# はじめに

本記事では [Google Java Style](https://google.github.io/styleguide/javaguide.html) をサンプルに、フォーマッターを Visual Studio Code に設定する方法を紹介していきます。

# 前提

- 拡張機能 [Japanese Language Pack for Visual Studio Code](https://marketplace.visualstudio.com/items?itemName=MS-CEINTL.vscode-language-pack-ja) がインストールされていること。
- 拡張機能 [Java Extension Pack](https://marketplace.visualstudio.com/items?itemName=vscjava.vscode-java-pack) がインストールされていること。

# 設定方法

## 1. フォーマッターファイルを用意

Google Java Style のフォーマッターファイルは、https://raw.githubusercontent.com/google/styleguide/gh-pages/eclipse-java-google-style.xml に用意されています。こちらを使用します。

## 2. VSCode の設定を変更

VSCode の設定画面を開きます。GUI の設定画面を使う方法と settings.json を編集する方法の 2 つがありますが、どちらの方法でも構いません。

- GUI の設定画面：VSCode 画面左下のアクティビティバーの歯車アイコンを選択し、「設定」を選択する。
  ![メニューバーの「表示」 > 「コマンドパレット」 を赤枠で表示](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/945225/cb9bc0ab-cce0-16bd-cfe9-ed62ad3766d4.png)

- settings.json を編集：VSCode 画面上部のメニューバーの「表示」 > 「コマンドパレット」 を選択し、「Open Settings (JSON)」を選択する。
  ![コマンドパレットに「Open Settings (JSON)」と入力し、settings.jsonを開く画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/945225/2aa7292d-03b5-b2f2-b6bb-575643d10041.png)

### java.format.settings.url にフォーマッターファイルを指定

![java.format.settings.urlにURLを指定](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/945225/cd1fd764-2d37-61a3-ebd0-89b3da25f34e.png)

```
"java.format.settings.url": "https://raw.githubusercontent.com/google/styleguide/gh-pages/eclipse-java-google-style.xml"
```

`java.format.settings.url` にはフォーマッターの URL またはローカル上にあるフォーマッターのファイルパスを指定します。ここでは前述のフォーマッターの URL を指定しています。

### java.format.settings.profile にプロファイル名を指定

![java.format.settings.profileの設定画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/945225/3b3639f0-5e11-6a14-cf7b-59c3eaad154a.png)

```
"java.format.settings.profile": "GoogleStyle"
```

`java.format.settings.profile` にはフォーマッターのプロファイル名を指定します。フォーマッターファイル内に複数のプロファイル名が含まれる場合には必須です。

前述の URL のフォーマッターにはプロファイル名は 1 つしか存在しませんが、ひとまず指定しています。

## 3. 設定完了

これで設定が完了しました。java ファイルを開き、フォーマットをしてみましょう。
![format-java-file.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/945225/6cb12c65-1513-b45c-b57a-1e4b5b063a22.png)
VSCode 上で右クリックし、「ドキュメントのフォーマット」を選択します。すると、開いている java ファイルのコードが Google Java Style でフォーマットされます。

# 設定のカスタマイズ

ここからはフォーマッターと VSCode の設定の変更方法を紹介していきます。

## フォーマッターファイルをカスタマイズ

### ローカル上にフォーマッターファイルを作成

Google Java Style のフォーマッターファイルはネット上にあるため、このままでは設定内容の編集ができません。

https://raw.githubusercontent.com/google/styleguide/gh-pages/eclipse-java-google-style.xml の内容をコピペし、フォーマッターファイルをローカル上に作成しましょう。

フォーマッターのファイル名は `eclipse-java-google-style.xml` としておきます。もちろん他の名前で作成しても構いません。
![フォーマッターのファイルパスと内容](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/945225/666030da-dfb7-1db0-62dd-afa820ac03e3.png)

### フォーマッターの設定値を変更

Google Java Style はそのままでも十分良いかと思いますが、それでも一部の設定値を変更したいと思う場面もあるでしょう。

例えば以下のように Builder クラスを使用したコードの場合、フォーマットすると以下のようになります。

```java
public class MyClass {
  public static void main(String[] args) {
    User user = new User.Builder().setId("00000001").setName("user").setUserPrincipalName("user")
        .setMail("user@sample.com").setLocation("Japan").build();

    System.out.println(user);
  }
}
```

このままでは少々読みにくいかもしれません。フォーマッターファイルの設定値を以下のように変更しましょう。

```xml
<setting id="org.eclipse.jdt.core.formatter.join_wrapped_lines" value="false"/>
```

`org.eclipse.jdt.core.formatter.join_wrapped_lines` を `false` に変更すると、「改行」を削除せずにフォーマットするようになります。

先ほどの Builder クラスの setXxxx メソッドの前にある .（コロン）の前に改行を挿入し、その後にフォーマットしてみましょう。すると、以下のようになります。

```java
public class MyClass {
  public static void main(String[] args) {
    User user = new User.Builder()
        .setId("00000001")
        .setName("user")
        .setUserPrincipalName("user")
        .setMail("user@sample.com")
        .setLocation("Japan")
        .build();

    System.out.println(user);
  }
```

手動で挿入した改行が削除されずに残っていることが分かります。

## VSCode の設定をカスタマイズ

### java.format.settings.url を修正

`java.format.settings.url` の値を URL から、先に作成したフォーマッターファイルのファイルパスに変更します。
![java.format.settings.urlにファイルパスを指定](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/945225/01e160fa-a6f7-6066-3939-b873c2653a41.png)

```
"java.format.settings.url": "eclipse-java-google-style.xml"
```

### 自動フォーマット機能を有効化

フォーマットを手動で行うのは手間です。自動的にフォーマットが行われるよう設定しておくと便利でしょう。

前述の方法で settings.json を開き、以下のように記述してください。

```jsonc
{
  // ... 略 ...

  "[java]": {
    "editor.formatOnSave": true,
  },
}
```

`editor.formatOnSave` を `true` にすることで、java ファイル保存時に自動的にフォーマットされるようになります。

あわせて、 `editor.formatOnPaste` （コード貼り付け時に自動フォーマット） と `editor.formatOnType` （コード入力中に自動フォーマット） も有効化しておくと良いでしょう。

なお、最終的に settings.json の内容は以下のようになります。

```jsonc
{
  // ... 略 ...

  "java.format.settings.profile": "GoogleStyle",
  "java.format.settings.url": "eclipse-java-google-style.xml",
  "[java]": {
    "editor.formatOnPaste": true,
    "editor.formatOnSave": true,
    "editor.formatOnType": true,
  },
}
```

# 参考

https://code.visualstudio.com/docs/java/java-linting

# 備考

- この記事では Google Java Style を例にしていますが、他のコードスタイルを適用したい場合には、そのフォーマッターファイルを用意してください。
- `java.format.settings.url` のデフォルト値は空です。そして値が空の場合、VSCode 上で開いているワークスペース内の `.settings/org.eclipse.jdt.core.prefs` がフォーマッターとして指定されます。例えばこのファイル内に `org.eclipse.jdt.core.formatter.join_wrapped_lines=true` と記載されている場合、改行は削除せずにフォーマットされます。