独自コマンドを実装する
[Ctrl+P], Align parenthesis
とか打つと括弧でalignしてほしいのです。
こういったコマンドを実装します。
コマンドを実現するコード自体は簡単で、vscode API を使いながら実装します。
テキスト置換系であればそれほど難しくありません。
公式ページの解説で大体わかります。
export function deleteTrailingWhiteSpaces () {
if (! vscode.window.activeTextEditor) {
vscode.window.showInformationMessage("Open files first!");
return;
}
let e = vscode.window.activeTextEditor;
let d = e.document;
let ss = e.selections;
let s = ss[0];
let c = s.active;
let st = s.start.line;
let ed = s.end.line;
let text = [];
for (let lnum = st; lnum <= ed; ++lnum) {
let line = d.lineAt(lnum).text.replace(/\s+$/, "");
text.push(line);
}
// Apply edit
e.edit(function (edit) {
for (let i = 0; i < text.length; ++i) {
let editStart = new vscode.Position(i + st, 0);
let editEnd = new vscode.Position(i + st, d.lineAt(i + st).text.length);
let rngEdit = new vscode.Range(editStart, editEnd);
edit.replace(rngEdit, text[i]);
}
});
return true;
}
このコードをTypeScriptで書いて、拡張機能に登録し、コンパイルして吐き出されたJSを指定すれば動作します。
Node.js と VSCode拡張機能ライブラリ
VSCodeの拡張機能はNode.jsが必要です。
このあたりを参考にWindows用のNodeをインストールします。
npmコマンドにパスが通っていることを確認しておいてください。
package.jsonのdependenciesにvscodeを入れておくと、npm install で拡張機能用のライブラリが入ります。
"dependencies": {
"@types/node": "^10.12.10",
"typescript": "^2.9.2",
"vscode": "^1.1.22"
}
この vscode ライブラリですが、npmインストール後にスクリプトを実行しないといけないようです。
% node ./node_modules/vscode/bin/install
これを自動化するためにscriptsのpostinstallを書いておくことでnpm installすると勝手にやってくれるようになります。
"scripts": {
"postinstall": "node ./node_modules/vscode/bin/install",
},
拡張機能の起動シーケンス
VSCodeはJavaScriptで書かれたコードを拡張機能としてロードします。
package.jsonのmainで指定されたパスに.jsを付けたものを実行するようです。
"main": "./out/extension",
なので、TypeScriptで書かなくてもいいのです。
でも TypeScript で書いたほうが補完がよく効くので私は結局TypeScriptを使いました。
他にも、パーサーの実行速度の問題でTypeScriptを選択した経緯があります。
コマンドの登録
コマンドをVSCodeで実効するには以下の作業が必要です。
- コマンド実行関数を書く
- activate関数内でコマンド実行関数を拡張機能に登録する
- pacakge.jsonで、登録したコマンドをVSCodeのインターフェースに登録する
2と3が別れているの鬱陶しいのですが、2が拡張機能自体の実装で、3がVSCodeコマンド群への登録です。