12
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-01-07

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

コマンドパレットが開くので対象のプログラミング言語(C++)をクリックします。
2018-01-07 (7).png

cpp.jsonが新しく作成されます。
2018-01-07 (8).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

Tabキーを押すとコードスニペットが展開されます。
2018-01-07 (10).png

更にTabキーを押すと括弧内に移動して展開が終了します。
2018-01-07 (11).png

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

12
16
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?