Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

独自コマンドを実装する

[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コマンド群への登録です。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away