VS Code 1.20 の新機能のリリースノートを気まぐれに眺めてみる

[Visual Studio Code](https://code.visualstudio.com) の バージョン 1.20 がリリースされたので、[リリースノート](https://code.visualstudio.com/updates/v1_20)を眺めてみてどんな機能が追加されたのか見てみる。(過去分はこちら。[1.19](https://qiita.com/12345/items/a331c014a9d3fa9dac0e) / [1.18](https://qiita.com/12345/items/9b827138b5044ca82482) / [1.17](http://qiita.com/12345/items/28d83361341ce3ff3c9c) / [1.16](http://qiita.com/12345/items/5215293977dde2149c0f) / [1.15](http://qiita.com/12345/items/cebf4b4e9bfb2d2ef771))

# （自分的に良いと思った新機能）
- エクスプローラでの複数選択
- エクスプローラでのエラー視覚化
- 設定画面での賢い検索
- 管理者権限ファイルの保存
- グローバルスニペット
- スニペット変数の追加
- ターミナル選択テキストの自動コピー

あと、注目すべき変更点の中で出てきた「Quick Open ビュー」はこれ自体は既存の機能だが知らなかった（か忘れていた）。

# [ワークベンチ関連](https://code.visualstudio.com/updates/v1_20#_workbench)
## エクスプローラでの複数選択
- ファイルエクスプローラで、ファイルを複数選択しての操作ができるようになった。
- Ctrl+クリックで追加選択、Shift+クリックで範囲選択というおなじみの操作で複数ファイルを選択する。マウスをドラッグして範囲選択することによる複数選択はできない。
- この機能により、今まではCtrl+クリックはエディタを横に並べて表示する操作だったが、複数選択の操作に変更された。以前の操作に戻したい場合は設定`workbench.list.multiSelectModifier`を`Alt`に変更すると、複数選択操作は`Alt`キーに変更される。

以前、複数ファイルを削除したいときに1個1個しか削除できず面倒だった記憶がある。一見地味だけとこういう機能追加は重要！

## エクスプローラでのエラー視覚化
- エラーや警告のあるファイルについてエクスプローラで視覚化されるようになった。エラーの個数も表示される。
- この機能は、設定`problems.decorations.enabled`によって有効/無効を切り替えられる（デフォルトは`true`）。

![image](https://code.visualstudio.com/assets/updates/1_20/error-decoration.png)

## 設定画面での検索
- 設定画面ではキーワードを入力して項目の絞り込みが行えるが、今回から単純なキーワード一致だけではなく、代替文言、タイポ、活用形なども考慮されたより自然な言語検索を行えるようになった。
- 以前の検索に戻すには、設定`workbench.settings.enableNaturalLanguageSearch`を`false`にする。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/181011/2da415da-14a5-4d17-965d-c51f7888ad42.png)

実際に試してみるとタイポとか結構よさげに忖度してくれる。
検索処理は２段階で行われているらしく、最初キーワード一致で検索しに行って一瞬「設定が見つかりません」と表示されたあと、上記の忖度検索が行われるっぽい。さすがに忖度検索のほうは若干時間がかかるが、それでも自分のようなtypoerにとってはありがたい。

## 管理者権限が必要なファイル保存が可能に
- `hosts`ファイルなどの、保存に管理者権限が必要なファイルの保存ができるようになり、これらのファイルの保存時に「管理者権限で再試行」という選択肢が選べるようになった。
- なお、当然だが権限自体は必要。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/181011/628234c7-81a1-4329-5765-e6fdc97b5b6e.png)

うん、これは便利！

## 256MB以上のラージファイルの保存
- ファイルサイズが256MB以上のファイルを保存できるようになった。
- これはディスクへの保存方法の実装の変更により実現できたもので、コンテンツのスナップショットを活用して64KBのチャンクでファイルをストリーミングしている。

## スマートケース検索
- 設定`search.smartCase`に`true`を設定するとグローバル検索のスマートケースモードが有効になり、大文字を含むキーワードを指定すると自動的に大文字・小文字が区別され、すべて小文字のキーワードを指定すると大文字・小文字が区別されない検索になる。

設定:false|設定:true
:-:|:-:
![image.png](https://qiita-image-store.s3.amazonaws.com/0/181011/c5c34d49-8bc0-af3f-d1ed-5334d0046004.png)|![image.png](https://qiita-image-store.s3.amazonaws.com/0/181011/9dc64f9d-bc59-93b0-87cc-a1635e6a9389.png)

## リストやツリーでのダブルクリックによるオープン
- 新しい設定`workbench.list.openMode`を`doubleClick`に変更すると、ツリーやリスト内のアイテム選択やツリー展開がダブルクリックになる。

## イメージプレビューのズーム機能
- イメージのプレビューでズーム機能が付いた。
- Ctrl(Windows)やAlt(Linux/mac)を押しながらのホイール操作でズームイン／アウトが行える。
- トラックパッドのピンチ操作にも対応。
- クリックでズームイン、Ctrl+クリックでズームアウトも可。
- ステータスバーに現在の倍率が表示され、クリックすると指定された倍率に変更することができる。
- これに伴い、イメージの表示位置が左上から中央になった。

## テーマ固有の色のカスタマイズ
- ユーザー設定で特定のカラーテーマを微調整できるようになった。
 
## エディタタブ用のテーマカラー追加
- エディタタブ用の新しいテーマカラーが追加された。
    - tab.hoverBackground
    - tab.unfocusedHoverBackground
    - tab.hoverBorder
    - tab.unfocusedHoverBorder
- これらの設定は`workbench.colorCustomizations`を使用する。

## ドロップダウンのUI変更(Windows, Linux)
- WindowsおよびLinuxのドロップダウンでHTMLコントロールの代わりにカスタムウィジェットが使用されるようになり、他のツリーやリストのウィジェットと同じUIになった。

v1.19|v1.20
:-:|:-:
![image.png](https://qiita-image-store.s3.amazonaws.com/0/181011/05650f6d-3b66-2fe1-1668-325e5ac7ee1f.png)|![image.png](https://qiita-image-store.s3.amazonaws.com/0/181011/5009f215-f096-c2e8-69ff-8927f21ed888.png)

## 開いてるエディターの変更
- 設定`explorer.openEditors.visible`で指定された最大サイズに達すると、開いているエディタービューのサイズを変更できるようになった(スクロールすれば表示される)。デフォルト値は`9`。この変更により、`explorer.openEditors.dynamicHeight`の設定はサポートされなくなった。
- 開いてるエディタービューを非表示にするために`explorer.openEditors.visible`を`0`に設定する機能は今回のリリースで非推奨になっており、次回で削除する予定。開いてるエディタービューを非表示にするには、エクスプローラのタイトル領域にあるコンテキストメニューを使用する。

## macOSタッチバーエントリの使用不可設定
- 新しい設定`keyboard.touchbar.enabled`により、macOSタッチバーのエントリを無効にすることができる。

## フォントエイリアシング設定(macOS)
- macOSで`workbench.fontAliasing`設定を`auto`に変更すると、モニタのDPIに応じてフォントエイリアシングを制御できる。

## 出力パネル
- VS Codeのログ出力は、前回のリリースではコマンドによってログファイルを表示する形式だったが、今回晴れて出力パネルから表示できるようになり、さらにシンタックスハイライトもされるようなった。
- また、新しい実装ではメモリリソースの消費量がより少なくなり、表示されていない時はメモリリソースが解放される。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/181011/0c4819a7-8b46-42e8-5c01-d13fbddd64c4.png)

# [エディタ関連](https://code.visualstudio.com/updates/v1_20#_editor)
## グローバルスニペットのサポート
- 今までのスニペット機能は言語ごとの設定になっていたが、今回から言語を横断したグローバルなスニペットもサポートされるようになった。
- コマンド「基本設定: ユーザスニペットの構成」を選ぶと、言語の選択肢の他に「新しいグローバルスニペットファイル」が選べるので、新規スニペットファイルを作成する。
- `scope`属性に複数の言語を列挙すると、それらの言語の共通のスニペット定義になる。空文字を設定すればすべての言語共通のスニペットになる。
- 拡張機能開発者はグローバルスニペットを投稿することができる。拡張機能に`code-snippets`ファイルを含め、`package.json`の`contributes.snippets`セクションの言語プロパティを省略する。

これも良い改善！より柔軟なスニペットが定義できるようにった！

## スニペット変数の追加
- スニペット定義の中で使える変数として新たに、クリップボードの値の読む`CLIPBOARD`や、現在日時を挿入する以下の変数が追加された。
    - CURRENT_YEAR
    - CURRENT_YEAR_SHORT
    - CURRENT_MONTH
    - CURRENT_DATE
    - CURRENT_HOUR
    - CURRENT_MINUTE
    - CURRENT_SECOND

これも良い！！現在日付とか欲しかった！クリップボードも使いでがありそう。

## クイックフィックスやコードアクションのキーバインド
- 新しいコマンド`editor.action.codeAction`を使用すると、特定のコードアクションのキーバインドを設定できるようになった。
- 例えば、関数を抽出するリファクタリングのコードアクションのキーバインド定義は以下のようになる。

```
{
  "key": "ctrl+shift+r ctrl+e",
  "command": "editor.action.codeAction",
  "args": {
    "kind": "refactor.extract.function"
  }
}
```

- コードアクションの種類は、拡張された`CodeActionProvided`APIを使用して拡張機能によって指定される。種類は階層的なので、`"kind":"refactor"`はすべてのリファクタリングコードアクションを表示し、`"kind":"refactor.extract.function"`はExtract関数リファクタリングのみを表示する。
- 定義されたキーが押された時、単一の`"refactor.extract.function"`コードアクションのみが使用可能な場合は自動的に適用され、複数の抽出機能コードアクションが利用可能な場合はそれらを選択するコンテキストメニューを表示する。この判断は`"args:"`の下で定義する`"apply:"`の値によって指定できる。
    - `"first"` 可能なコードアクションの1つ目を自動的に適用する
    - `"ifSingle"` デフォルト値。可能なコードアクションが1つの時のみ自動的に適用する
    - `"never"` 可能なコードアクションが1つの時であっても必ずコンテキストメニューを表示する

ちょっと設定が大変だけど、ショートカットキーメインで操作したいと思っている人にとってはよさげな機能。

## サジェストの改善
- 新しい設定`editor.suggestSelection`を追加して、サジェストの一覧の中のどの選択肢をあらかじめ選択させておくかを制御できるようにした。
    - `first` 一番上の項目が常に選択されている
    - `recentlyUsed` 以前に使用された項目が選択されている（デフォルト）
    - `recentlyUsedByPrefix` 以前に選択した時のプレフィクスに基づいて使用された項目が選択されている

一番最後の設定値のルールがわかりづらいが、例えば過去に`co`と打って`console`を選択し、`con`と打って`const`を選択したことがある場合、`co`まで打つと`console`がデフォルト選択され、さらに`n`を打つと`const`がデフォルト選択される。複雑そうだが慣れれば器用に入力し分けられそう。

## Emmetの改善
- CSSの略語の前に`-`を付けると、展開された略語に含まれるすべての適用可能なベンダープレフィクスを取得できる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/181011/df3045f4-c1eb-b5e5-c821-280628736de0.png)

## カーソル幅の変更
- 新しい設定`editor.cursorWidth`により、カーソル幅をピクセル単位で変更できるようになった（設定`editor.cursorStyle`が`line`の場合のみ有効）。なお、文字の幅以上に広くすることはできない。

![image](https://code.visualstudio.com/assets/updates/1_20/cursor-width.gif)

## グローバルmacOS検索クリップボード
- 前回のリリースでmacOSグローバル検索クリップボードと統合され、アプリケーション間で検索テキストを簡単に共有できるようになった。この設定はデフォルトで無効になっているが、設定`"editor.find.globalFindClipboard"`で有効にすることができる。
- また、検索ビューでもサポートされるようになり、これは設定`"search.globalFindClipboard"`で有効にすることができる。

## カッコ間のテキスト選択
- 新しいコマンド`Select to Bracket`(対応日本語なし)により、対になっている括弧の間にあるテキストを選択することができるようになった。
- なお、既存のコマンドである「ブラケットへ移動」は、対応する括弧にカーソルを移動するだけである。

おいっ！既存のコマンドのほうを知らなかったぞ！ってかこっちのほうが重要！

## ミニマップの左側表示サポート
- 新しい設定`editor.minimap.side`により、ミニマップを左側にも表示できるようなった。

そういえばミニマップ、使ってないなぁ。

## 差分エディタでのホワイトスペースのトリミングを無視する/しない切り替え
- 差分エディタのタイトルエリアに新しいアクションが追加され（「＝」のアイコン）、これにより、ホワイトスペースのトリミングを無視する/しない設定をすばやく切り替えることができるようになった。

用途は、変更内容を確認したい時にインデントの修正とかは無視したい時用とか？

# [ソース管理関連](https://code.visualstudio.com/updates/v1_20#_source-control)
## Gitサブモジュールのサポート
- 今回のリリースでGitのサブモジュールをサポートするようになった。
- サブモジュールはGitリポジトリそのものなのでリポジトリリストに表示される。
- 外部リポジトリのサブモジュールの変更をステージ、ステージ解除、破棄するための基本的なサポートが用意されている。
- サブモジュールを自動的に検出する設定の無効化は、設定`git.detectSubmodules`を使用する。

![image](https://code.visualstudio.com/assets/updates/1_20/submodules.png)

Gitにサブモジュール機能というのがあるのを今回初めて知った！

## Git: コミット前の未保存ファイル確認
- コミット時に未保存状態のファイルが存在した場合に、それを保存してコミットするかどうかを確認するプロンプトが出せるようになった。
- 設定`git.promptToSaveFilesBeforeCommit`を`true`にするとチェックが行われるようになる（デフォルトは`false`）。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/181011/00114918-8454-3939-9fdf-e7b44f55ac8f.png)

「とにかくコミット」って・・・

## Git: コミットコメント入力文字数のチェック
- コミットコメント入力時に、一行の推奨文字数である72文字のチェックを行う機能が追加された。設定`git.inputValidation`の値によってチェックタイミングを変更できる。
    - `always` 文字数をオーバーしていない状態でも文字数チェックが表示される
    - `warn` 文字数をオーバーした場合だけ文字数チェックが表示される(デフォルト)
    - `off` 文字数チェックを行わない

under(`always`)|over(`warn`&`always`)
:-:|:-:
![image.png](https://qiita-image-store.s3.amazonaws.com/0/181011/18d06f10-2de6-0397-be08-e02908936746.png)|![image.png](https://qiita-image-store.s3.amazonaws.com/0/181011/90113b6e-3e41-dcec-562d-937f13c2a2b8.png)

コミットコメントに推奨文字数とかあったんだ・・・

## エディタの差分デコレータの表示設定
- 変更された行を表すインライン差分デコレーションの表示設定を設定`scm.diffDecorations`で行えるようになった。
    - `gutter` 左側の行番号横の表示のみ
    - `overview` 右側のオーバービューでの表示のみ
    - `all` どちらも表示（デフォルト）
    - `none` どちらも非表示

`gutter`|`overview`|`all`
:-:|:-:|:-:
![image.png](https://qiita-image-store.s3.amazonaws.com/0/181011/f0ba2aee-35b4-f61f-1ca5-b3efc67830a9.png)|![image.png](https://qiita-image-store.s3.amazonaws.com/0/181011/6b4e685b-c51a-475c-8b7f-99033fe2a0d5.png)|![image.png](https://qiita-image-store.s3.amazonaws.com/0/181011/36ac8fea-2ba7-b58b-8f93-74bd35a4dbb4.png)

# [統合ターミナル関連](https://code.visualstudio.com/updates/v1_20#_integrated-terminal)
## スクリーンリーダーのサポート
- ターミナルでスクリーンリーダーのサポートが追加された。
- この機能を有効にするには、VS Codeを「スクリーンリーダー最適化」モードにする必要がある。このモードは通常自動的に検出されるが、`Alt` + `F1`(アクセシビリティのヘルプを表示)を開いて手動で切り替えることもできる。
- これを第一歩として、視覚障害のある方に端末を使いやすくする方法を積極的に検討している。

## ターミナルアプリケーションでのマウスホイール動作
- `vim`や`tmux`などのアプリケーションにおいて、マウスホイールイベントが矢印イベントに変換され、スクロールが可能になった。

## macOS上のoptionキーのメタキー対応
- optionキーをターミナルのメタキーとして使用できるようになり、`option` + `B`のような典型的なシェルショートカットを使用して単語を飛ばしたり、`option` + `F`を使用して単語を飛ばしたりすることができるようになった。
- この設定を有効にするには、設定`terminal.integrated.macOptionIsMeta`に`true`をセットする（デフォルトは`false`）。

## 選択テキストの自動コピー
- ターミナルでテキストを選択すると自動的にクリップボードにコピーできるようになった。
- この設定を有効にするには、設定`terminal.integrated.copyOnSelection`に`true`をセットする（デフォルトは`false`）。

これは地味に便利。

## 環境変数設定でのVS Code変数サポート
- ターミナルで使用できる追加の環境変数の設定`terminal.integrated.env.*`において、VS Codeの変数が使用できるようになった。
- 他の設定でも使われている[標準の変数形式](https://code.visualstudio.com/docs/editor/variables-reference)を使用する。

```:例
"terminal.integrated.env.windows": {
  "FOO": "${workspaceRoot}",
  "BAR": "${env:PATH}"
}
```

# [デバッグ関連](https://code.visualstudio.com/updates/v1_20#_debugging)
## マルチルートワークスペースのデバッグサポートの改善
- マルチルートワークスペース機能を使用して、単一のワークスペースの関連プロジェクト（例えば"Server"と"Client"など）を操作することができ、これらのフォルダにはそれぞれの起動設定（例えば"Launch Server"と"Launch Client"など）が存在するが、これまでは異なるフォルダの起動設定を1つの複合的な起動設定として定義することはできなかった（フォルダを横断しての起動設定を参照する仕組みが存在しなかった）。
- 今回のリリースではまず、ワークスペーススコープの起動構成をサポートするようにし、次に、フォルダー間で起動構成を参照する仕組みを導入した。この「複合」起動構成を使用すると、異なるフォルダの起動構成をワークスペースレベルで保持することができる。
- ワークスペーススコープの起動構成は、ワークスペース構成ファイルの`"launch"`セクションに定義する。このセクションはコマンドパレットの「ワークスペース構成ファイルを開く」で編集できる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/181011/6419aa3e-9bea-aed7-9274-7ea42d6450d1.png)

- あるいは、デバッグビューにあるドロップダウンメニューの「設定（ワークスペース）の追加」を使用して新しい起動設定を追加することもできる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/181011/b38701c9-eed1-9b77-adb5-bdaa05cb71c8.png)

- 複合起動構成では、名前がワークスペース内で一意である限り、個々の起動構成を名前で参照できる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/181011/7dc833a4-b821-3fdc-aca3-f523e57f50ef.png)

- 個々の起動構成名が一意でない場合、"folder"構文を使用することにより一意に定義することができる。
- ワークスペース構成ファイルの`launch`セクションには、`conpounds`に加えて、通常の起動構成も含まれるので、設定で使用されているすべての変数が明示的に正しいフォルダにスコープされていることを確認する必要がある。明示的にスコープされた変数の詳細については次の項目を参照。

## スコープ設定変数
- `launch.json`と`tasks.json`ファイルのスコープ設定変数に、ワークスペースフォルダを特定するための新しい変数構文が導入された。「ルートフォルダ名：変数」と表記することで、ワークスペース内の該当ルートフォルダを指し示すことができる。ルートフォルダ名がないと、変数は使用されているのと同じフォルダーにスコープされる。
- 例えば、フォルダ`Server`と`Client`を持つマルチルートワークスペースの場合、`${workspaceFolder:Client}`は`Client`のルートパスの参照になる。

## Nodeデバッグ
### Node.jsサブプロセスにデバッガを自動的にアタッチする
- Nodeデバッグでは、デバッグ対象のすべてのサブプロセスを追跡し、デバッグモードで起動されるプロセスに自動的にアタッチするメカニズムを追加した。この機能は、"cluster"ノードモジュールに基づくプログラムのように、Node.jsプロセスをforkまたはspawnするプログラムのデバッグを簡略化する。
- この機能は、起動設定属性`autoAttachChildProcesses`を`true`に設定すると有効になる。
- 注：サブプロセスを追跡できるようにするには、親のプロセスIDが必要。このためには、起動設定から起動される主なデバッグ対象がNode.jsプロセスであり、プロセスIDを見つけるために "evaluate"を使用する必要がある。
- プロセスがデバッグモードにあるかどうかは、プログラムの引数によって判定される。現在、`--inspect`、`--inspect-brk`、`--inspect-port`、`--debug`、`--debug-brk`、`--debug-port`のパターンを検出している（すべてオプションで「=ポート番号」が続く）。

### "nvm”のサポート
- "nvm"(あるいは"nvm-windows")をNode.jsのバージョン管理のために使用している場合、特定のバージョンのNode.jsを使用するために、起動設定の`runtimeVersion`属性を指定できるようになった。
- 注意：この機能は、該当バージョンのNode.jsのダウンロード・インストールは行わないため、`runtimeVersion`属性で指定したバージョンのNode.jsがインストールされているか確認する必要がある。したがって、起動設定に`"runtimeVersion": "7.10.1"`を追加する予定の場合は、統合ターミナルなどから`nvm install 7.10.1`のようなインストールコマンドを実行する必要がある。

# [拡張機能関連](https://code.visualstudio.com/updates/v1_20#_extensions)
## 推奨拡張機能の通知
- VS Code標準またはインストール済みの拡張機能でサポートされていないファイルタイプで作業している場合は、構文ハイライトが表示されないことがある。このようなファイルをサポートできる拡張機能がマーケットプレイスにある場合、通知が表示されるようになった。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/181011/df46bae8-dbaa-6479-7116-a15010bf8796.png)

- 拡張機能の推奨リストに、同じリポジトリで作業している他のユーザーの間で人気のある拡張機能が追加されるようになった。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/181011/e31871c6-8208-8771-f3a6-c304b047d76b.png)

この、２つめのやつ、すごいね。

# [言語関連](https://code.visualstudio.com/updates/v1_20#_languages)
## TypeScript 2.7.1
- VS Codeには[TypeScript 2.7.1](https://blogs.msdn.microsoft.com/typescript/2018/01/31/announcing-typescript-2-7/)が付属している。今回のリリースではいくつかの新機能とバグ修正が行われている。

## JavaScriptとTypeScriptのクイックフィックス
- JavaScriptとTypeScript用の新しいクイックフィックスによりエラーをすばやく修正できるようになった。
- 未使用の変数などの修正可能なエラー箇所にカーソルを移動し、電球アイコンまたは`Ctrl+.`を押してクイックフィックスを起動する。
- 使用可能なクイックフィックスの1つが現在のファイル内の複数のエラーに適用できる場合は、 ファイル内のすべてのコードを修正する。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/181011/83ebd65c-66d4-596f-34a7-04a11430c8a2.png)

## ブラケット表記プロパティのサジェスト
- JavaScriptとTypeScriptで`.`を入力してコード補完を行った際、プロパティ名に空白やその他の非識別子文字が含まれていても、プロパティがすべて表示されるようになった。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/181011/920d50c3-8a5a-76b5-135c-e6b796be3a0b.png)

- これらのプロパティを選択すると、自動的にブラケット表記に変換される。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/181011/b3b48faa-1271-b4ab-f822-7a7e6d12ff23.png)

## メンバプロパティの自動サジェスト
- JavaScriptやTypeScriptのクラスプロパティにアクセスするためには`this.`とタイプする必要があったが、`this.`を入力せずに利用可能なメンバーがサジェストされるようになった。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/181011/d333f529-47ba-bb84-fca1-6d59d7031283.png)

- サジェストからクラスプロパティ選択すると自動的に`this.`を補完してくれる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/181011/bcb37e9d-a8d6-6ac3-a9ad-fc988a417943.png)

## オプションプロパティのサジェスト
- TypeScriptのオプションプロパティのサジェストが、ちゃんと末尾に`?`が付く形で表示されるようになった。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/181011/acff4109-c326-5240-4195-d1c0d0437ea9.png)

## ファイル名に基づく自動インポート
- JavaScriptおよびTypeScriptの自動インポートで、ファイル名に基づいてデフォルトでエクスポートされたオブジェクトをインポートできるようになった。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/181011/8fb7b698-4158-87c5-5383-7d981286918d.png)

## 拡張機能が提供するTypeScriptプラグイン
- [TypeScriptプラグイン](https://github.com/Microsoft/TypeScript/wiki/Writing-a-Language-Service-Plugin)を使用すると、開発者はVS CodeのJavaScriptおよびTypeScript言語サポートを拡張できる。 例えば、JavaScriptテンプレート文字列内で作業するときに、ファイルに追加のlintを追加したり、インテリセンスを追加することができる。
- TypeScriptプラグインはTypeScript 2.3で初めて導入されたが、以前は`npm`で作業領域にプラグインをインストールしてから、`jsconfig.json`または`tsconfig.json`ファイルをロードしてロードする必要があった。今回のリリースで、拡張機能が設定なしで自動的にアクティブになるグローバルTypeScriptプラグインのセットを提供できるようにすることで作業が単純化され、拡張機能をインストールするだけで済むようになった。
- いくつかの拡張機能がすでにこれを利用している。
    - [vscode-styled-components](https://marketplace.visualstudio.com/items?itemName=jpoissonnier.vscode-styled-components) - [styled-components](https://github.com/styled-components/styled-components) CSS文字列用のシンタックスハイライト、インテリセンス、エラーリポート機能
    - [lit-html](https://marketplace.visualstudio.com/items?itemName=bierner.lit-html) - [lit-html](https://github.com/Polymer/lit-html) テンプレート文字列用のシンタックスハイライト、インテリセンス、フォーマット機能
- 拡張機能が提供しているプラグインは、VS CodeのバージョンのTypeScript用に自動的に有効化される。ワークスペースのバージョンのTypeScriptを使用している場合は、引き続きTypeScriptプラグインをワークスペースにインストールする必要がある。
- 拡張機能開発者向けドキュメントには、[TypeScriptプラグインの提供ポイント](https://code.visualstudio.com/docs/extensionAPI/extension-points#_contributestypescriptserverplugins)についての情報が記載されている。

# [サービスアビリティ関連](https://code.visualstudio.com/updates/v1_20#_serviceability)
- コマンド「ヘルプ:問題の報告」「ヘルプ:パフォーマンスの問題をレポート」によって独立したウィンドウが開き、問題の報告を行うことができるようになった（以前は直接GitHubのIssue画面が開くようになっていた）。
- このウィンドウでは、報告したい問題の種類に基づいて情報を収集することができる。これにはシステムの基本情報、アクティブな拡張機能、実行中のVS Codeプロセス、ワークスペースのファイルタイプが含まれる。送信する情報を選択するとブラウザウィンドウが開かれ、GitHub上で問題をプレビューできる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/181011/267ae8d8-e09c-2c31-1238-105539cf1a8c.png)

「英語で記入して下さい」と書かれていても、ウィンドウが日本語表示だと、つい日本語で記入したくなってしまいそう・・。

# [拡張機能開発関連](https://code.visualstudio.com/updates/v1_20#_extension-authoring)
## カスタムビューの改善
カスタムビューは以下の追加APIによって改善された。

- インラインアクション
    - `view/item/context`メニューの設定に`inline`グループを登録することでツリーアイテムにインラインアクションを登録できるようになった。
- リソースURI
    - カスタムツリービューがファイルリソースに基づいている場合、リソースURIを表す`TreeItem`にリソースURIを登録できるようになった。これにより、ビューをユーザが設定したファイルアイコンテーマに取り入れて、エクスプローラのファイルエクスプローラビューと同様の外観となる。
- idプロパティ
    - `TreeItem`に`id`を渡すことができるようになり、これによりツリーの選択や展開の状態が変更されたときに確実に保持されるようになる。

## エクスプローラコマンドの複数選択コンテキスト
- 今回のリリースで、エクスプローラでの複数選択機能が導入された。エクスプローラにコマンドを登録する拡張機能は、コマンドに渡される新しい引数を使用することで、エクスプローラでの複数選択に対応できる。
- 前述のように、VS Codeはエクスプローラで現在選択されているリソースを推測しようとし、コマンドを呼び出すときにこれをパラメータとして渡す。しかし、複数選択が有効な場合、VS Codeはコマンドに追加の第2引数、つまり選択されたリソースの配列を渡す。この配列には常に最初のリソース引数が含まれる。

## 新しいメニューグループ識別子
- いくつかのメニューには、コマンドの配置をより細かく制御するための新しいグループ識別子が追加された。
- エクスプローラコンテキストメニュー
    - `navigation`: VS Code間のナビゲーションに関連するコマンド。以前と同じようにエクスプローラのコンテキストメニューの主要なグループ。
    - `2_workspace`: ワークスペース操作に関連するコマンド
    - `3_compare`: 差分エディタでのファイル比較に関連するコマンド
    - `4_search`: 検索ビューでの検索に関連するコマンド
    - `5_cutcopypaste`: ファイルのカット、コピー、ペーストに関するコマンド
    - `7_modification`: ファイルの変更に関するコマンド
- エディタタブコンテキストメニュー
    - `1_close`: エディタを閉じる処理に関連するコマンド
    - `3_preview`: エディタの固定に関連するコマンド
- エディタタイトルメニュー
    - `1_diff`: 差分エディタの動作に関連するコマンド
    - `3_open`: エディタを開く処理に関連するコマンド
    - `5_close`: エディタを閉じる処理に関連するコマンド

## 新しいキーボードショートカットコンテキスト演算子
- キーボードショートカットコンテキストを使用すると、キーバインディングがいつ有効になるかを制御できる。これらはキーバインディングが有効であるか使用可能になっているかを定義するため、`when`節とも呼ばれる。今回のリリースでは、`when`句の新しいキーと値のペア演算子がある。 式`key =~ value`は、右辺を正規表現として扱い、左辺とマッチングさせる。

## CodeActionProviderの改善
- `CodeActionProvider`は新しい`CodeAction`クラスのオブジェクトを返すようになった。`CodeAction`は`Command`よりも多くのメタデータと機能を追加し、コードアクションがどのようなもので、どのようにVS CodeのUIで使用されるのかをよく把握している。
- `CodeAction`は、主にタイトル、種類、少なくとも1つの`Command`または`WorkspaceEdit`（今回の新機能）で構成されている。
- `CodeAction`はコードアクションの種類とコードアクションが扱う診断セットを含むコードアクションに関するメタデータも追加される。このメタデータを使用して、`Refactor`コマンドや`vscode.action.codeAction`キーバインディングなどの機能を実装し、将来使用するために追加機能を構築する予定。

## 最近使用した項目を開くのリストからのファイル削除
- 新しいコマンド`vscode.removeFromRecentlyOpened`によって、ファイルメニューの「最近使用した項目を開く」のリストから項目を削除できるようになった。

## ターミナルを生成したときにカレントディレクトリを設定
- 新しいプロパティ`cwd`によって、`createTermial`を呼び出したときにカレント作業ディレクトリをセットできるようになった。

## デバッグAPI
### ブレークポイントの追加/削除
- ブレークポイントデバッグAPIの改善は引き続き行われ、今回のリリースでは`SourceBreakpoints`と`FunctionBreakpoints`の[追加と削除](https://github.com/Microsoft/vscode/blob/7636a7d6f7d2749833f783e94fd3d48d6a1791cb/src/vs/vscode.proposed.d.ts#L282-L292)が行えるようになった。
- 注：ブレークポイントAPIはまだ提案の段階なので、使用するには`package.json`に`"enableProposedApi": true`を追加し、`vscode.proposed.d.ts`を拡張機能プロジェクトの中にコピーする必要がある。 また、`enableProposedApi`属性を使用する拡張機能をマーケットプレイス公開することはできない。

### `adapterExecutableCommand`コマンドに代わる新しい`DebugConfigurationProvider.debugAdapterExecutable`
- 現在、デバッガ拡張機能は、「フック」のようなコマンド`adapterExecutableCommand`を提供して、VS Codeによって起動される予定のデバッグアダプタの動的に計算されたパス（および対応するプログラム引数）を返すことができる。今回のリリースでは、型指定されていないコマンドベースのメカニズムを型付きのソリューションに置き換える「本当の」APIを提案している。同時に`adapterExecutableCommand`コマンドは非推奨になった（使用されなくなった時点でサポートが削除される）。
- 新しいAPIは、`DebugAdapterExecutable`オブジェクトとしてラップされたパスと引数を返す`DebugConfigurationProvider`のオプションのメソッド`debugAdapterExecutable`。

### コマンド`vscode.logToDebugConsole`の削除予定
- [以前のリリース](https://code.visualstudio.com/updates/v1_18#_debug-api-updates)で発表されているように、本物のデバッグAPIのために`vscode.logToDebugConsole`コマンドを非推奨にした。次回のリリースで`vscode.logToDebugConsole`コマンドのサポートを削除する予定。

### デバッグ拡張機能の内部でのデバッグアダプタの実行
- デバッガ拡張機能を開発するには、通常、拡張機能とデバッグアダプタの両方を2つの並列セッションでデバッグする必要がある。VS Codeはこれをうまくサポートするが、拡張機能とデバッグアダプタの両方が1つのセッションでデバッグできる1つのプログラムであれば、開発が容易になる。
- 今回のリリースでは、拡張機能モジュール内でデバッグアダプタを実行する方法を検討した。基本的な考え方は、`DebugConfigurationProvider`の`resolveDebugConfiguration`メソッドでデバッグセッションの開始をインターセプトし、接続要求をリッスンし始め、すべての要求に対して新しいデバッグアダプタセッションを作成する。VS Codeで（常に新しいデバッグアダプタを起動するのではなく）接続要求を使用するには、`debugServer`属性を追加して起動設定を変更する。
- [これらのコード](https://github.com/Microsoft/vscode-mock-debug/blob/042d19a27a8e3a08f27a24110506b53fbecc75ce/src/extension.ts#L61-L71)は、「モックデバッグ」拡張拡張のためのこのアプローチを実装している（この機能を有効にするには、コンパイル時フラグ`EMBED_DEBUG_ADAPTER`をtrueに設定する）。

# [提案された拡張機能API](https://code.visualstudio.com/updates/v1_20#_proposed-extension-apis)
今回のリリースでは2つの分野で、新たに提案された拡張APIが追加された。これらのAPIは今後のリリースで安定版に追加される予定。
注：これらのAPIはまだ提案状態なので、使用するには`package.json`に`"enableProposedApi": true`を追加する必要があり、`vscode.proposed.d.ts`を拡張機能プロジェクトにコピーする必要がある。また、`enableProposedApi`属性を使用する拡張機能をマーケットプレイスに公開することはできない。
## 拡張機能のロギング
- 拡張機能で、VS Codeのログフォルダ内の自フォルダにログを出力することが可能になった。
- 拡張機能は`Logger`のメソッドを使用して何らかのログレベルでログメッセージの出力をすることができ、利用者は「開発者: ログレベルの設定」コマンドを使用して、ログメッセージを記録したい最小のログレベルを指定することができる。
- 「開発者： ログフォルダーを開く」コマンドを実行することによって、ログファイルを見つけることができる。このフォルダは、ログを書き込んだ拡張機能の実行中のインスタンスごとのフォルダが含まれている。

## ワークスペースフォルダの追加、削除、変更
- 現在開いているワークスペースのワークスペースフォルダを変更するために、新しく提案されたAPIが追加された。このAPIは以下のことが行える。
    - 既存のワークスペースフォルダの削除（削除するフォルダの場所を`start`で指定し、削除するフォルダの数を`deleteCount`で指定する）。
    - 新しいワークスペースフォルダの特定の場所への追加（追加する場所を`start`で指定し、`deleteCount`を`0`にして、ワークスペースフォルダを引数として追加する）。
    - 移動や名前変更など、既存フォルダの変更（最初に存在するフォルダを削除してから、再度フォルダを追加する）。

## RenameProvider2
- `RenameProvider`を継承した`RenameProvider2`では、名前を変更するシンボルの範囲やユーザーが名前を変更したときに表示される初期名など、名前変更時の追加情報を拡張機能に提供できる。

# [プレビュー機能](https://code.visualstudio.com/updates/v1_20#_preview-features)
## 言語パック
- 拡張機能を使用してVS Codeに追加の翻訳を追加できる言語パックのサポートを追加した。
- [Transifex](https://www.transifex.com/microsoft-oss/)の翻訳者と協力して、[マーケットプレイス](https://marketplace.visualstudio.com/)の言語パック拡張機能として翻訳を最適に公開するプロセスを確立する予定。

## 通知のUXデザイン
- 今回のマイルストーンで、UX（ユーザーエクスペリエンス）チームはVS Codeの通知表示を再設計した。次のマイルストーンでこれらのデザインの開発作業を開始する予定。デザインに関する詳細は[このGitHubのIssue](https://github.com/Microsoft/vscode/issues/22388#issuecomment-361915332)で確認することができる。

# [新しいドキュメント](https://code.visualstudio.com/updates/v1_20#_new-documentation)
## DockerおよびAzure App Service向けのNode.js開発チュートリアル
- 「[Node.jsアプリケーションのAzureへのデプロイ](https://code.visualstudio.com/docs/nodejs/nodejs-deployment?utm_source=VsCode&utm_medium=ReleaseNotes)」に2つの新しいチュートリアルを追加した。
    - [Azure App Serviceを使用したデプロイ](https://code.visualstudio.com/tutorials/app-service-extension/getting-started?utm_source=VsCode&utm_medium=ReleaseNotes) - [Azure App Service](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-azureappservice)拡張機能を使用してVS CodeでAzureリソースを直接管理する
    - [Dockerを使用したデプロイ](https://code.visualstudio.com/tutorials/docker-extension/getting-started?utm_source=VsCode&utm_medium=ReleaseNotes) - [Docker](https://marketplace.visualstudio.com/items?itemName=PeterJausovec.vscode-docker)拡張機能を備えたDockerコンテナを使用してWebサイトを展開する

## 変数置換リファレンス
- VS Codeがサポートする[変数リファレンス](https://code.visualstudio.com/docs/editor/variables-reference)の記述に、デバッグとタスクの設定ファイルでの変数置換（例えば`${workspaceFolder}`や`${file}`）を追加した。

## Vue.js用のVS Codeレシピ
- 一般的な[Vue.js](https://jp.vuejs.org/)フレームワークを使用するアプリケーション向けに[Chromeデバッガ](https://marketplace.visualstudio.com/items?itemName=msjsdiag.debugger-for-chrome)を設定するための[Vue.jsデバッグレシピ](https://github.com/Microsoft/vscode-recipes/tree/master/vuejs-cli)が追加された。

## 言語サーバプロトコルWebサイト
- 拡張機能開発者向けに、ドキュメント、LSP仕様、および現在の実装の一覧を提供する新しい[言語サーバプロトコルWebサイト](https://microsoft.github.io/language-server-protocol/)を作成した。

# [新しいコマンド](https://code.visualstudio.com/updates/v1_20#_new-commands)
- 「リファクタリング」　`Shift`+`Win`+`R`　コマンドID: `workbench.action.refactor`
    - 現在位置のリファクタリングコンテキストメニューを開く
- 「表示: エディターを１番目のグループに移動」　`Shift`+`Alt`+`1`　コマンドID: `workbench.action.moveEditorToFirstGroup`
- 「表示: エディターを２番目のグループに移動」　`Shift`+`Alt`+`1`　コマンドID: `workbench.action.moveEditorToSecondGroup`
- 「表示: エディターを３番目のグループに移動」　`Shift`+`Alt`+`1`　コマンドID: `workbench.action.moveEditorToThirdGroup`
- （リスト/ツリーの複数選択を下に伸縮）　`Shift`+`↓`　コマンドID: `list.expandSelectionDown`
- （リスト/ツリーの複数選択を上に伸縮）　`Shift`+`↑`　コマンドID: `list.expandSelectionUp`
- 「開発者: ログファイルを開く」　(キー未定義)　コマンドID: `workbench.action.openLogFile`
- 「開発者: ログフォルダーを開く」　(キー未定義)　コマンドID: `workbench.action.openLogsFolder`
- 「開発者: ログの表示」 (キー未定義)　コマンドID: `workbench.action.showLogs`
- 「開発者: ログレベルの設定」　(キー未定義)　コマンドID: `workbench.action.setLogLevel`
- （設定エディタでフォーカスされた設定を編集する）　`Ctrl`+`.`　コマンドID: `settings.action.editFocusedSetting`
    - 設定画面で検索後、Enter/Shift+Enterで項目のフォーカス移動ができるが、その時にこのコマンドを使うと現在フォーカスがある項目の編集が行える。
- コマンド`workbench.action.files.revealActiveFileInWindows`は、すでに使用可能なコマンド`revealFileInOS`の複製であり、今回のリリースで`workbench.action.files.revealActiveFileInWindows`コマンドを非推奨にし、次回リリースで削除する予定。
- コマンド`workbench.action.files.copyPathOfActiveFile`は、すでに使用可能なコマンド`copyFilePath`の複製であり、今回のリリースで`workbench.action.files.copyPathOfActiveFile`コマンドを非推奨にし、次回リリースで削除する予定。

# [注目すべき変更点](https://code.visualstudio.com/updates/v1_20#_notable-changes)
- [7893](https://github.com/Microsoft/vscode/issues/7893): ウィンドウ右下にあるニコちゃんマーク（フィードバックツイートボタン）を非表示にできるようにした
    - これそういうボタンだったのか！今回初めて押してみた！
- [16852](https://github.com/Microsoft/vscode/issues/16852): コマンドパレットで"error"や"warning"の入力で「問題の切り替え」「問題のフォーカス」コマンドが表示されるようにする
- [19707](https://github.com/Microsoft/vscode/issues/19707): Windowsで管理者として実行しているときにウィンドウタイトルに"(Administrator)"を付加する
- [31988](https://github.com/Microsoft/vscode/issues/31988): ウィンドウのクローズがキャンセルされた時にターミナルプロセスが終了してしまう問題の解消
- [34320](https://github.com/Microsoft/vscode/issues/34320): 異なるDPIのモニターを切り替えたときにターミナルのフォントが潰れてしまう問題の解消
- [35462](https://github.com/Microsoft/vscode/issues/35462): ファイルエクスプローラのカスタムビューの表示/非表示設定をすべてのウィンドウに対して有効にする
- [37589](https://github.com/Microsoft/vscode/issues/37589): 統合ターミナルで、複数のプロセスのデバッグができない問題の解消
- [39371](https://github.com/Microsoft/vscode/issues/39371): 再起動後にコールスタックがトップフレームしか表示されない問題の解消
- [39536](https://github.com/Microsoft/vscode/issues/39536): モーダルダイアログで非同期APIを使用するように変更する
- [39574](https://github.com/Microsoft/vscode/issues/39574): 実行時にすべてのログサービスのログレベルを変更できるようにする
- [39719](https://github.com/Microsoft/vscode/issues/39719): デバッガのウォッチパネルでダブルクリックすると新しいウォッチUIを表示する改善
- [40088](https://github.com/Microsoft/vscode/issues/40088): 拡張機能を無効にするアクションの提供
- [41071](https://github.com/Microsoft/vscode/issues/41071): 「ビューを開く」「Quick Open ビュー」でファイルエクスプローラのカスタムビューも開けるように改善
- [41759](https://github.com/Microsoft/vscode/issues/41759): VSIX拡張機能のインストール中にインストールステータスを表示する