あなたのVisualStudioをセマンティックなカラフルに in VS2022

# C#エディタ

なにはともあれ、スクリーンショットをごらんください。

![MyClassBeforeAfter.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120077/03333180-2619-fd86-9218-6f24f70bf2b7.png)

左がバニラ、右が拡張後です。

Visual Studioの標準設定とViasforaというVS拡張でVisual Studioをカラフルにできます。
ただカラフルになって楽しむだけでなく、セマンティックに色分けをすることで、コードの理解にも一役かってくれます。

呼び出す時にしばしば間違う、以下の区別ができます。

- ローカル変数 vs パラメータ vs フィールド vs プロパティ
- 普通のメソッド vs 静的メソッド vs 拡張メソッド

しばしば議論になるfieldに `_` を付けるかべきかは
この機能でセマンティックに判別出来るので不要だと思います。

Expression-Bodiedで書かれたメソッドと読み取り専用プロパティは `()` の有無でしか区別できませんが、色がはっきり違うと識別しやすいです。

## Rainbow Braces

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120077/b09fd674-1a9a-5e1f-d00f-c95b4f1ef100.png)

これはViasforaの機能ですが、色から対応する括弧が区別できます。
余分な括弧の背景色が強調されています。

# XAMLエディタ

![MainWindowXamlBeforeAfter.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120077/b1501280-4fe5-dcc9-bbd5-3f29d7367c61.png)

XAMLエディタもカラフルにできます。
Closeタグは正直なくてもいいと思っているので、背景色に近くしてしまいました。
Bindingは大事なので目立つ色に。

# 導入方法

## Viasfora インストール

**2022/05/09アップデート**

Visual Studio Marketplaceからインストールできます。

https://marketplace.visualstudio.com/items?itemName=TomasRestrepo.Viasfora

<details><summary>正式リリース前のインストール方法</summary>

執筆時点（2021/11/25）ではViasforaの公式版はまだVisualStudio2022に対応していません。

[Viasfora - Visual Studio Marketplace](https://marketplace.visualstudio.com/items?itemName=TomasRestrepo.Viasfora)

なので、Forkしてビルドしたものが別レポジトリのReleaseにあるので、それを使います。

https://github.com/IllyaTheHath/viasfora/releases/tag/vs17

ダウンロードしたViasfora.vsixをダブルクリックして、VisualStudio2022にインストールします。

本家でもVS2022対応はするつもりのようなので、公式版が良ければ、それを待っても良いと思います。

https://github.com/tomasr/viasfora/issues/314

</details>

## 設定変更 - 設定ファイルインポートの場合

上のスクリーンショットの色は自前で調整しました。
作成した色の設定ファイルをGitHubに上げたので、ダウンロードしてインポートすると同じ色にできます。

https://raw.githubusercontent.com/soi013/SemanticColorTest/main/Exported-2021-11-25-1_only_fontAndColor_edit.vssettings

## 設定変更 - 自分で指定の場合

ツール＞オプション＞環境＞フォントおよび色＞で色を設定します。
関係ありそうな設定と調べた限りの解説です。

|              設定名               |               コード例               |                 解説                 |
| :-------------------------------: | :----------------------------------: | :----------------------------------: |
|  Viasfora Flow Control Keyword  |          **if**, **return**          |           条件分岐などのコードフローキーワード           |
| Viasfora Visibility Keyword | **private** string | アクセス修飾子 |
| Viasfora XML Prefix Closing |            _<_/**local**:~>            | XML(XAML)のCloseタグのプレフィックス |
|     Viasfora XML Closing Tag     |             </**Grid**>              |         XML(XAML)のCloseタグ         |
| Viasfora XML Prefix | _<**local**:~_> | XML(XAML)のタグのプレフィックス |
|                                   |                                      |                                      |
|       キーワード       | private **void** MyMethod(**int** input) => **new** MyClass(... | アクセス修飾子とコードフロー以外のC#文法の予約語 |
| シンボル - 静的 | static void **StaticMethod**() | 静的メソッド・クラスなどを太字にするかどうかだけ設定可能 |
|       ユーザーメンバー - インターフェイス       | interface **IMyInterface** |                                  |
|       ユーザーメンバー - クラス       | class **MyClass** |                                  |
|       ユーザーメンバー - デリゲート       | delegate void **MyDelegate** |                                  |
|       ユーザーメンバー - レコード       | record **MyRecord** |                                  |
|       ユーザーメンバー - レコード構造体       | record struct **MyStrRecord** |                                  |
|       ユーザーメンバー - 型パラメーター       | Method<**T**>(**T** input) | ジェネリックメソッド・クラスで使われる |
|       ユーザーメンバー - 構造体       | struct **MyStruct** |                                  |
| ユーザーメンバー - 列挙型 | enum **MyEnum** | |
| ユーザーメンバー - イベント | event MyDelegate **MyEvent**; | |
| ユーザーメンバー - パラメーター | static void Main(string[] **args**) | メソッドの引数やラムダ式の一時変数 |
|   ユーザーメンバー - フィールド   | privateField（上スクリーンショット） |                            |
|   ユーザーメンバー - プロパティ   |   Property（上スクリーンショット）   |                            |
|    ユーザーメンバー - メソッド    |      **InitializeComponent**();      |             拡張メソッドでないメソッド             |
|    ユーザーメンバー - ローカル    |    local（上スクリーンショット）     |             ローカル変数             |
|  ユーザーメンバー - 拡張メソッド  |           .**Select**(x =>           |                          |
| ユーザーメンバー - 定数 | const string **CONST_VALUE** |  |
|    ユーザーメンバー - 名前空間    |          using **System**;           |                              |
| ユーザーメンバー - 列挙型メンバー |           Color.**Black**            |                              |

# 注意点

- PrivateとPubulicで色の区別はない
- `シンボル - 静的`の設定で太字を有効にすると、静的メソッド・静的プロパティ・静的クラス・定数が**全て**太字になる。ただし、拡張メソッドは太字に**ならない**

# 環境

VisualStudio 2022 v17.0.1
.NET 6
C# 10
フォントはFira Code Retina

# VisualStudio 2019以前版

https://qiita.com/soi/items/4a3097eeb22facfd1b00

VisualStudio 2019以前はVisualStudioの設定が一部少なく、Viasforaに加えて、SemanticColorizerという拡張機能を追加で使います。