LoginSignup
2

More than 5 years have passed since last update.

VSCode 用 SystemVerilogの拡張を作る(#4)

Posted at

独自コマンドを実装する

[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 で拡張機能用のライブラリが入ります。

package.json
  "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すると勝手にやってくれるようになります。

package.json
  "scripts": {
    "postinstall": "node ./node_modules/vscode/bin/install",
  },

拡張機能の起動シーケンス

VSCodeはJavaScriptで書かれたコードを拡張機能としてロードします。
package.jsonのmainで指定されたパスに.jsを付けたものを実行するようです。

package.json
  "main": "./out/extension",

なので、TypeScriptで書かなくてもいいのです。
でも TypeScript で書いたほうが補完がよく効くので私は結局TypeScriptを使いました。
他にも、パーサーの実行速度の問題でTypeScriptを選択した経緯があります。

コマンドの登録

コマンドをVSCodeで実効するには以下の作業が必要です。

  1. コマンド実行関数を書く
  2. activate関数内でコマンド実行関数を拡張機能に登録する
  3. pacakge.jsonで、登録したコマンドをVSCodeのインターフェースに登録する

2と3が別れているの鬱陶しいのですが、2が拡張機能自体の実装で、3がVSCodeコマンド群への登録です。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2