🎃

AtCoder向けのVSCode拡張機能を作成しました。(Part1:Rust向け)

2022/06/25に公開

タイトルの通り、AtCoderの問題をVSCodeで解くときに便利な拡張機能を作成しました。
まだ開発途中ですが、一旦形になったので紹介します。

どんな拡張機能を作ったの?

  • コンテスト名(例:「abc222」とか)を入力したら、自動でプロジェクトを作ってくれます。
    (すでにプロジェクトがあったら何もしません。)
    ↓こんな感じ
/app/atcoder/abc
↓
/app/atcoder/abc
`-- abc222
    |-- abc222_A
    |   |-- Cargo.toml
    |   |-- src
    |   |   `-- main.rs
    |   `-- tests
    |       `-- sample_inputs.rs
    |-- abc222_B ←省略してるけど、B以降にもAと同様のファイルがあります。
    |-- abc222_C
    |-- abc222_D
    |-- abc222_E
    |-- abc222_F
    |-- abc222_G
    `-- abc222_H
  • 「sample_inputs.rs」には、問題に記載されている入出力例を自動で入力してくれます。
  • 「.code-workspace」を自動で変えてくれます。

↓こんな感じで動きます。
demo_install

もし興味を持っていただけたら…

紹介している拡張機能は公開していません。(ちょっと面倒そうなので…)
こちらリポジトリの「/atcoder/atcoder-x.x.x.vsix」ファイルを落とすか、自分でコンパイルしたら使えます。

おまけ

これからVSCodeの拡張機能を自作しようとしている人向けに、僕が躓いたポイントを共有したいと思います。

躓きポイント1

どうやって環境を作るかわからない。
→本家の説明(ここ)の通り作業する。

躓きポイント2

何をきっかけに拡張機能が動くかわからない。
→package.jsonとextension.tsで定義している。
 本家の説明はここ
 僕の場合は↓の通り。
package.json(↓でコマンドパレットのイベントを定義)

  "activationEvents": [
    "onCommand:atcoder.createOrChangeProject"
  ],
  "main": "./dist/extension.js",
  "contributes": {
    "commands": [
      {
        "command": "atcoder.createOrChangeProject",
        "title": "Create Or Change Project"
      }
    ]
  },

extension.ts(↓で↑で定義したイベントの処理を登録)

export function activate(context: vscode.ExtensionContext) {
  let disposable1 = vscode.commands.registerCommand(
    "atcoder.createOrChangeProject",
    () => {
        ここにやりたい処理を書く。
    }
  );
  context.subscriptions.push(disposable1);

躓きポイント3

どうやったらテキスト入力できるのかわからない。
→vscode.window.showInputBoxを使う。
 本家の説明はここ
 僕の場合は↓の通り。
extension.ts

      vscode.window
        .showInputBox({
          placeHolder: "abcXXX",
          prompt: "XXX に番号を入力してください。",
        })

躓きポイント4

タスクnpm watchを起動してるのにコンパイルしてくれない。
→Docker環境でやってる人はたまに発生するっぽい。
 watch-pollでできることもあるっぽい。(僕の環境はできなかったけど。)
 結局僕は分からなかったので、毎回コマンド打ってコンパイルしてました。

躓きポイント5

npmで「/root/~」のファイルが読み取れなくてエラーになる。
→chmod -R 777 /rootで無理やりパーミッションを変更する。
 (僕はDockerの設定さぼってrootで作業してたから関係ないと思ったけど…よくわからん…)

最後に

ここまで読んでくれてありがとう!!!
意見、ツッコミ、どんなことでもコメントいただけると嬉しいです!!!

Discussion