(こちらのページを自分流に翻訳したものです。2018-12-09)
ここでは初めての方を対象に、Visual Studio Code extension (“Hello World”) を作る過程をお見せします。また、VS Code の拡張性の基本的なコンセプトについてもご説明します。
これから作る extension は、”Hello World” というテキトーな文字列を表示するコマンドを VS Code に追加するものです。後半では、VS Code editor から選択中のテキストに関する情報を取得してみます。
まずは Node.js をインストールして、$PATH
を通しておきます。Node.js には extension generator をインストールするための npm (Node.js Package Manager) が含まれています。
とりあえず何か機能を追加したいのなら、コマンドを追加してみましょう。コマンドに callback 関数を関連付ければ、Command Palette や key binding から実行する事ができます。
extension を作るための Yeoman generator があるので、これを使います。Yeoman と Yeoman VS Code Extension generator をインストールし、真新しい extension への一歩を踏み出しましょう。
npm install -g yo generator-code
yo code
Hello World extension を作るには、TypeScript extension または JavaScript extension を選びます。この example では、TypeScript extension を使っています。
File
> Open Folder
を選択し、生成されたフォルダを選択します。F5
キーを押すか、Debug
アイコンをクリックして Start
を押します。Extension Development Host
) で起動します。このインスタンスは、生成された extension を認識しています。Ctrl+Shift+P
を押して Hello World
というコマンドを実行します。実行すると、extension フォルダは以下のようになります。
.
├── .gitignore
├── .vscode // VS Code integration
│ ├── launch.json
│ ├── settings.json
│ └── tasks.json
├── .vscodeignore // files ignored when publishing extension
├── README.md
├── src
│ └── extension.ts // the source of the extension entry point
├── test // test folder
│ ├── extension.test.ts // extension.test.js, in case of JavaScript extension
│ └── index.ts // index.js, in case of JavaScript extension
├── node_modules
│ ├── vscode // include vscode type definition file for extension development
│ └── typescript // compiler for typescript (TypeScript only)
├── out // compilation output (TypeScript only)
│ ├── extension.js // the extension entry point
│ ├── extension.js.map
│ └── test
│ ├── extension.test.js
│ ├── extension.test.js.map
│ ├── index.js
│ └── index.js.map
├── package.json // extension's manifest
├── tsconfig.json // jsconfig.json, in case of JavaScript extension
└── vsc-extension-quickstart.md // extension development quick start
では、これらのファイルが何のためにあるのか、見ていきましょう。
package.json
package.json
が必要です。contributes
セクションの内容に反応するようになります。package.json
extension manifest reference をご覧ください。package.json
contribution points にも情報があります。EXAMPLE TYPESCRIPT EXTENSION MANIFEST
{
"name": "myFirstExtension",
"description": "",
"version": "0.0.1",
"publisher": "",
"engines": {
"vscode": "^1.5.0"
},
"categories": [
"Other"
],
"activationEvents": [
"onCommand:extension.sayHello"
],
"main": "./out/extension",
"contributes": {
"commands": [{
"command": "extension.sayHello",
"title": "Hello World"
}]
},
"scripts": {
"vscode:prepublish": "tsc -p ./",
"compile": "tsc -watch -p ./",
"postinstall": "node ./node_modules/vscode/bin/install",
"test": "node ./node_modules/vscode/bin/test"
},
"devDependencies": {
"typescript": "^2.0.3",
"vscode": "^1.5.0",
"mocha": "^2.3.3",
"@types/node": "^6.0.40",
"@types/mocha": "^2.2.32"
}
}
注: JavaScript extension の場合、コンパイルする必要がないので、
scripts
フィールドは不要です。
上の package.json
は、この extension について以下のことを言っています。
"extension.sayHello"
コマンドを実行する "Hello world"
ラベルを、Command Palette (Ctrl+Shift+P
) に追加します (contributes)。"extension.sayHello"
コマンドが実行された時に、自身がロードされるようにします (activationEvents)。"./out/extension.js"
に、main JavaScript code があります。注: VS Code は、起動時に extension のコードをロードしません。extension がどんな条件でロードされるかは、
activationEvents
プロパティで設定されます。
生成されたコードは、extension.ts
の中です (JaveScript extension の場合は extension.js
の中)。
// The module 'vscode' contains the VS Code extensibility API
// Import the module and reference it with the alias vscode in your code below
import * as vscode from 'vscode';
// this method is called when your extension is activated
// your extension is activated the very first time the command is executed
export function activate(context: vscode.ExtensionContext) {
// Use the console to output diagnostic information (console.log) and errors (console.error)
// This line of code will only be executed once when your extension is activated
console.log('Congratulations, your extension "my-first-extension" is now active!');
// The command has been defined in the package.json file
// Now provide the implementation of the command with registerCommand
// The commandId parameter must match the command field in package.json
let disposable = vscode.commands.registerCommand('extension.sayHello', () => {
// The code you place here will be executed every time your command is executed
// Display a message box to the user
vscode.window.showInformationMessage('Hello World!');
});
context.subscriptions.push(disposable);
}
activate()
関数を export します。この関数は、package.json
の中のいずれかの activationEvents
が発生した時に実行されます。ただし VS Code はこの関数を 一度しか実行しません 。deactivate()
関数を export する事ができます。これは後片付けをするための関数で、VS Code の終了時にも呼び出されます。vscode
API を import し、コマンドを登録し、関数を "extension.sayHello"
コマンドに関連付けます。コマンドは “Hello world” message を VS Code に表示するよう実装されています。注:
package.json
のcontributes
セクションは、Command Palette にエントリを追加します。extension.ts/.js に書かれたコードが、"extension.sayHello"
の実装になります。
注: TypeScript extension の場合、
out/extension.js
が生成されます。VS Code はそれをロードして実行します。
.vscode/launch.json
は、VS Code を Extension Development mode で起動するようにできます。さらに、.vscode/tasks.json
で定義されているタスクの中から preLaunchTask
を指定して、TypeScript compiler を実行する事もできます。.vscode/settings.json
は、デフォルトで out
フォルダを除外します。これを変更することで、どのファイルタイプを無視するか選ぶことができます。.gitignore
- Git 用の .gitignore です。.vscodeignore
- Extension を publish する時に、含めたくないファイルを指定をします。README.md
- この extension についての説明を書きます。vsc-extension-quickstart.md
- 開発者向けの Quick Start guide です。test/extension.test.ts
- この extension のための unit test を書きます。VS Code API に対して (訳者注: 原文は “against the VS Code API”) テストを走らせます (Testing Your Extension をご覧ください)。ここまで、extension に含まれるファイルについて見てきました。ここからは、extension をアクティベートする方法について見ていきましょう。
package.json
を読みにいきます。Ctrl+Shift+P
を押すと、以下のことが起こります。"Hello World"
コマンドがあるはずです。package.json
で定義したからです。"Hello World"
コマンドを選択すると…"extension.sayHello"
が実行されます。具体的には以下のことが起こります。
"onCommand:extension.sayHello"
という activation event が生成されます。activationEvents
に定義している、すべての extension がアクティベートされます (訳者注: 以下は各 extension につき一度だけ実行される)。
./out/extension.js
が JavaScript VM にロードされます。activate()
関数を見つけて、それを実行します。"extension.sayHello"
コマンドが登録され、コマンドに対する実装 (そのコマンドが何をするのか) が関連付けられます。"extension.sayHello"
) の実装 (であるところの関数) が実行されます。コマンドの中にブレークポイントをセットして、Extension Development VS Code instance で "Hello world"
を実行してみましょう。
注: TypeScript extensions の場合、VS Code は
out/extension.js
をロードして実行しますが、デバッグはオリジナルの TypeScript code 上で行うことが可能です。これは VS Code がout/extension.js.map
を生成し、デバッグ時に参照しているためです。
Tip: コード内で、Debug Console に log を出すことができます。
Extension の開発環境について詳しく知りたければ、こちら をご覧ください。
extension.ts
(または extension.js
) を変更してみましょう。extension.sayHello
を変更して、エディタ上で選択中のテキストの文字数を表示するようにしてみましょう。
let disposable = vscode.commands.registerCommand('extension.sayHello', () => {
// The code you place here will be executed every time your command is executed
let editor = vscode.window.activeTextEditor;
if (!editor) {
return; // No open text editor
}
let selection = editor.selection;
let text = editor.document.getText(selection);
// Display a message box to the user
vscode.window.showInformationMessage('Selected characters: ' + text.length);
});
Tip: Extension のソースコードを変更したら、Extension Development Host インスタンスを再起動します。再起動するには、Extension Development Host インスタンスで
Ctrl+R
(macOS:Cmd+R
) を押すか、プライマリの VS Code インスタンスの上の方にある Restart ボタンを押します。
ファイルを作成し (File > New File)、テキストを入力して選択してください。Hello World コマンドを実行すると、選択中のテキストの文字数が出力されるはずです。
ここまでで作った extension は、Extension Development instance という特殊なインスタンスでのみ実行可能です。これを VS Code のすべてのインスタンスで実行可能にするには、ローカルの extensions フォルダの中に新しくフォルダを作って、そこへコピーします。
%USERPROFILE%\.vscode\extensions
$HOME/.vscode/extensions
Extension を公開する方法については、こちらをご覧ください。
これで、ごく簡単な extension は作れるようになりました。もう少し凝った extension の例として、Word Count Example では、特定の言語のみを対象とする方法や、エディタの内容が変更された時にイベントに反応する方法について、説明しています。
Extension API に関する一般的な説明については、以下のページをご覧ください。