「VSCodeにこんな機能があったらいいのに…」
日々のコーディング作業で、そんな風に思ったことはありませんか?
実は、VSCodeの拡張機能(エクステンション)は、思っているよりもずっと簡単に作成できます。基本的なJavaScript/TypeScriptの知識があれば、誰でも自分専用の拡張機能を開発できるんです。
この記事では、VSCodeの拡張機能を初めて作る方に向けて、開発環境のセットアップから実際の公開まで、すべての手順を詳しく解説します。
VSCode拡張機能とは?

VSCodeの拡張機能は、エディタに新しい機能を追加するプラグインです。
現在、Marketplaceには数万の拡張機能が公開されており、言語サポート、テーマ、デバッガー、スニペットなど、多様な機能が提供されています。
拡張機能でできること:
- コマンドパレットに新しいコマンドを追加
- エディタの右クリックメニューをカスタマイズ
- サイドバーに独自のビューを追加
- 特定の言語のシンタックスハイライトを追加
- デバッグ機能の統合
- テキストの自動整形や変換
これらの機能は、VSCode APIを使用することで実現できます。
開発に必要なもの
拡張機能の開発を始める前に、以下のツールをインストールする必要があります。
必須ツール:
- Node.js(LTS版を推奨)
- 公式サイトからダウンロード:https://nodejs.org/
- バージョン確認:
node -v
- Visual Studio Code
- 当然ですが、VSCode本体が必要です
- Git
- バージョン管理に使用
- インストール確認:
git --version
開発支援ツール:
- Yeoman(yo):プロジェクトのひな形生成ツール
- generator-code:VSCode拡張機能専用のジェネレーター
- vsce:拡張機能のパッケージング・公開ツール
これらは後ほどインストールします。
開発環境のセットアップ
まず、必要なツールをnpmでインストールします。
インストールコマンド:
npm install -g yo generator-code vsce
各ツールの役割:
yo:プロジェクトの雛形を生成generator-code:VSCode拡張機能のテンプレート提供vsce:パッケージング(.vsixファイル作成)と公開
インストールが完了したら、バージョンを確認しましょう:
yo --version
vsce --version
プロジェクトの作成
Yeomanを使って、拡張機能のプロジェクトを生成します。
実行コマンド:
yo code
すると、対話形式で質問されるので、以下のように答えます:
質問と回答例:
? What type of extension do you want to create?
→ New Extension (TypeScript)
? What's the name of your extension?
→ my-first-extension
? What's the identifier of your extension?
→ my-first-extension
? What's the description of your extension?
→ My first VS Code extension
? Initialize a git repository?
→ Yes
? Which bundler to use?
→ unbundled(後でwebpackも可能)
? Which package manager to use?
→ npm
? Do you want to open the new folder with Visual Studio Code?
→ Open with `code`
拡張機能のタイプ:
- New Extension (TypeScript):汎用的な拡張機能(推奨)
- New Color Theme:カラーテーマ
- New Language Support:言語サポート
- New Code Snippets:スニペット集
- New Extension Pack:複数の拡張機能をまとめたパック
初めての開発では、TypeScriptを選択することをおすすめします。
プロジェクト構造の理解
生成されたプロジェクトには、以下のようなファイルが含まれています。
my-first-extension/
├── .vscode/
│ ├── launch.json # デバッグ設定
│ ├── settings.json # プロジェクト設定
│ └── tasks.json # ビルドタスク設定
├── src/
│ ├── extension.ts # メイン処理(ここを編集)
│ └── test/ # テストコード
├── package.json # 拡張機能の設定ファイル
├── tsconfig.json # TypeScript設定
├── README.md # 説明書
└── CHANGELOG.md # 変更履歴
重要なファイル:
- src/extension.ts:拡張機能の本体
- package.json:拡張機能のメタデータと設定
extension.ts の編集
src/extension.tsが拡張機能のメインコードです。
基本構造:
import * as vscode from 'vscode';
// 拡張機能が有効化されたときに実行
export function activate(context: vscode.ExtensionContext) {
console.log('拡張機能がアクティブになりました');
// コマンドを登録
let disposable = vscode.commands.registerCommand(
'my-first-extension.helloWorld',
() => {
vscode.window.showInformationMessage(
'Hello World from my-first-extension!'
);
}
);
context.subscriptions.push(disposable);
}
// 拡張機能が無効化されたときに実行
export function deactivate() {
console.log('拡張機能が無効化されました');
}
主要な関数:
activate():拡張機能が起動するときに実行されるdeactivate():拡張機能が無効化されるときに実行される
よく使うVSCode API:
// メッセージ表示
vscode.window.showInformationMessage('情報メッセージ');
vscode.window.showWarningMessage('警告メッセージ');
vscode.window.showErrorMessage('エラーメッセージ');
// 現在のエディタを取得
const editor = vscode.window.activeTextEditor;
// テキストを取得
const text = editor.document.getText();
// 選択範囲を取得
const selection = editor.selection;
const selectedText = editor.document.getText(selection);
// テキストを挿入
editor.edit(editBuilder => {
editBuilder.insert(editor.selection.active, '挿入するテキスト');
});
package.json の設定
package.jsonは拡張機能の設定ファイルです。
重要な設定項目:
{
"name": "my-first-extension",
"displayName": "My First Extension",
"description": "初めての拡張機能",
"version": "0.0.1",
"publisher": "your-publisher-name",
"engines": {
"vscode": "^1.85.0"
},
"categories": [
"Other"
],
"activationEvents": [
"onCommand:my-first-extension.helloWorld"
],
"main": "./out/extension.js",
"contributes": {
"commands": [
{
"command": "my-first-extension.helloWorld",
"title": "Hello World"
}
]
}
}
各フィールドの意味:
name:拡張機能の識別名(英数字とハイフンのみ)displayName:Marketplaceで表示される名前publisher:公開者名(後で設定可能)engines.vscode:対応するVSCodeのバージョンactivationEvents:拡張機能が起動するタイミングcontributes:VSCodeに提供する機能の定義
activationEvents の設定
拡張機能がいつ起動するかを定義します。
主なアクティベーションイベント:
"activationEvents": [
// コマンド実行時
"onCommand:extension.commandName",
// 特定の言語のファイルを開いたとき
"onLanguage:javascript",
"onLanguage:python",
// VSCode起動時(使いすぎ注意)
"*",
// 特定のビューが開かれたとき
"onView:nodeDependencies"
]
基本的には必要なタイミングだけ起動するように設定しましょう。"*"を使うとVSCode起動時に常に起動するため、パフォーマンスに影響します。
contributes の設定

VSCodeに機能を提供する方法を定義します。
コマンドの追加:
"contributes": {
"commands": [
{
"command": "extension.myCommand",
"title": "My Command",
"category": "My Extension"
}
]
}
右クリックメニューへの追加:
"contributes": {
"menus": {
"editor/context": [
{
"when": "editorFocus",
"command": "extension.myCommand",
"group": "myGroup@1"
}
]
}
}
キーボードショートカットの設定:
"contributes": {
"keybindings": [
{
"command": "extension.myCommand",
"key": "ctrl+shift+a",
"mac": "cmd+shift+a",
"when": "editorTextFocus"
}
]
}
デバッグとテスト
拡張機能の動作確認は、VSCodeのデバッガーで行います。
デバッグ実行の手順:
- VSCodeでプロジェクトを開く
- F5キーを押す(または「実行」→「デバッグの開始」)
- 新しいVSCodeウィンドウが開く(Extension Development Host)
- 新しいウィンドウでコマンドパレット(Ctrl + Shift + P)を開く
- 作成したコマンドを実行
デバッグウィンドウの操作:
- 元のウィンドウ:デバッガーとして機能(ブレークポイント設定可能)
- 新しいウィンドウ:拡張機能がロードされた状態
コードを変更したら、デバッグウィンドウで「Developer: Reload Window」を実行すると変更が反映されます。
実践例:選択テキストを大文字に変換
実際に動作する拡張機能を作ってみましょう。
extension.ts:
import * as vscode from 'vscode';
export function activate(context: vscode.ExtensionContext) {
let disposable = vscode.commands.registerCommand(
'my-extension.toUpperCase',
() => {
const editor = vscode.window.activeTextEditor;
if (!editor) {
vscode.window.showErrorMessage('エディタが開かれていません');
return;
}
const selection = editor.selection;
const text = editor.document.getText(selection);
if (text.length === 0) {
vscode.window.showWarningMessage('テキストを選択してください');
return;
}
const upperText = text.toUpperCase();
editor.edit(editBuilder => {
editBuilder.replace(selection, upperText);
});
vscode.window.showInformationMessage('大文字に変換しました');
}
);
context.subscriptions.push(disposable);
}
export function deactivate() {}
package.json(contributesセクション):
"contributes": {
"commands": [
{
"command": "my-extension.toUpperCase",
"title": "選択テキストを大文字に変換"
}
],
"menus": {
"editor/context": [
{
"command": "my-extension.toUpperCase",
"group": "1_modification"
}
]
}
}
これで、テキストを選択して右クリックメニューから実行できる拡張機能が完成です。
パッケージング(.vsixファイルの作成)
開発した拡張機能をインストール可能な形式にパッケージングします。
パッケージング手順:
- プロジェクトのルートディレクトリで実行:
vsce package
your-extension-0.0.1.vsixファイルが生成される
インストール方法:
方法1:VSCodeから直接インストール
- VSCodeの拡張機能ビューを開く
- 右上の「…」メニューをクリック
- 「VSIXからのインストール…」を選択
- 生成した.vsixファイルを選択
方法2:コマンドラインからインストール
code --install-extension your-extension-0.0.1.vsix
README.md とアイコンの設定
拡張機能をより魅力的にするため、説明書とアイコンを設定しましょう。
README.md の書き方:
# My Extension
選択したテキストを大文字に変換する拡張機能です。
## 機能
- 選択テキストを大文字に変換
## 使い方
1. テキストを選択
2. 右クリックメニューから「選択テキストを大文字に変換」を選択
## ショートカットキー
- Windows/Linux: `Ctrl + Shift + U`
- Mac: `Cmd + Shift + U`
## 必要要件
- VS Code 1.85.0以上
## リリースノート
### 1.0.0
初回リリース
アイコンの追加:
- 128×128ピクセルのPNG画像を用意
- プロジェクトルートに配置(例:
icon.png) - package.jsonに追加:
{
"icon": "icon.png"
}
Marketplaceへの公開
作成した拡張機能を世界中の開発者と共有できます。
公開の手順:
1. Azure DevOpsアカウントの作成
https://dev.azure.com にアクセスしてアカウントを作成
2. Personal Access Tokenの取得
- Azure DevOpsにログイン
- 右上のユーザーアイコン → 「Personal access tokens」
- 「New Token」をクリック
- 名前を入力し、Scopeで「Marketplace」→「Manage」を選択
- トークンをコピー(後で使えないので保存しておく)
3. Publisherの作成
https://marketplace.visualstudio.com/manage にアクセスし、新しいPublisherを作成
4. vsceでログイン
vsce login <publisher-name>
Personal Access Tokenを貼り付け
5. 公開
vsce publish
これで、VS Code Marketplaceに公開されます!
トラブルシューティング
コンパイルエラーが出る
原因:
TypeScriptの設定やNode.jsのバージョンの問題
対処法:
npm install
npm run compile
デバッグウィンドウでコマンドが見つからない
原因:
package.jsonの設定ミス
対処法:
contributes.commandsでコマンドが定義されているか確認activationEventsが正しく設定されているか確認
パッケージング時にエラー
原因:
README.mdやLICENSEファイルの不足
対処法:
# 警告を無視して強制実行
vsce package --allow-missing-repository
よくある質問
Q1:JavaScriptでも作れますか?
はい、プロジェクト作成時に「New Extension (JavaScript)」を選択すれば可能です。ただし、TypeScriptの方が型チェックがあり安全です。
Q2:公開せずにチーム内で共有できますか?
はい、.vsixファイルを配布すれば、Marketplace公開なしで使用できます。
Q3:既存の拡張機能を改造できますか?
多くの拡張機能はGitHubでオープンソースとして公開されています。フォークして改造することも可能です。
Q4:商用利用は可能ですか?
はい、VSCode拡張機能は商用利用可能です。ただし、使用するライブラリのライセンスには注意してください。
まとめ
VSCodeの拡張機能開発は、思ったよりも簡単に始められます。
開発の流れ:
- Node.js、Yeoman、generator-codeをインストール
yo codeでプロジェクト生成src/extension.tsでロジックを実装package.jsonで機能を定義- F5でデバッグ実行
vsce packageでパッケージング- 必要に応じてMarketplaceに公開
次のステップ:
- VSCode APIドキュメントを読む:https://code.visualstudio.com/api
- 既存の拡張機能のソースコードを読む
- 自分の作業を効率化する拡張機能を考える
毎日使うエディタだからこそ、自分専用の機能を追加してみましょう。小さな改善が、日々の開発体験を大きく向上させますよ。


コメント