Visual Studio Code 拡張機能をCLIで操作する

vscodeはコマンドラインで拡張機能の操作が行えます。
この記事の情報はWindows 64bit版のバージョン`1.60.0`で確認した内容です。1年越しにちょっと更新しました。内容はほぼ変わってません。

```shell
> code -v
1.60.0
e7d7e9a9348e6a8cc8c03f877d39cb72e5dfb1ff
x64
```

ちなみに、自分自身の複数の開発環境を整えたい場合は[設定の同期機能](https://code.visualstudio.com/docs/editor/settings-sync)を使えばよいですし、プロジェクトでメンバーに特定の拡張機能を導入させたい場合は [extensions.json](https://code.visualstudio.com/docs/editor/extension-marketplace#_workspace-recommended-extensions) を使ったりすることをお勧めします。

## 表示

インストールされている拡張機能をすべて表示する

```shell
code --list-extensions
```

`--show-versions`を合わせて指定するとバージョンも出力されます。

```shell
code --list-extensions --show-versions
```

`--category`を使えばカテゴリでフィルタできます。

```shell
code --list-extensions --category <category>
```

カテゴリを指定せずに実行すると、指定できるカテゴリを表示できます。1年くらい経ってから記事を更新してますが地味に変わってますね。

```shell
> code --list-extensions --category
Possible Categories:
azure
data science
debuggers
extension packs
education
formatters
keymaps
language packs
linters
machine learning
notebooks
programming languages
scm providers
snippets
testing
themes
visualization
other
```

[Marketplace](https://marketplace.visualstudio.com/vscode)のWebサイトでも確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315950/048f6618-0a6f-9c4c-33b0-74c1851794a8.png)



## インストール・アンインストール

拡張機能のIDかvsixファイルのパスを指定することで、インストールできます。

```shell
code --install-extension <extension-id[@<version>] | path-to-vsix> [--force]
```

既にインストールされている拡張機能のバージョンアップには`--force`を指定する必要があります。
バージョンを指定した場合は`--force`を指定しなくても上書きされるようです。

アンインストールには拡張機能のIDを指定します。

```shell
code --uninstall-extension <extension-id>
```

インストール・アンインストールのどちらも複数指定することで一括で処理できます。

```shell
code --install-extension <extension-id-1> --install-extension <extension-id-2>
```

## 一時的に無効

一時的に無効にしてvscodeを起動するためのオプションが用意されています。
あくまでデバッグ用途のため、実行したプロセスでしか無効になりません。

有効・無効の設定を操作するようなオプションはないようです。

指定した拡張機能を無効にして起動します。

```shell
code --disable-extension <extension-id>
```

複数指定すれば、複数無効にできます。

```shell
code --disable-extension <extension-id-1> --disable-extension <extension-id-2>
```

すべて無効にして起動します。

```shell
code --disable-extensions
```


## Tips

### 拡張機能のIDやバージョンはどこで調べるの？

拡張機能のIDやバージョンは、vscodeや[Marketplace](https://marketplace.visualstudio.com/vscode)で拡張機能を検索して調べます。過去のバージョンはChangelogで確認できます。

codeコマンドで検索できればいいんですけどね。

記述時点では、それぞれ以下のように表示されます。Marketplaceはちょっとわかりづらいですが画面右部のMore Infoにあります。

vscodeの拡張機能画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315950/44a23a9d-51d2-1bcc-359d-cbcfcde1fd0f.png)


Marketplace
IDはUnique Identifierになってますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315950/9144c87b-7201-52b1-2550-5910507312e3.png)


### bashスクリプトで一発インストール

コマンドラインで操作できると簡単なbashスクリプトで一発でインストールできたり便利ですね。

```bash
#!/bin/bash
exts=(
    "vscode-icons-team.vscode-icons"
    "PKief.material-icon-theme"
    "ms-python.python"
)
cmd="code"
for ext in "${exts[@]}" ; do
    cmd="$cmd --install-extension $ext"
done
eval $cmd
```

## その他

他にも拡張機能のインストールディレクトリを変更するオプションやデバッグ用のオプションなどがあるみたいです。

以下は、バージョン`1.60.0`のヘルプから拡張機能関連を切り出したもの。

```shell
Extensions Management
  --extensions-dir <dir>
      Set the root path for extensions.
  --list-extensions
      List the installed extensions.
  --show-versions
      Show versions of installed extensions, when using --list-extensions.
  --category <category>
      Filters installed extensions by provided category, when using --list-extensions.
  --install-extension <extension-id[@version] | path-to-vsix>
      Installs or updates the extension. The identifier of an extension is always `${publisher}.${name}`. Use `--force` argument to update to latest version. To install a specific version provide `@${version}`. For example: 'vscode.csharp@1.2.3'.
  --uninstall-extension <extension-id>
      Uninstalls an extension.
  --enable-proposed-api <extension-id>
      Enables proposed API features for extensions. Can receive one or more extension IDs to enable individually.
...
  --disable-extensions               Disable all installed extensions.
  --disable-extension <extension-id> Disable an extension.
  --sync <on> <off>                  Turn sync on or off.
  --inspect-extensions <port>        Allow debugging and profiling of
                                     extensions. Check the developer tools for
                                     the connection URI.
  --inspect-brk-extensions <port>    Allow debugging and profiling of
                                     extensions with the extension host being
                                     paused after start. Check the developer
                                     tools for the connection URI.
```