VSCodeスニペットとは#
VSCode(Visual Studio Code)のスニペット機能は、繰り返し入力するコードパターンをテンプレート化し、短いトリガーワードで素早く展開できる機能です。ループ処理、条件分岐、関数定義など、定型的なコードを毎回手入力する必要がなくなり、開発効率を大幅に向上させることができます。
本記事では、VSCodeスニペットの基本的な使い方から、変数・プレースホルダーを活用した高度なスニペット作成、チーム開発でのプロジェクトスニペット共有まで、実践的な内容を網羅して解説します。
VSCodeスニペットの特徴#
VSCodeスニペットには以下のような特徴があります。
- IntelliSenseとの統合:
Ctrl+Spaceでスニペット候補が他の補完候補と一緒に表示されます
- Tab補完対応:
editor.tabCompletionを有効にすると、プレフィックス入力後にTabキーでスニペットを展開できます
- 動的な値の挿入: 変数を使って現在の日時、ファイル名、選択テキストなどを自動挿入できます
- プレースホルダーによる効率的な入力: タブストップで複数箇所を順番に編集できます
VSCodeスニペットの基本構文#
VSCodeスニペットはJSON形式で定義します。基本的な構造は以下の通りです。
1
2
3
4
5
6
7
8
9
10
|
{
"スニペット名": {
"prefix": "トリガーワード",
"body": [
"展開されるコード1行目",
"展開されるコード2行目"
],
"description": "スニペットの説明"
}
}
|
各プロパティの役割を確認しましょう。
| プロパティ |
必須 |
説明 |
prefix |
必須 |
IntelliSenseでスニペットを呼び出すトリガーワード。配列で複数指定可能 |
body |
必須 |
展開されるコード本体。文字列または配列で指定 |
description |
任意 |
IntelliSenseに表示される説明文 |
scope |
任意 |
グローバルスニペットで適用言語を限定する場合に使用 |
isFileTemplate |
任意 |
ファイルテンプレートとして使用する場合にtrue |
基本的なスニペット例#
JavaScriptのforループスニペットの例を見てみましょう。
1
2
3
4
5
6
7
8
9
10
11
|
{
"For Loop": {
"prefix": ["for", "for-const"],
"body": [
"for (const ${2:element} of ${1:array}) {",
"\t$0",
"}"
],
"description": "for...ofループを挿入"
}
}
|
このスニペットでは以下の動作が行われます。
forまたはfor-constと入力してスニペットを呼び出します
- 最初に
${1:array}の位置にカーソルが移動し、arrayがデフォルト値として選択されます
- Tabキーを押すと
${2:element}に移動します
- 再度Tabキーを押すと
$0(最終カーソル位置)に移動してスニペットモードが終了します
ユーザースニペットの設定方法#
VSCodeでユーザースニペットを設定する方法を解説します。
スニペットファイルの作成手順#
- コマンドパレット(
Ctrl+Shift+P)を開きます
- 「Snippets: Configure Snippets」または「スニペット: スニペットの構成」と入力して選択します
- 以下のオプションから選択します
- 言語名(例: JavaScript): 特定言語専用のスニペットファイルを作成
- New Global Snippets file: 全言語共通のグローバルスニペットファイルを作成
言語別スニペットファイルの保存場所#
ユーザースニペットは以下の場所に保存されます。
| OS |
パス |
| Windows |
%APPDATA%\Code\User\snippets\ |
| macOS |
~/Library/Application Support/Code/User/snippets/ |
| Linux |
~/.config/Code/User/snippets/ |
言語別スニペットファイルはjavascript.json、typescript.jsonのように言語識別子で命名されます。グローバルスニペットファイルは.code-snippets拡張子で保存されます。
プロジェクトスニペットの設定方法#
チーム開発では、プロジェクト固有のスニペットを共有することで、コーディング規約の統一や開発効率の向上が期待できます。
プロジェクトスニペットの作成#
- コマンドパレットで「Snippets: Configure Snippets」を選択します
- 「New Snippets file for ‘プロジェクト名’…」を選択します
- ファイル名を入力します(例:
project.code-snippets)
.vscodeフォルダ内にスニペットファイルが作成されます
プロジェクトスニペットの配置#
project-root/
├── .vscode/
│ ├── settings.json
│ └── project.code-snippets ← ここに配置
├── src/
└── package.json
プロジェクトスニペットファイルをGitリポジトリにコミットすることで、チームメンバー全員が同じスニペットを利用できます。
プロジェクトスニペットの例#
React開発プロジェクト用のスニペット例を示します。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
{
"React Functional Component": {
"scope": "typescriptreact,javascriptreact",
"prefix": "rfc",
"body": [
"import type { FC } from 'react';",
"",
"interface ${1:${TM_FILENAME_BASE}}Props {",
" $2",
"}",
"",
"export const ${1:${TM_FILENAME_BASE}}: FC<${1:${TM_FILENAME_BASE}}Props> = ({ $3 }) => {",
" return (",
" <div>",
" $0",
" </div>",
" );",
"};",
""
],
"description": "React関数コンポーネントを作成"
}
}
|
scopeプロパティでtypescriptreact,javascriptreactを指定することで、TSXファイルとJSXファイルでのみこのスニペットが有効になります。
VSCodeスニペットのタブストップとプレースホルダー#
タブストップとプレースホルダーを活用することで、効率的にコードを入力できます。
タブストップの基本#
タブストップは$1、$2のように番号で指定します。Tabキーを押すと番号順にカーソルが移動します。
1
2
3
4
5
6
7
|
{
"Console Log": {
"prefix": "cl",
"body": "console.log($1);$0",
"description": "console.logを挿入"
}
}
|
$1: 最初のカーソル位置
$0: 最終カーソル位置(スニペットモード終了時の位置)
プレースホルダーの活用#
プレースホルダーは${1:デフォルト値}の形式で、初期値を設定できます。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
{
"Try Catch": {
"prefix": "try",
"body": [
"try {",
"\t${1:// code}",
"} catch (${2:error}) {",
"\t${3:console.error($2);}",
"}$0"
],
"description": "try-catchブロックを挿入"
}
}
|
同一タブストップの連動#
同じ番号のタブストップは連動して編集されます。
1
2
3
4
5
6
7
8
9
10
11
|
{
"For Index Loop": {
"prefix": "fori",
"body": [
"for (let ${1:i} = 0; ${1:i} < ${2:length}; ${1:i}++) {",
"\t$0",
"}"
],
"description": "インデックス付きforループ"
}
}
|
${1:i}を編集すると、他の${1:i}も同時に変更されます。
ネストしたプレースホルダー#
プレースホルダーは入れ子にできます。
1
2
3
4
5
6
7
8
9
10
11
12
|
{
"Async Function": {
"prefix": "afn",
"body": [
"async function ${1:name}(${2:params}): Promise<${3:void}> {",
"\t${4:${5:const result = }await ${6:expression};}",
"\t$0",
"}"
],
"description": "async関数を作成"
}
}
|
VSCodeスニペットの選択肢(Choice)#
選択肢を使うと、プレースホルダーで複数の候補からドロップダウンで選択できます。
選択肢の構文#
選択肢は${1|選択肢1,選択肢2,選択肢3|}の形式で定義します。
1
2
3
4
5
6
7
|
{
"Console Method": {
"prefix": "cons",
"body": "console.${1|log,warn,error,info,debug|}($2);$0",
"description": "consoleメソッドを選択して挿入"
}
}
|
このスニペットを展開すると、log、warn、error、info、debugの選択肢がドロップダウンで表示されます。
実践的な選択肢の例#
TypeScriptの型定義スニペットで選択肢を活用する例です。
1
2
3
4
5
6
7
8
9
10
11
12
|
{
"Type Definition": {
"prefix": "typedef",
"body": [
"${1|type,interface|} ${2:Name} ${1/(type)/${1:+=}/}${1/(interface)/${1:?extends ${3:Base} }/}{",
"\t${4:property}: ${5|string,number,boolean,unknown|};",
"\t$0",
"}"
],
"description": "型定義を作成"
}
}
|
VSCodeスニペットの変数#
VSCodeスニペットでは、様々な組み込み変数を使用して動的な値を挿入できます。
ファイル関連の変数#
| 変数名 |
説明 |
TM_FILENAME |
現在のファイル名(拡張子含む) |
TM_FILENAME_BASE |
現在のファイル名(拡張子なし) |
TM_DIRECTORY |
現在のファイルのディレクトリ |
TM_FILEPATH |
現在のファイルのフルパス |
RELATIVE_FILEPATH |
ワークスペースからの相対パス |
WORKSPACE_NAME |
ワークスペース名 |
WORKSPACE_FOLDER |
ワークスペースのパス |
日時関連の変数#
| 変数名 |
説明 |
出力例 |
CURRENT_YEAR |
現在の年(4桁) |
2026 |
CURRENT_YEAR_SHORT |
現在の年(2桁) |
26 |
CURRENT_MONTH |
月(2桁) |
01 |
CURRENT_MONTH_NAME |
月名(フル) |
January |
CURRENT_MONTH_NAME_SHORT |
月名(短縮) |
Jan |
CURRENT_DATE |
日(2桁) |
12 |
CURRENT_DAY_NAME |
曜日名(フル) |
Sunday |
CURRENT_DAY_NAME_SHORT |
曜日名(短縮) |
Sun |
CURRENT_HOUR |
時(24時間) |
14 |
CURRENT_MINUTE |
分(2桁) |
30 |
CURRENT_SECOND |
秒(2桁) |
45 |
CURRENT_SECONDS_UNIX |
Unixタイムスタンプ |
1736650245 |
CURRENT_TIMEZONE_OFFSET |
タイムゾーンオフセット |
+09:00 |
その他の変数#
| 変数名 |
説明 |
TM_SELECTED_TEXT |
選択中のテキスト |
TM_CURRENT_LINE |
現在行の内容 |
TM_CURRENT_WORD |
カーソル位置の単語 |
TM_LINE_INDEX |
行番号(0始まり) |
TM_LINE_NUMBER |
行番号(1始まり) |
CLIPBOARD |
クリップボードの内容 |
RANDOM |
ランダムな6桁の数字 |
RANDOM_HEX |
ランダムな6桁の16進数 |
UUID |
UUID v4 |
コメント関連の変数#
言語に応じたコメント記号を挿入できます。
| 変数名 |
説明 |
JavaScript |
HTML |
BLOCK_COMMENT_START |
ブロックコメント開始 |
/* |
<!-- |
BLOCK_COMMENT_END |
ブロックコメント終了 |
*/ |
--> |
LINE_COMMENT |
行コメント |
// |
N/A |
変数を使ったスニペット例#
ファイルヘッダーコメントを生成するスニペットです。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
{
"File Header": {
"prefix": "header",
"body": [
"$BLOCK_COMMENT_START",
" * @file ${TM_FILENAME}",
" * @description $1",
" * @author ${2:Your Name}",
" * @created ${CURRENT_YEAR}-${CURRENT_MONTH}-${CURRENT_DATE}",
" $BLOCK_COMMENT_END",
"$0"
],
"description": "ファイルヘッダーコメントを挿入"
}
}
|
VSCodeスニペットの変数トランスフォーム#
変数トランスフォームを使うと、変数の値を正規表現で加工して挿入できます。
トランスフォームの構文#
${変数名/正規表現/置換文字列/オプション}
トランスフォームの例#
ファイル名から拡張子を除去する例です。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
{
"Class from Filename": {
"prefix": "class",
"body": [
"class ${TM_FILENAME_BASE/(.*)/${1:/pascalcase}/} {",
"\tconstructor() {",
"\t\t$0",
"\t}",
"}"
],
"description": "ファイル名からクラスを作成"
}
}
|
利用可能なフォーマット指定子#
| 指定子 |
説明 |
入力例 |
出力例 |
/upcase |
大文字に変換 |
hello |
HELLO |
/downcase |
小文字に変換 |
HELLO |
hello |
/capitalize |
先頭大文字 |
hello |
Hello |
/camelcase |
キャメルケース |
hello-world |
helloWorld |
/pascalcase |
パスカルケース |
hello-world |
HelloWorld |
条件付きトランスフォーム#
マッチした場合としなかった場合で出力を変える構文です。
${変数名/正規表現/${キャプチャ番号:+マッチ時の値}/}
${変数名/正規表現/${キャプチャ番号:?マッチ時:非マッチ時}/}
${変数名/正規表現/${キャプチャ番号:-非マッチ時のデフォルト}/}
実践的なトランスフォーム例#
kebab-caseのファイル名からPascalCaseのコンポーネント名を生成する例です。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
{
"React Component from Filename": {
"prefix": "rcf",
"body": [
"import React from 'react';",
"",
"export const ${TM_FILENAME_BASE/([a-z]*)(-)?/${1:/capitalize}/g} = () => {",
" return (",
" <div>",
" $0",
" </div>",
" );",
"};",
""
],
"description": "ファイル名からReactコンポーネントを作成"
}
}
|
user-profile.tsxというファイルで実行すると、UserProfileというコンポーネント名が生成されます。
VSCodeスニペットのプレースホルダートランスフォーム#
プレースホルダーにもトランスフォームを適用できます。
プレースホルダートランスフォームの構文#
${タブストップ番号/正規表現/置換文字列/オプション}
活用例:getter/setter生成#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
{
"Property with Getter/Setter": {
"prefix": "propgs",
"body": [
"private _${1:name}: ${2:string};",
"",
"get ${1:name}(): ${2:string} {",
" return this._${1:name};",
"}",
"",
"set ${1:name}(value: ${2:string}) {",
" this._${1:name} = value;",
"}$0"
],
"description": "プロパティとgetter/setterを生成"
}
}
|
言語別VSCodeスニペット設定#
各プログラミング言語向けの実用的なスニペット例を紹介します。
TypeScriptスニペット#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
{
"Interface Definition": {
"prefix": "intf",
"body": [
"interface ${1:Name} {",
" ${2:property}: ${3:type};",
" $0",
"}"
],
"description": "インターフェースを定義"
},
"Type Guard": {
"prefix": "guard",
"body": [
"function is${1:Type}(value: unknown): value is ${1:Type} {",
" return ${2:condition};",
"}$0"
],
"description": "型ガード関数を作成"
},
"Generic Function": {
"prefix": "gfn",
"body": [
"function ${1:name}<${2:T}>(${3:arg}: ${2:T}): ${4:${2:T}} {",
" $0",
"}"
],
"description": "ジェネリック関数を作成"
}
}
|
JavaScriptスニペット#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
{
"Promise Function": {
"prefix": "prom",
"body": [
"const ${1:name} = () => {",
" return new Promise((resolve, reject) => {",
" $0",
" });",
"};"
],
"description": "Promise関数を作成"
},
"Fetch API": {
"prefix": "fetch",
"body": [
"const response = await fetch('${1:url}', {",
" method: '${2|GET,POST,PUT,DELETE,PATCH|}',",
" headers: {",
" 'Content-Type': 'application/json',",
" },",
" ${3:body: JSON.stringify($4),}",
"});",
"const data = await response.json();$0"
],
"description": "Fetch APIリクエストを作成"
},
"Destructuring Assignment": {
"prefix": "dest",
"body": "const { ${1:prop} } = ${2:object};$0",
"description": "分割代入"
}
}
|
Reactスニペット(TSX)#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
{
"useState Hook": {
"scope": "typescriptreact,javascriptreact",
"prefix": "us",
"body": [
"const [${1:state}, set${1/(.*)/${1:/capitalize}/}] = useState<${2:string}>(${3:initialValue});$0"
],
"description": "useStateフックを挿入"
},
"useEffect Hook": {
"scope": "typescriptreact,javascriptreact",
"prefix": "ue",
"body": [
"useEffect(() => {",
" ${1:// effect}",
" ${2:return () => {",
" // cleanup",
" };}",
"}, [${3:dependencies}]);$0"
],
"description": "useEffectフックを挿入"
},
"Custom Hook": {
"scope": "typescriptreact,javascriptreact",
"prefix": "hook",
"body": [
"import { useState, useEffect } from 'react';",
"",
"export const use${1:Name} = (${2:params}) => {",
" const [${3:state}, set${3/(.*)/${1:/capitalize}/}] = useState(${4:null});",
"",
" useEffect(() => {",
" $0",
" }, []);",
"",
" return { ${3:state} };",
"};"
],
"description": "カスタムフックを作成"
}
}
|
Pythonスニペット#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
{
"Class Definition": {
"prefix": "class",
"body": [
"class ${1:ClassName}:",
" \"\"\"${2:Class description.}\"\"\"",
"",
" def __init__(self${3:, args}):",
" ${4:pass}$0"
],
"description": "クラスを定義"
},
"Dataclass": {
"prefix": "dataclass",
"body": [
"from dataclasses import dataclass",
"",
"@dataclass",
"class ${1:ClassName}:",
" \"\"\"${2:Class description.}\"\"\"",
" ${3:field}: ${4:str}$0"
],
"description": "データクラスを定義"
},
"Context Manager": {
"prefix": "with",
"body": [
"with ${1:open('${2:file}')} as ${3:f}:",
" $0"
],
"description": "withステートメントを挿入"
}
}
|
HTMLスニペット#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
{
"HTML5 Template": {
"prefix": "html5",
"body": [
"<!DOCTYPE html>",
"<html lang=\"${1:ja}\">",
"<head>",
" <meta charset=\"UTF-8\">",
" <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">",
" <title>${2:Document}</title>",
"</head>",
"<body>",
" $0",
"</body>",
"</html>"
],
"description": "HTML5テンプレートを挿入"
},
"Link Tag": {
"prefix": "link",
"body": "<link rel=\"${1|stylesheet,icon,preconnect,preload|}\" href=\"$2\">$0",
"description": "linkタグを挿入"
}
}
|
CSSスニペット#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
{
"Flexbox Container": {
"prefix": "flex",
"body": [
"display: flex;",
"justify-content: ${1|flex-start,flex-end,center,space-between,space-around,space-evenly|};",
"align-items: ${2|stretch,flex-start,flex-end,center,baseline|};$0"
],
"description": "Flexboxコンテナを設定"
},
"Grid Container": {
"prefix": "grid",
"body": [
"display: grid;",
"grid-template-columns: ${1:repeat(${2:3}, ${3:1fr})};",
"gap: ${4:1rem};$0"
],
"description": "Gridコンテナを設定"
},
"Media Query": {
"prefix": "mq",
"body": [
"@media (${1|min-width,max-width|}: ${2:768px}) {",
" $0",
"}"
],
"description": "メディアクエリを挿入"
}
}
|
VSCodeスニペットのキーボードショートカット設定#
よく使うスニペットにはキーボードショートカットを割り当てることができます。
keybindings.jsonでの設定#
Ctrl+K Ctrl+Sでキーボードショートカット設定を開き、右上のアイコンからkeybindings.jsonを開きます。
1
2
3
4
5
6
7
8
|
{
"key": "ctrl+shift+l",
"command": "editor.action.insertSnippet",
"when": "editorTextFocus",
"args": {
"snippet": "console.log('${TM_SELECTED_TEXT}$1')$0"
}
}
|
選択したテキストをconsole.log()で囲むショートカットの例です。
既存スニペットへのショートカット割り当て#
定義済みのスニペットを参照してショートカットを割り当てることもできます。
1
2
3
4
5
6
7
8
9
|
{
"key": "ctrl+shift+c",
"command": "editor.action.insertSnippet",
"when": "editorTextFocus && editorLangId == typescript",
"args": {
"langId": "typescript",
"name": "Class Definition"
}
}
|
VSCodeスニペットのファイルテンプレート機能#
isFileTemplateプロパティを使用すると、新規ファイル作成時のテンプレートとしてスニペットを利用できます。
ファイルテンプレートスニペットの定義#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
{
"React Component File": {
"scope": "typescriptreact",
"prefix": "rcfile",
"isFileTemplate": true,
"body": [
"import type { FC } from 'react';",
"import styles from './${TM_FILENAME_BASE}.module.css';",
"",
"interface ${TM_FILENAME_BASE}Props {",
" $1",
"}",
"",
"export const ${TM_FILENAME_BASE}: FC<${TM_FILENAME_BASE}Props> = ({ $2 }) => {",
" return (",
" <div className={styles.container}>",
" $0",
" </div>",
" );",
"};",
""
],
"description": "Reactコンポーネントファイルテンプレート"
}
}
|
ファイルテンプレートの使用方法#
- 新規ファイルを作成します
- コマンドパレットで「Snippets: Fill File with Snippet」を実行します
- ファイルテンプレートとして定義されたスニペットがドロップダウンに表示されます
- テンプレートを選択すると、ファイル全体にスニペットが展開されます
VSCodeスニペットの実践的な活用例#
実際の開発シーンで役立つスニペット例を紹介します。
コードドキュメント生成#
JSDocコメントを生成するスニペットです。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
{
"JSDoc Function": {
"prefix": "jsdoc",
"body": [
"/**",
" * ${1:description}",
" * @param {${2:type}} ${3:param} - ${4:param description}",
" * @returns {${5:type}} ${6:return description}",
" */",
"$0"
],
"description": "JSDocコメントを挿入"
}
}
|
テスト関連スニペット#
Jestテスト用のスニペットです。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
{
"Jest Describe Block": {
"prefix": "desc",
"body": [
"describe('${1:description}', () => {",
" $0",
"});"
],
"description": "Jestのdescribeブロック"
},
"Jest Test Case": {
"prefix": "it",
"body": [
"it('${1:should}', ${2:async }() => {",
" ${3:// Arrange}",
" ",
" ${4:// Act}",
" ",
" ${5:// Assert}",
" expect($6).${7:toBe}($8);$0",
"});"
],
"description": "Jestのテストケース"
},
"Jest Mock": {
"prefix": "mock",
"body": [
"jest.mock('${1:module}', () => ({",
" ${2:method}: jest.fn()${3:.mockReturnValue($4)},",
"}));$0"
],
"description": "Jestのモック"
}
}
|
API関連スニペット#
Express.jsルーティング用のスニペットです。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
{
"Express Route Handler": {
"prefix": "route",
"body": [
"router.${1|get,post,put,delete,patch|}('${2:/path}', async (req: Request, res: Response) => {",
" try {",
" $0",
" res.json({ ${3:data} });",
" } catch (error) {",
" res.status(500).json({ error: 'Internal Server Error' });",
" }",
"});"
],
"description": "Expressルートハンドラー"
}
}
|
ログ出力スニペット#
デバッグ用のログ出力スニペットです。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
{
"Debug Log with Context": {
"prefix": "dlog",
"body": [
"console.log('[${TM_FILENAME_BASE}:${TM_LINE_NUMBER}]', '${1:message}', ${2:value});$0"
],
"description": "ファイル名と行番号付きログ"
},
"Debug Object": {
"prefix": "dobj",
"body": [
"console.log('${1:${TM_SELECTED_TEXT:object}}:', JSON.stringify(${1:${TM_SELECTED_TEXT:object}}, null, 2));$0"
],
"description": "オブジェクトをJSON形式でログ出力"
}
}
|
VSCodeスニペットのトラブルシューティング#
スニペットが正しく動作しない場合の対処法を解説します。
スニペットが表示されない場合#
以下の点を確認してください。
- JSONの構文エラー: スニペットファイルの構文が正しいか確認します
- 言語スコープ: グローバルスニペットで
scopeが正しく設定されているか確認します
- 設定の確認:
editor.snippetSuggestionsがnoneになっていないか確認します
1
2
3
|
{
"editor.snippetSuggestions": "inline"
}
|
- IntelliSenseからの非表示: 「Insert Snippet」コマンドで「Hide from IntelliSense」が設定されていないか確認します
Tab補完が効かない場合#
editor.tabCompletionを確認します。
1
2
3
|
{
"editor.tabCompletion": "on"
}
|
特殊文字のエスケープ#
スニペット内で$、}、\を文字として使用する場合はエスケープが必要です。
1
2
3
4
5
6
7
|
{
"PHP Variable": {
"prefix": "phpvar",
"body": "\\$${1:variable} = ${2:value};$0",
"description": "PHP変数を定義"
}
}
|
出力結果: $variable = value;
JSON内の特殊文字#
JSON文字列内では以下のエスケープが必要です。
| 文字 |
エスケープ |
" |
\" |
\ |
\\ |
| タブ |
\t |
| 改行 |
\n |
VSCodeスニペット設定のベストプラクティス#
効果的なスニペット運用のためのポイントをまとめます。
命名規則の統一#
- プレフィックスは短く覚えやすいものにします
- 類似機能のスニペットには共通のプレフィックスを付けます(例:
cl=console.log, cw=console.warn)
- 説明文は日本語でわかりやすく記述します
スニペットの粒度#
- 頻繁に使用するパターンのみスニペット化します
- あまりに長いスニペットは分割を検討します
- ファイルテンプレートとコード断片は用途を分けて管理します
チーム開発での運用#
- プロジェクトスニペットはコーディング規約と連携させます
- スニペットファイルにはコメントで用途を記載します
- 定期的にスニペットを見直し、不要なものは削除します
1
2
3
4
5
6
7
8
9
10
11
|
// プロジェクトスニペットファイルのコメント例
{
// =====================================
// API関連スニペット
// =====================================
"API Handler": {
"prefix": "api",
"body": ["..."],
"description": "APIハンドラーテンプレート"
}
}
|
まとめ#
VSCodeスニペット機能を活用することで、定型的なコード入力を大幅に効率化できます。本記事で解説した内容をまとめます。
- 基本設定: ユーザースニペットはコマンドパレットから言語別またはグローバルで作成できます
- プロジェクト共有:
.vscodeフォルダにスニペットファイルを配置することで、チーム全体で共有できます
- タブストップ・プレースホルダー:
$1、${1:default}で効率的な入力フローを実現できます
- 選択肢:
${1|a,b,c|}でドロップダウン選択を提供できます
- 変数・トランスフォーム: ファイル名や日時を動的に挿入し、正規表現で加工できます
- キーボードショートカット: よく使うスニペットにはショートカットを割り当てると便利です
スニペットは一度作成すれば繰り返し活用でき、開発効率と品質の両方を向上させます。本記事のサンプルを参考に、自分のプロジェクトに合ったスニペットを作成してみてください。
参考リンク#