VisualStudioでスニペットを作成する C++編

# 初めに
　スニペットとは``for``や``switch``を入力した時に出てくる便利な機能です。
![紹介.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540257/8a71ed50-c0db-c768-857b-251eec4de0df.gif)

追記：[おまけ１](#おまけ１)として、いくつかのコードスニペットのサンプルをダウンロード出来るようにしています。ご自由にお使い下さい。

# 作成方法
　まず、下準備として[この拡張機能(Snippet Designer)](https://marketplace.visualstudio.com/items?itemName=vs-publisher-2795.SnippetDesigner)をダウンロードしてください。

## スニペットファイルの作成
### 完全新規
　まず、[ファイル] > [新規作成] > [ファイル]を選択してください。
![ファイル作成1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540257/82edb367-ed2d-4ad0-b38b-d76b08f063f3.png)
　すると、以下のウィンドウが表示されるので、右上にある「検索 (Ctrl+E)」に「Snippet」を入力。「Code Snippet」が表示されるので選択。(上記の拡張機能がインストールされていないと表示されません)
![ファイル作成2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540257/eb1448ad-3973-1a59-236a-1e80686e191d.png)

### 既存コード
　既存のコードをスニペットとして書き出したい場合は書き出したいコードを選択して、``Export as Snippet``を選ぶだけです。
![書き出し.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540257/54cbd3e1-3d3d-fbca-a3a4-0fe9babfeb92.png)

## スニペットファイルエディターの説明
作成したら、以下の画像が出てきます。
![作成画面1.5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540257/f67fe7cf-8e56-94ee-ef94-f5e08ec7bf80.png)

### ① ファイル設定
![作成画面2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540257/bb4cc325-eb60-7a61-49b1-fc4cc5f92799.png)

#### Snippet
　ここはスニペットファイル自体の名前になります。後述する「Shortcut」と同じが無難だと思います。因みに、新規にファイルを作成する時に限り、自動でこの名前に置き換わります。

#### Language
　ここはプログラミング言語です。今回は「C++」になります。

#### Shortcut
　ここは名前の通り、入力した際に出てくるキーワードになります。例を上げると、``for``のスニペットを書いた時は``for``にしたり、``forhoge``にしたりします。勿論、キーワードは自由なのですが「アンダースコア」や「空白」を入れると、候補には出るのですが、書いたコードが出てきません。なので<font color="Red">**「半角英数字（大文字も含む）だけ」**</font>にしてください。いいですか？もう一度言いますよ？<font color="Red">**「半角英数字（大文字も含む）だけ」**</font>にしてください。
　私はこのことに気づかず、コード側に問題があるかと思い、小一時間無駄にしました。

### ② コード
![作成画面3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540257/621719c5-d9ab-9c6b-2b18-1627750290b1.png)

この場所に実際のコードを記入します。
使う際に

+ そもそも候補に表示されない
+ 候補から選択してもコードが出現しない
+ 出現したコードがおかしい

などが発生した場合は大体ここに原因があります。

### ③ パラメータ設定
![作成画面4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540257/fa5c5205-edf7-cd38-fc9e-95f67d505868.png)

　ここは「変数」に似たような機能を追加する場所です。というのも、スニペットはショートカットを入力して、固定のコードが作成されるだけではありません。コード中の特定の部分を変更して、作成したい場合もあります。むしろこの方が多いと思います。
　なのでここで「変数（パラメーター）」を追加して、動的に変更出来るようにします。

```cpp
// 例
for (int i = 0; i < length; i++) {}
// の部分の「int」「i」「length」に当たります。
```
#### ID
これはいわゆる「パラメーター名」ですが、1つ注意点があります。

+ <font color="red">**selected**</font>
+ <font color="red">**end**</font>

は使用しないようにしてください。というのも、これらの単語は所謂「予約語」に当たる単語になっています。

#### Tooltip
　これは「パラメーター」の説明になります。

#### Default to
　これは名前の通り、「パラメーター」のデフォルト値になります。

#### Kind
　これはよく分からないのですが、通常は「Literal」で大丈夫だと思います。「Object」はどういう時に使うのかは知りません。

#### Type
　これもよく分かりません。この欄をクリックすると自動で「N/A」になるので、それで大丈夫だと思います。

#### Function
　軽く調べてみたところ、既存の関数を呼ぶ欄みたいです。なので、通常は空白にしておくべきです。通常は``GenerateSwitchCases``・``ClassName``・``SimpleTypeName``のみを指定できるみたいです。詳細は[このサイト](https://docs.microsoft.com/ja-jp/visualstudio/ide/code-snippet-functions?view=vs-2019)を見て下さい。

#### Editable
　ここはエディターの時に編集の可不可を設定する欄です。忘れずにチェックマークを付けておきましょう。

## 実際にスニペットファイルにコードを記入
　さて、ここまで理解すれば後は「書き方」だけです。今回は例として``for``の初期値を変更出来るスニペットファイルを作成してみます。基本はC++の書き方ですが、上記の「パラメーター」の部分は``$パラメーター名(ID)$``のという独自の書き方になります。

+ ``$selected$``は置き換える「パラメーター」が一つだけの際に、「パラメーター」の代わりに``$selected$``を使う事で、置き換えることが出来るものです。
+ ``$end$``はコード スニペットの挿入後のカーソル位置を指定するものです。

```
for ( $type$ $index$ = $init$; $index$ < $max$; $index$++ )
{
    $end$
}
```

| ID | Tooltip | Default to | Kind | Type | Function | Editable |
|:----------:|:-----------:|:------------:|:----------:|:-----------:|:------------:|:----------:|
| type | コントロール変数 | size_t | Literal | N/A |  | ✔ | 
| max | 最大の長さ | length | Literal | N/A |  | ✔ | 
| init | 初期値 | 0 | Literal | N/A |  | ✔ | 
| index | インデックス | i | Literal | N/A |  | ✔ | 

これだけです。とても簡単に作成する事が出来ます。

### 注意点
　「パラメーター(ID)」を使う際に、先に「$$」を書いてから、間に「パラメーター名(ID)]を記入する方法だと、パラメーター欄に書いた分の「パラメーターの一部分」が追加されてしまいます。というのも、不足している「パラメーター（$で囲んでいる文字）」を自動で追加するお節介機能がある為で、パラメーター欄が大量の「あるパラメーター名の一部分の文字」で埋まる事態が発生しました。
　因みに、削除したい「パラメーター」は右クリックで``Remove Replacement``を選択すると削除する事が出来ます。
![作成画面　注意点.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540257/538d9233-1be7-0b9c-8968-d71180aea0c2.png)
　更に、保存・上書き保存する時は結構遅いので注意してください。

## プロパティー部分を記入
![作成画面 プロパティー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540257/7c364298-5086-9f2e-7f99-15cfcda56558.png)

### Author
　これはスニペット作成者の名前です。無くても構いません。

### Description
　これはスニペットの内容に関する説明文です。ここは書いた方が後々分かり易いので書いておくべきです。

### Help Url
　これはスニペットに関する情報の入手先URLですが、VisualStudioでは使用しないみたいなので、書く必要はないです。

---

　とりあえず、ここまで説明しました。プロパティー欄は個人で使う分にはこれで十分でだと思います。他の内容を知りたい場合は[コード スニペット スキーマ リファレンス](https://docs.microsoft.com/ja-jp/visualstudio/ide/code-snippets-schema-reference?view=vs-2019#helpurl-element "Microsoft公式のリファレンスです")を覗いてみて下さい。

# 追加方法
コードスニペットを追加する手段として、３種類あります。

## 1. 別ファイルに存在するスニペットファイルをインポートする
1. この場合は [ツール] > [コードスニペット マネージャー] を選択します。または、Ctrl+K, Ctrl+Bでも可能です。
![追加方法1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540257/bb692af1-0363-88a2-f3d5-ff89e4365160.png)

2. すると、以下の画面がでるので、インポートから追加したいスニペットファイルを選択します。
![追加方法2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540257/9e7efd97-75f3-856a-5cf2-274bd40de7d3.png)

3. この画面で「My Code Snippets」にチェックマークを入れ、完了を選択。
![追加方法3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540257/ca1dae65-f99d-32b7-658e-d086fa050f54.png)

4. 2 の画面に戻るのでOKを選択。
5. 既に同じ名前のスニペットファイルが存在するなら、以下のウィンドウが出るのでどれかを選択してください。
![追加方法4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540257/0386bd43-3d4a-c444-8dc6-11368215603a.png)

6. これで完了です。ちなみに、VisualStudioの再起動は不要です。

## 2. 標準ファイルにスニペットファイルを保存する
　この方法は1のやり方で出てきた「My Code Snippets」に直接スニペットファイルを保存する方法になっています。このやり方の利点は毎回「コードスニペットマネージャー」を開いてインポートするといった手間が省かれるという事です。
　標準ファイルの場所が「C:\Users\ (ユーザー名)\Documents\Visual Studio 2019\Code Snippets\Visual C++\My Code Snippets」にあります。

## 3. スニペットファイルが保存されている別ファイルを読み込むファイルにする
　この方法は任意の場所に存在するスニペットファイルの保存先を追加する事が出来るので、その方法を使用しています。

1. スニペットファイルマネージャーを開きます
2. マネージャー内にある「追加」を選択し、スニペットファイルを保存しているフォルダーを選択してください。
3. すると、そのフォルダーがマネージャー内に表示されるので、OKを選択して完了です。
![追加方法2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540257/9e7efd97-75f3-856a-5cf2-274bd40de7d3.png)

　この方法の唯一のデメリットが「スニペットファイルの名前がフォルダー違いで同じになる可能性がある」ぐらいでしょうか？これでもし、ショートカットまで同じなら、面倒くさい事になるので注意してください。
1. スニペットのショートカットを入力
2. ショートカットが表示されるので選択する
3. 更に、どのフォルダーのスニペットなのかを選択する
4. 確定する

といった手順になってしまいます。

# 実際に使ってみよう
　さて、これで準備は整いました。後は使うだけです。
![実践.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540257/52cda0f6-c361-abc7-8795-46a1f477dc17.gif)
この通り、標準の``for``スニペットで不満だったのが、初期値を変更出来る自作スニペットを作成して解決しました。

# 最後に
　「コードスニペットって意外と簡単に作れるな～」と思ってもらえれば光栄です。今回はC++でのスニペット作成でしたが、言語設定と実際のコードを変更するだけで別言語でも使う事が可能です。ただし、標準のスニペットファイルの位置は変わりますが、コードスニペットマネージャー内にフォルダーのパスが載っているので、それを参考にしてください。

それでは、快適なプログラミング生活を送りましょ〜

# おまけ１
おまけとして、スニペットファイルの一覧を公開しています。
githubからダウンロード出来るようにしています。また、改造なども構いませんので、ご自由にお使いください。
ただし、「<font color="red">**README.md**</font>」だけは、一切「変更しない・消さない」でお願いします。

https://github.com/hnnitns/VS-Snippet

# おまけ２
　標準の中で比較的よく使うスニペットをまとめてみました。なお、標準のスニペットの場所は「C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\IDE\VC\Snippets\1041\Visual C++」にあります。

## classi
### 説明
インライン コンストラクター/デストラクターを含むクラスに対するコード スニペット

### ショートカット
classi

### 例
```cpp
	class MyClass
	{
	public:
		MyClass()
		{}

		~MyClass()
		{}

	private:

	};
```

## for
### 説明
for ループに対するコード スニペット

### ショートカット
for

### 例
```cpp
	for (size_t i = 0; i < length; i++)
	{

	}
```

## forr
### 説明
逆向き for ループに対するコード スニペット

### ショートカット
forr

### 例
```cpp
	for (int i = length - 1; i >= 0; i--)
	{

	}
```

## rfor
### 説明
'範囲ベースの for' ループに対するコード スニペット

### ショートカット
rfor

### 例
```cpp
	for (auto& i : v)
	{

	}
```

## switch
### 説明
switch ステートメントに対するコード スニペット

### ショートカット
switch

### 例
```cpp
	switch (switch_on)
	{
	default:
		break;
	}
```