VS Codeのユーザースニペット機能の使い方メモ

https://code.visualstudio.com/docs/editor/userdefinedsnippets

# スニペットとは
スニペットは定形のテキストをあらかじめ登録しておいてそれを呼び出す機能(他のツールだと「テンプレート」「雛型」みたいな言い方もする)。あらかじめ定義されているスニペットを利用する以外に、自分でスニペットを定義することもできる(ユーザースニペット)。
ソースコードでも文章でも、普段の作業でよく入力するテキストを登録しておけば作業のスピードアップになるし入力間違いを防ぐこともでき、使い方によって作業効率がかなり上がる。

# VS Codeのユーザースニペットの種類
Visual Studio Code(以下VS Codeとする)では、ファイルの種類(.txtとか.htmlとか)ごとにユーザースニペットを定義する方法と、ファイルの種類に関係なく共通のユーザースニペット(グローバルスニペット)を定義する方法の大きく２種類の定義方法がある。

# ユーザースニペット定義の表示方法
VS Codeの画面左下の歯車アイコンをクリックし、`ユーザースニペット`を選択する(またはメニューバーの`ファイル`->`ユーザー設定`->`ユーザースニペット`)。すると下記のような、スニペット定義を選択または作成する表示になる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181011/5f180131-b118-e5a9-cc7f-a5fee8d939c2.png)
### ファイルの種類ごとのユーザースニペットの場合(初回時)
使用可能なファイルの種類がリストボックスで表示されているので、スニペット定義したいファイルの種類を選ぶ。リストをスクロールして探すか、キーワードを入力してリスト表示を絞り込んで探す。

例えばテキストファイル(拡張子.txtもしくは未保存の新規テキスト)の場合は`plaintext`を選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181011/89015a4c-e87f-1810-e2a8-40d90cde33d3.png)
### グローバルのユーザースニペットの場合(初回時)
リストの一番上に表示されている`新しいグローバルスニペットファイル`を選択する。作成する定義ファイル名を訊かれるので適当なファイル名(例えば`global`など)を入力して`Enter`を押す。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181011/0f12335a-c224-1890-51b6-3a49c59882dd.png)
### 2回目以降
一度定義ファイルを作成すると次回からは`既存のスニペット`としてリストの先頭に表示されるようになる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181011/2a26e4a1-b6ec-ba2d-3aba-3c1107415dcd.png)

# スニペットの定義の仕方
上記操作を行うとこのような定義ファイルが表示される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181011/514621f5-2eae-4ebb-db42-6870839691c7.png)
コメントで説明とサンプルが書かれているので基本的にはこれを参考に定義を記述していけばよい。なお、定義を複数記述する場合は定義と定義の間をカンマで区切る。
定義で最低限必要なのはスニペットの名前と`prefix`と`body`。`body`にはテキストを、`prefix`にはそのテキストを呼び出す時に入力する文字を定義する。
`description`はそのスニペットの説明を記述したい時に使用する。
`scope`はグローバルスニペットにおいてファイルの種類を特定したい場合に記述する。

```json:記述例1
"sample1": {
	"prefix": "yoda",
	"body": "やるか、やらぬかだ。やってみる、などない。"
}
```

例えば上記のような定義を記述して定義を保存(Ctrl+S)し、新規にエディタを開いて`y`と入力すると自動的に入力候補としてsample1が表示されるので、続いて`Enter`を押すとテキストが置き換わる。
![snippet.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181011/d9dd5d72-e7de-ad33-38da-9f346387ab41.gif)

### 複数行
置き換えテキストを複数行にしたい場合は`body`を`[`と`]`で囲ってカンマで行を区切ってテキストを記述する。

```json:記述例2
"sample2": {
	"prefix": "yoda",
	"body": ["やるか、やらぬかだ。", "やってみる、などない。"]
}
```

### 可変値の入力
テキストの中で部分的に値が毎回変わる場合は可変値入力用にカーソル位置を指定することができる。カーソル位置に`$1`,`$2`,...のような記述をしておくと、テキスト置き換え後にまず`$1`の位置にカーソルが移動し、何か入力後`Tab`を押すと`$2`にカーソルが移動する。
最後のカーソル位置はテキストの末尾になるが、テキストの末尾以外にしたい場合は最終位置を`$0`で指定する。

```json:記述例3
"sample3": {
	"prefix": "marie-antoinette",
	"body": "$1がなければ$2を食べればいいじゃない。"
}
```

入力する可変値をテキスト内の複数箇所に反映させたい場合は同じ$番号を複数箇所に記述する。

```json:記述例4
"sample4": {
	"prefix": "lincoln",
	"body": "$1の$1による$1のための政治"
}
```

可変値のデフォルト値を指定したい場合は`${1:デフォルト値}`のような書き方をする。呼び出し時にはデフォルト値のままで良い場合はただ`Tab`を押し、値を変更したい場合は値を上書きして`Tab`を押す。

```json:記述例5
"sample5": {
	"prefix": "marie-antoinette",
	"body": "${1:パン}がなければ${2:ケーキ}を食べればいいじゃない。"
}
```

あらかじめ可変値の選択肢が決まっている場合はその選択肢を定義しておくことができる。

```json:記述例6
"sample6": {
	"prefix": "marie-antoinette",
	"body": "${1:パン}がなければ${2|ケーキ,お寿司,火鍋|}を食べればいいじゃない。"
}
```

### 変数
スニペット内で使用できる変数があらかじめ定義されており、それを用いることでスニペットの利用範囲がより広がる。

```json:記述例7
"sample7": {
	"prefix": "variable",
	"body": [
		"ここは$TM_LINE_NUMBER行目です。",
		"今日は$CURRENT_YEAR/$CURRENT_MONTH/$CURRENT_DATEです。",
		"現在のクリップボードの値は「$CLIPBOARD」です。"
	]
}
```

他にファイルやディレクトリの情報なども取得できる。使える変数はVS Codeのバージョンアップによって増えたり変わったりするので、最新の変数は[VS Codeのドキュメント](https://code.visualstudio.com/docs/editor/userdefinedsnippets#_variables)で確認する。