Visual Studio Code のC++コードスニペットを作った

Visual Studio Code(以下VSCode)のコードスニペットの記事はいくつかあるのですがC++のスニペットは無かったので作ってみました。
内容としてはVisual Studioのコードスニペットを参考に以下のようにしています。
・K&Rスタイル風にしている
・コードスニペット呼び出しのプリフィックスを真似た
・Visual Studio独自のプリプロセッサなどは含めていない
・#をプリフィックスとして設定する方法が分からなかったのでpに変更している

#Visual Studio Codeのコードスニペットの作成方法について
こちらで詳しく解説していますので説明は省略します。

独自のスニペットを作成 | Visual Studio Code Docs
https://vscode-doc-jp.github.io/docs/userguide/userdefinedsnippets.html

後述のTab補完を有効にするにはユーザー設定で "editor.tabCompletion": true を記述する必要があります。

#追加方法
ファイル(F)→基本設定(P)→ユーザースニペット(S)をクリックします。
![2018-01-07 (6).png](https://qiita-image-store.s3.amazonaws.com/0/178471/0aba1b41-212f-b155-c10e-d26244422a46.png)

コマンドパレットが開くので対象のプログラミング言語(C++)をクリックします。
![2018-01-07 (7).png](https://qiita-image-store.s3.amazonaws.com/0/178471/a7256b9b-4d85-129f-88dc-7ccd2bea4744.png)

cpp.jsonが新しく作成されます。
![2018-01-07 (8).png](https://qiita-image-store.s3.amazonaws.com/0/178471/de4f49b9-bb93-7f1a-f8d3-11653809e50b.png)

そこへ以下の内容を貼り付けて上書き保存します。
※保存した時点で反映されるのでVSCodeの再起動は不要です。

```cpp.json
{
	"~": {
		"prefix": "~",
		"body": [
			"~${1:typename}() {",
			"\t$0",
			"}",
			],
		"description": "デストラクターに対するコード スニペット"
	},
	"class": {
		"prefix": "class",
		"body": [
			"class ${1:name} {",
			"\tpublic:",
			"\t\t${1:name}();",
			"\t\t~${1:name}();",
			"",
			"\tprivate:",
			"\t\t${0:}",
			"};",
			"",
			"${1:name}::${1:name}() {",
			"}",
			"",
			"${1:name}::~${1:name}() {",
			"}",
			],
		"description": "クラスに対するコード スニペット"
	},
	"classi": {
		"prefix": "classi",
		"body": [
			"class ${1:name} {",
			"\tpublic:",
			"\t\t${1:name}() {",
			"\t\t}",
			"\t\t~${1:name}() {",
			"\t\t}",
			"",
			"\tprivate:",
			"\t\t${0:}",
			"};"
			],
		"description": "インライン コンストラクター/デストラクターを含むクラスに対するコード スニペット"
	},
	"ctor": {
		"prefix": "ctor",
		"body": [
			"${1:typename}() {",
			"\t${0:}",
			"};"
			],
		"description": "コンストラクターに対するコード スニペット"
	},
	"do": {
		"prefix": "do",
		"body": [
			"do {",
			"\t${0:}",
			"} while(${1:expression});"
			],
		"description": "do...while ループに対するコード スニペット"
	},
	"else": {
		"prefix": "else",
		"body": [
			"else {",
			"\t${0:}",
			"}",
			],
		"description": "else ステートメントに対するコード スニペット"
	},
	"enum": {
		"prefix": "enum",
		"body": [
			"enum ${1:name} {",
			"\t${0:}",
			"}",
			],
		"description": "列挙型に対するコード スニペット"
	},
	"enumclass": {
		"prefix": "enumclass",
		"body": [
			"enum class${1:name} {",
			"\t${0:}",
			"}",
			],
		"description": "列挙型クラスのコード スニペット"
	},
	"for": {
		"prefix": "for",
		"body": [
			"for (${1:type} ${2:index} = 0; ${2:index} < ${3:length}; ${2:index}++) {",
			"\t${0:}",
			"}"
			],
		"description": "for ループに対するコード スニペット"
	},
	"foreach": {
		"prefix": "foreach",
		"body": [
			"for  each (${1:type} ${2:indentifier} in ${3:collection}) {",
			"\t${0:}",
			"}"
			],
		"description": "foreach ステートメントに対するコード スニペット"
	},
	"forr": {
		"prefix": "forr",
		"body": [
			"for (${1:type} ${2:index} = 0; ${2:index} > ${3:length}; ${2:index}--) {",
			"\t${0:}",
			"}"
			],
		"description": "逆向き for ループに対するコード スニペット"
	},
	"if": {
		"prefix": "if",
		"body": [
			"if(${1:true}) {",
			"\t${0:}",
			"}",
			],
		"description": "if ステートメントに対するコード スニペット"
	},
	"ifelse": {
		"prefix": "ifelse",
		"body": [
			"if(${1:true}) {",
			"\t${0:}",
			"} else {",
			"}"
			],
		"description": "if else ステートメントに対するコード スニペット"
	},
	"namespace": {
		"prefix": "namespace",
		"body": [
			"namespace ${1:name}) {",
			"\t${0:}",
			"}",
			],
		"description": "名前空間に対するコード スニペット"
	},
	"pif": {
		"prefix": "pif",
		"body": [
			"#if ${1:expression}",
			"\t${0:}",
			"#endif //${1:expression}",
			],
		"description": "#if に対するコード スニペット"
	},
	"pifdef": {
		"prefix": "pifdef",
		"body": [
			"#ifdef ${1:expression}",
			"\t${0:}",
			"#endif //${1:expression}",
			],
		"description": "#ifdef に対するコード スニペット"
	},
	"pifndef": {
		"prefix": "pifndef",
		"body": [
			"#ifndef ${1:expression}",
			"\t${0:}",
			"#endif //${1:expression}",
			],
		"description": "#ifndef に対するコード スニペット"
	},
	"rfor": {
		"prefix": "rfor",
		"body": [
			"for (auto& ${1:variable} : ${2:range}) {",
			"\t${0:}",
			"}"
			],
		"description": "'範囲ベースの for' ループに対するコード スニペット"
	},
	"switch": {
		"prefix": "switch",
		"body": [
			"switch (${1:expression}) {",
			"\tdefault:",
			"\tbreak;${0:}",
			"}"
			],
		"description": "switch ステートメントに対するコード スニペット"
	},
	"try": {
		"prefix": "try",
		"body": [
			"try {",
			"\t${1:}",
			"}",
			"catch (const std::exception&) {",
			"\t${0:}",
			"}"
			],
		"description": "try catch に対するコード スニペット"
	},
	"union": {
		"prefix": "union",
		"body": [
			"union ${1:name} {",
			"\t${0:}",
			"}"
			],
		"description": "共用体に対するコード スニペット"
	},
	"while": {
		"prefix": "while",
		"body": [
			"while (${1:expression}) {",
			"\t${0:}",
			"}"
			],
		"description": "while ループに対するコード スニペット"
	}
}
```

#動作確認
試しにifと入力し次のようにコードスニペットが候補に出てきます。
![2018-01-07 (9).png](https://qiita-image-store.s3.amazonaws.com/0/178471/8f2ea3f9-f1ad-8b7f-eeed-3f93da1531aa.png)

Tabキーを押すとコードスニペットが展開されます。
![2018-01-07 (10).png](https://qiita-image-store.s3.amazonaws.com/0/178471/e9f53290-7810-645d-1be5-89e2eb4d594a.png)

更にTabキーを押すと括弧内に移動して展開が終了します。
![2018-01-07 (11).png](https://qiita-image-store.s3.amazonaws.com/0/178471/d49f503e-d3e2-bfbd-01a0-e36c0180f7a2.png)

かなり雑多に作ったけどもっと良く出来そうなのでイジってみて下さい(投げやり