Visual Studio CodeでCode Syntax Highlight Extentionを作る
動機
現在新卒研修期間中です。
今日は休憩時間が多かったので、VSCodeのExtentionを作りたいと思って、簡単に作って、公開しました。一切、トークン化など知識がなかったので、無理かもと思っていましたが、正規表現さえ上達すれば簡単に作れました。
もともとの動機としては、Tigの設定ファイルである.tigrc
のSyntax Highlightがなく、ファイルがプレーンテキストのように見にくい単調なファイルだったことです。
例えば、以下のようなものでした。これだと、文法間違い、タイポ、可読性など、とても開発する気にはなれません。
これをきっかけに、よりTigの設定ファイルを書きやすくして、また世界に貢献したいと思って本Extentionを作り、その一連のプロセスを記事にしました。
目次
本記事の目次は以下の通りです。
開発開始
VSCodeはジェネレーターがあるので、簡単にExtentionの開発の着手に取り掛かれます。
それでは、やっていきましょう。
1. 雛形を用意する
npm
を使って、拡張機能のジェネレーターを使って雛形を最初に用意します。
以下のようにインストールしてください。
$ npm install -g yo generator-code
そして、インストールしたyo
パッケージを実行します。
$ yo code
すると、いくつか質問されるので、答えます。
- What type of extension do you want to create?: Language Support
- What's the name of your extension?: Tig Syntax Highlight
- What's the identifier of your extension?: keke-tig-syntax-highlight
- What's the description of your extension?: Language Support for Tig
するとディレクトリが作成されるので、git
など必要なことをしてください。
$ cd keke-tig-syntax-highlight $ ... $ git init $ ...
ディレクトリ構成は以下のようになっているはずです。
. ├── CHANGELOG.md ├── README.md ├── language-configuration.json ├── package.json ├── syntaxes/ └── hoge-0.1.0.vsix
ここで主要なファイルの説明をします。
syntaxes/tig.tmLanguage.json
: トークン化のための文法を定義するファイルlanguage-configuration.json
: 括弧やコメントなどを定義するためのファイル
1.1 syntaxes/tig.tmLanguage.json
: トークン化のための文法を定義するファイル
TextMate Grammerで記述していきます。本記事は文法に対する記事ではないので、割愛させていただきます。
1.2 language-configuration.json
: 括弧やコメントなどを定義するためのファイル
これより、知っておく必要のあるフィールドを解説します。
1.2.1 .categories[]
: Pluginのカテゴリ
どのようなカテゴリであるかを配列で指定します。
"categories": [ "Programming Languages" ],
他にもSnippets
なども指定することができます。
1.2.2 .contributes
: 機能の詳細
このPluginの機能の詳細を書きます。
大きく2つのフィールドがあって.languages
, .grammars
です。
.grammars
では、文法を定義するもので
"grammars": [{ "language": "tig", "scopeName": "tig", "path": "./syntaxes/tig.tmLanguage.json" }]
のように
grammars.language
: なんの言語なのかgrammers.scopeName
: スコープを定義path
: 詳細が書かれているjsonへのpathを指定
と書きます。
2. デバッグ
以下の手順でデバッグしていきます。
language-configuration.json
に間違えがないことを確認するF5
を押して新しいウィンドウを開く- 新しいウィンドウで
.tigrc
拡張子のファイルを作る ./syntaxes/tig.tmLanguage.json
などを変更してリロードする
この流れで、デバッグして開発していきます。
ウィンドウが開いて、Syntax Highlightしたい拡張子(今回は.tigrc
)を作成して遊んでみます。
まだ開発途中ですが、コメントやbind
などの関数はHighlightされているので、まずまずだなと思います。
公開する
Package.jsonを確認する
初期生成ファイルだと、git情報がないので例えば、Readme.mdに画像を使っている場合など、パスが分からず、手順通り進めても画像が表示されません。
"repository": { "type": "git", "url": "https://github.com/KeisukeYamashita/hogehoge.git" },
リポジドリに置いてある画像を使う場合は、以下のようにフィールドを付け足して、リポジドリをPublicにする必要があります。
Publishする
まず、CLIツールを使っていくので以下のパッケージをインストールします。
npm install -g vsce
VSCode Marketplaceで公開することができます。
MicrosoftアカウントでAzure DevOpsにログインします。
そしてPrivate Access Tokenを取得します。
取得したら、以下のコマンドでパッケージのAuthorであるPublisherを作成します。
$ vsce create-publisher KeisukeYamashita
ここで、EmailとPrivate Access Tokenが聞かれるので、入力します。作成することができたら、次はPublishします。
最初にPublishするときは以下のコマンドを使います。
$ vsce publish
ここで、Readmeに、最初に生成される以下の文が入っていると、「Readmeを変更して」とエラーが出ます。
この1行以外を全て変えたとしてます、エラーになるのでご留意ください。
アップロードできると、Extentionの説明ページのURLが出力されるので確認することができます。
デプロイ後のアップデート
仮にアップデートをしたら、そのバージョン名または、minorやmajorなどと指定してアップデートします。例えば、
vsce publish minor
や
vsce publish 0.3.2
のようにします。
まとめ
VSCodeは最も世界で使われているIDEなので、tigの設定ファイル程度のExtentionであっても、
(VSCodeユーザー数) × (Tigユーザー数) ≒ ( 本Extentionのユーザー数)
になる可能性があると、心が踊ります。ここで≒としたのは、競合Extentionの出現や、本Extentionがユーザーが使いたいシーンにはまらないなど機能不足、または機能過多な部分がある可能性があるからです。
これからSnippet機能を追加して、より使いやすい機能を搭載していくつもりです。
何より、このExtentionの1番ユーザーは自分であり、VSCodeを使い込んで、Tigも使い込んで、ユーザーの痛みを知り、よりよいExtentionを提供したいです。
そして、Goalである開発速度や体験のアップデートを成し遂げられれば、開発難易度に依らずやりがいのあることだと誇れるのではないでしょうか。
幸せは難易度とは限らず。
最後までありがとうございました。