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ループを挿入"
  }
}

このスニペットでは以下の動作が行われます。

  1. forまたはfor-constと入力してスニペットを呼び出します
  2. 最初に${1:array}の位置にカーソルが移動し、arrayがデフォルト値として選択されます
  3. Tabキーを押すと${2:element}に移動します
  4. 再度Tabキーを押すと$0(最終カーソル位置)に移動してスニペットモードが終了します

ユーザースニペットの設定方法

VSCodeでユーザースニペットを設定する方法を解説します。

スニペットファイルの作成手順

  1. コマンドパレット(Ctrl+Shift+P)を開きます
  2. 「Snippets: Configure Snippets」または「スニペット: スニペットの構成」と入力して選択します
  3. 以下のオプションから選択します
    • 言語名(例: JavaScript): 特定言語専用のスニペットファイルを作成
    • New Global Snippets file: 全言語共通のグローバルスニペットファイルを作成

言語別スニペットファイルの保存場所

ユーザースニペットは以下の場所に保存されます。

OS パス
Windows %APPDATA%\Code\User\snippets\
macOS ~/Library/Application Support/Code/User/snippets/
Linux ~/.config/Code/User/snippets/

言語別スニペットファイルはjavascript.jsontypescript.jsonのように言語識別子で命名されます。グローバルスニペットファイルは.code-snippets拡張子で保存されます。

プロジェクトスニペットの設定方法

チーム開発では、プロジェクト固有のスニペットを共有することで、コーディング規約の統一や開発効率の向上が期待できます。

プロジェクトスニペットの作成

  1. コマンドパレットで「Snippets: Configure Snippets」を選択します
  2. 「New Snippets file for ‘プロジェクト名’…」を選択します
  3. ファイル名を入力します(例: project.code-snippets
  4. .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メソッドを選択して挿入"
  }
}

このスニペットを展開すると、logwarnerrorinfodebugの選択肢がドロップダウンで表示されます。

実践的な選択肢の例

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コンポーネントファイルテンプレート"
  }
}

ファイルテンプレートの使用方法

  1. 新規ファイルを作成します
  2. コマンドパレットで「Snippets: Fill File with Snippet」を実行します
  3. ファイルテンプレートとして定義されたスニペットがドロップダウンに表示されます
  4. テンプレートを選択すると、ファイル全体にスニペットが展開されます

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スニペットのトラブルシューティング

スニペットが正しく動作しない場合の対処法を解説します。

スニペットが表示されない場合

以下の点を確認してください。

  1. JSONの構文エラー: スニペットファイルの構文が正しいか確認します
  2. 言語スコープ: グローバルスニペットでscopeが正しく設定されているか確認します
  3. 設定の確認: editor.snippetSuggestionsnoneになっていないか確認します
1
2
3
{
  "editor.snippetSuggestions": "inline"
}
  1. 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|}でドロップダウン選択を提供できます
  • 変数・トランスフォーム: ファイル名や日時を動的に挿入し、正規表現で加工できます
  • キーボードショートカット: よく使うスニペットにはショートカットを割り当てると便利です

スニペットは一度作成すれば繰り返し活用でき、開発効率と品質の両方を向上させます。本記事のサンプルを参考に、自分のプロジェクトに合ったスニペットを作成してみてください。

参考リンク