fastapple's blog

時系列関係なく、情報を追記・分割・統合などします。ブログに記載の内容のうち、引用ではなく、私自身が記載している文章・コードなどについては、自由にご利用ください。

vscodeのC++用コードスニペット


最初に余談だが、vscodeの設定箇所はいくつもあってたまにわからなくなる。User SettingとWorkspace Settingが分かれて存在している。基本的な考え方として、自分が利用する設定はUser Settingに書けばいい。Workspace Settingには、Workspace固有の設定を書くことになる。User Setting→Workspace Settingの順で適用される。設定を触りたいときは、Ctrl+Shift+Pでコマンドパレットを開いてUser Settingを探せばいい。
以下、公式の説明。
Visual Studio Code User and Workspace Settings

さて、最近atcoderをよくやっている。vscodeを使っているが、for文とかもっと早く書きたいので、vscodeでユーザ定義のcode snippetを書く方法を調べつつC++用のcode snippetを書いてみた。
公式のドキュメントは以下にある。
Creating your own snippets in Visual Studio Code

自作スニペットは、File -> Preference -> User Snippetsを選んで、自分が設定したい拡張子のファイル(今回はc++だから、cpp.json)を選んで編集すればいい。

なお、vscodec++を使っている場合、MSのc++用のExtensionを入れている場合も多いと思う。
以下が公式のExtension。
marketplace.visualstudio.com

公式のExtensionを入れていれば、Ctrl+Spaceで補完を呼び出したときに、使えるcode snippetがいくつか出てくる。

しかし、割ともっとアグレッシブに使いたい。後で考え直す可能性はあるが、以下の1文字スニペットを定義するためのcpp.jsonを用意した。

  • m → とりあえず、main関数とかusing namespaceとか書いてくれる。#defineはgcc競プロ用だが、必要に応じて適宜変更すればOK。
  • w → while(true)節に展開される。とりあえず無限ループを用意したいとき。
  • f → よくありがちなfor文を書く。tabstopを適宜設定した。tabstopは、$1とかで書く。例えばiをデフォルト値として用意したいなら、${1:i}と書けばいい。
  • c →ありがちなcout << value << endl;用。
  • v →vector(int) A(N)

とりあえず用意したけど、後で色々変えるかもしれない。

	"main function": {
		"prefix": "m",
		"body": [
			"#include <bits/stdc++.h>",
			"",
			"using namespace std;",
			"",
			"int main() {",
			"\t${1:/* code */}",
			"",
			"\treturn 0;",
			"}"
		],
		"description": "basic main function"
	},
	"while true": {
		"prefix": "w",
		"body": [
			"while(true) {",
			"\t${1:/* code */}",
			"}"
		],
		"description": "while(true) loop"
	},
	"basic for": {
		"prefix": "f",
		"body": [
			"for(int ${1:i} = 0; ${1:i} < ${2:max}; ${1:i}++) {",
			"\t${3:/* code */}",
			"}"
		],
		"description": "basic for loop"
	},
	"basic cout": {
		"prefix": "c",
		"body": [
			"cout << ${1:/* code */} << endl;"
		],
		"description": "basic cout"
	},
	"basic vector": {
		"prefix": "v",
		"body": [
			"vector<${1:int}> ${2:A}(${3:N});"
		],
		"description": "basic vector"
	}

次は、Shift+Alt+Fで、コード整形ができるのだが、そのフォーマットは、C++の場合、clang-formatというので細かく指定することができるようなので、それを調べて書きたいと思う。

/* 2019/1/20 追記 */
自分のclang-formatとの整合性を取る形で少し直した。(){のように詰めて書きたいが、見当たらなかったので、() {にした。