VS Code 1.16 の新機能のリリースノートをそれとなく眺めてみる

Visual Studio Code の バージョン 1.16 がリリースされたので、リリースノートを眺めてみてどんな機能が追加されたのか見てみる。1.15の時のやつは[こちら](https://qiita.com/12345/items/cebf4b4e9bfb2d2ef771)。

# [ワークベンチ関連](https://code.visualstudio.com/updates/v1_16#_workbench)
## 検索結果と問題パネルからのドラッグ&ドロップ
- 今まで、ファイルエクスプローラーからファイルをエディタにドラッグ&ドロップするとファイルが開いたが、その動作を検索結果からでもできるようになった。
- ドラッグ時にエディタのグレーエリアがエディタ全体の場合はそのエディタグループにドロップされ、グレーエリアが半分になっている状態でドロップすると新しいエディタグループにドロップされる。
- 同様に問題パネルからもできるようになった、らしい。

##ドラッグ&ドロップでフォルダを開く
- 今までは、外部のエクスプローラーなどからフォルダをドラッグ&ドロップしてフォルダを開く際、画面のどこにドロップしてもフォルダが開いたが、それが今回、エディタのエリアにドロップしないとフォルダが開かないように挙動が変更された。
- vscodeのフレームワークである`Electron`のアップデートの影響と、将来的に採用される予定のマルチルート機能を見据えての変更、らしい。

## 拡張機能のホストプロセス
- vscodeは、拡張機能が別々の拡張機能ホストプロセスで実行されるマルチプロセスアーキテクチャを使用する。ワークベンチは、拡張機能ホストプロセスの予期しない終了から正常に回復することができる。すべてのUI要素と拡張機能によって駆動される状態は削除される。拡張ホストが再起動された場合はすべて正常に戻る。
- 例えば、エディタで編集作業中に拡張機能ホストプロセスを終了させると、基本的な編集は引き続き実行される。その後、単語の補完リストを表示させた状態で拡張機能ホストを再起動させると、補完リストは拡張機能に対応した本来の補完リストの表示に切り替わる。

## 配色テーマの改善
- `tab.activeBorder`など、配色テーマで指定可能な項目がいくつか増えた。
- すべての色のリストはこちら。https://code.visualstudio.com/docs/getstarted/theme-color-reference

# [エディタ関連](https://code.visualstudio.com/updates/v1_16#_editor)
## ディスク上のファイルが変更されたときにスタックを元に戻す
- vscodeで現在開いているファイルが別アプリで変更された時、その変更内容をvscode側でundoできるようになった。

## スムーズなスクロール
- 新たな設定項目 `editor.smoothScrolling` を true にすると、PageUp/Downや次の検索結果の表示時などに、いきなりジャンプするのではなく、そこまでスクロールするアニメーション表示になる。

## Emmetのサジェストをスニペットとして表示
- Emmetとスニペットの候補が同時に表示されるときに、新しい設定項目 `emmet.showSuggestionsAsSnippets` を true にすると、Emmetのサジェストもスニペットとしてリストに表示されるようになる（アイコンがスニペットのものに変わっている）。

## Emmetの設定
- Emmetのバージョンが2.0になり、設定項目`emmet.preferences`が廃止されていたが、今回、いくつかの項目についてはサポートが復活した、らしい。

## スニペット変数の追加
- スニペットの定義の中で使用可能な変数として、拡張子なしのファイル名を表す`$TM_FILENAME_BASE`が新たに追加された。

## 点字サポート
- Windowsマシン上でスクリーンリーダーの`NVDA`を使用している場合、接続している点字ディスプレイからvscodeのカーソル移動ができるようになった、らしい。

# [統合ターミナル関連](https://code.visualstudio.com/updates/v1_16#_integrated-terminal)
## クイックオープンの改善
- 統合ターミナルのクイックオープン(Ctrl+P後`term+スペース`)を行うとき、既存ターミナルの一覧の他に新規統合ターミナルを開く選択肢も表示されるようになった。
- また、既存の統合ターミナルのインスタンスを停止するゴミ箱アイコンも表示されるようになった。

## LinuxとWindowsでのShiftキーでの強制選択
- マウスで選択操作をしようとしたときに、`tmux`などのツールを使用しているとマウス操作が横取りされてしまい選択操作ができない場合の対処として、Shiftキーを押しながら操作すると選択ができるようになった。
- v1.15でmacOSのAltキーで実装された機能のLinux/Windows版。

## 検索機能の改善
- 統合ターミナル内での検索機能で、過去に検索した履歴を、ALt+↑/↓で参照できるようになった。
    - ただしvscodeを終了させてしまうと履歴も消えてしまう。
    - 統合ターミナル以外の検索窓でも同様に履歴表示できるようになった。

# [言語関連](https://code.visualstudio.com/updates/v1_16#_languages)
## HTMLの閉じるタグの自動入力
- HTMLエディタで、開始タグを入力すると、それに対応する閉じるタグが自動的に入るようになった。
- 開始タグが書かれていて対応する閉じるタグがまだ書かれていない状態で、`</`をタイプすると閉じるタグが入るようになった。ちなみに今までのバージョンでもこの状態で`<`をタイプするとEmmetで閉じるタグの候補が表示される。
- この挙動が気に入らない場合は設定 `html.autoClosingTags` を falseにすれば自動設定は行われなくなるが、それでもEmmetの入力候補は表示される。

## HTMLでもカラーピッカー
- 前回のバージョンアップでCSSファイルにサポートされたカラーピッカーがHTMLファイルでもサポートされるようになった。

## TypeScript2.5
- vscodeに含まれるTypeScroiptが2.5.2になり、いくつかの機能追加やバグ修正が行われた。
    - JavaScript/TypeScriptのリファクタリング
        - 範囲を選択して表示される電球アイコンをクリックするかCtrl+.を押すと選択肢が表示される。
    - JSdocの型アサーション
        - JavaScriptファイルの中でJSdocの型アサーションを書けるようになった。
    - より良い緩やかなJavaScript/TypeScriptファイルの分離
        - jsconfig.jsonまたはtsconfig.jsonプロジェクトに含まれていない緩やかなJavaScriptおよびTypeScriptファイルは、ルートフォルダごとに暗黙のプロジェクトに分割されるようになった。
        - 以前は、ワークスペース内のすべてのルートフォルダにある緩やかなファイルが同じ暗黙のプロジェクトにグループ化されていた。
        - この変更は、別のフォルダにあるJavaScriptファイルに表示されている1つのJavaScriptフォルダ内のファイルからの候補が表示されなくなることを意味する。
        - らしい。
    - Markdownプレビューリフレッシュコマンドの追加
        - Markdownのプレビューをリフレッシュする`Markdown: Refresh Preview`コマンドが追加された。
        - Markdownに表示している画像ファイルが外部で変更された時とかに使うらしい。
    - CSS/JSONカラープレビュー設定の項目変更
        - インラインカラープレビューレンダリングがCSS/JSON拡張からVSコードコアに移行され、それに伴い、今までの4つの設定が1つに統合された、らしい。
            - 廃止：`css.colorDecorators.enable`、`sass.colorDecorators.enable`、`scss.colorDecorators.enable`、`json.colorDecorators.enable`
            - 新規：`editor.colorDecorators`

# [ソース管理関連](https://code.visualstudio.com/updates/v1_16#_source-control)
## 複数のソース管理プロバイダ対応
- 複数のソース管理プロバイダを同時にサポート可能になった。
- 将来、マルチルートワークスペースがサポートされたときに、複数のプロジェクトが複数のソース管理プロバイダを使用する可能性があるため。

# [ドキュメント関連](https://code.visualstudio.com/updates/v1_16#_new-documentation)
- node.jsデプロイチュートリアルの更新
    - [Node.js Deployment to Azure](https://code.visualstudio.com/docs/nodejs/nodejs-deployment)チュートリアルが更新され、クラウドでアプリケーションをすぐに実行できるようになった。
- 新しいEmmetトピックの追加
    - vscodeドキュメントの[Emmetトピック](https://code.visualstudio.com/docs/editor/emmet)にいくつか情報が追加された。
- vscodeレシピリポジトリ
    - vscode用のレシピ集めたリポジトリを5月から始めた。
    - そのリポジトリが引っ越しした。https://github.com/Microsoft/vscode-recipes
    - vscodeでReact,Angular,Dockerを使用する場合のサンプルを見ることができる。

# [拡張機能開発関連](https://code.visualstudio.com/updates/v1_16#_extension-authoring)
## 新しいElectronはinspectorプロトコルのみサポート
- アップグレードされたElectron1.7では、組み込み版のnode.jsは`legacy`の代わりに`inspector`プロトコルのみをサポートするようになり、それにより以下のような変更が入った。
    - 拡張機能のデバッグで、拡張機能がアクティブになった時点で初めてブレークポイントが検証済みになる。
    - Chromeのデベロッパーツールと連携して拡張機能のプロファイリングが行えるようになった。

## キャッチされなかったエラーの処理
- 将来的な機能のために、拡張機能においてキャッチされなかったエラーにそれぞれの拡張IDを付けるようになった。

## 拡張機能での配色テーマ
- 拡張機能で配色テーマを取り扱えるようになった？
- 一度定義したものはユーザーが設定`workspace.colorCustomization`(`workbench.colorCustomization`の間違い？)で色をカスタマイズできる。

## ソース管理APIの更新
- `scm.inputBox`経由でソース管理ビューの入力ボックスにアクセスする方法は廃止され、`SourceControl.inputBox`の使用が推奨されるようになった。
- これは、各ソース管理プロバイダが独自の入力ボックスを持つことができるマルチルート機能に関連している。
- 多くのソース管理プロバイダが同時にアクティブになる可能性があるため、グローバルscmProviderコンテキストキーは設定されない。

## デバッグAPIの更新
- `initialConfigurations`と`startSession`コマンドが非推奨となり、10月リリース分で削除予定。
- 代わりに、特定のデバッグタイプ用に登録された`DebugConfigurationProvider`の使用が提案されている。
- この提案を使用するには、`package.json`に`enableProposedApi:true`を追記する必要がある
- `vscode.startDebug`コマンドが非推奨となり、10月リリース分で削除予定。代わりに7月リリース分で導入された`vscode.debug.startDebugging`APIを使用する。
- `vscode.workbench.customDebugRequest`コマンドが非推奨となり、10月リリース分で削除予定。代わりに7月リリース分で導入された`DebugSession.customRequest`APIを使用する。

## package.jsonでのデバッグ機能
- 7月リリース分で非推奨になった、`package.json`内での`program`と`debug`の変数置換が今回削除された。
- `startSessionCommand`が非推奨となり、10月リリース分で削除予定。代わりに`DebugConfigurationProvider`型の`resolveDebugConfiguration`メソッドを使用する。
- `provideDebugConfigurations`メソッドの導入により不要となった、コマンドIDを指定する機能も非推奨となり、10月リリース分で削除予定。

## デバッグアダプタプロトコル
- `Output`イベントタイプに`source`、`line`、`column`属性が追加され、これにより、フロントエンドは、出力が生成されたソースへのリンクを表示することができる。が、まだこの機能はUIではサポートされていない。
- ロードされたスクリプトの取得（`LoadedSourcesRequest`）とロードされたスクリプトイベントの受信（`LoadedSourceEvent`）のサポートが追加された。が、まだこの機能はUIではサポートされていない。
- `VariablePresentationHint`クラスによる変数と評価結果のヒント表示が追加された。が、これらのヒントはUIではまだ利用されていない。

## マーケットプレイスでのREADME表示方法の変更
- マーケットプレイスでの拡張機能のREADMEのレンダリングを、vscodeでの拡張機能のREADMEのレンダリングと同じ`markdown-it`ライブラリを使用するようになった。

## 拡張機能開発者向けマルチルートワークスペース情報
- 拡張機能をマルチルートワークスペースに対応させるためのガイドが作成された。
    - https://github.com/Microsoft/vscode/wiki/Extension-Authoring:-Adopting-Multi-Root-Workspace-APIs
- ただし現時点では、マルチルートワークスペースはインサイダーリリースでのみ有効。

# [マルチルートワークスペース関連(プレビュー)](https://code.visualstudio.com/updates/v1_16#_preview-multi-root-workspaces)
- マルチルート機能は現時点ではInsiderビルドでのみ使用できる。https://code.visualstudio.com/insiders
- 単一のVScodeウィンドウ(インスタンス)で複数のフォルダを開くこの機能は、前回のリリースでプレビューされた。

## マルチルートワークスペースへのスムーズな移行
- 空のワークスペースまたは単一フォルダのワークスペースの状態でワークスペースを追加してマルチルートに移行する際の下記のような現象が改善された。
    - 保存されていないファイルがあると移行できない
    - すべてのUI状態が失われる

## マルチルートワークスペースの作成
- コマンドライン起動の場合、`-add`引数でパスを指定することによってワークスペースが追加される。
- コマンドライン起動で複数のパスを指定した場合、別々のウィンドウで開いていたが１つのウィンドウで表示されるようになった。
- フォルダをドラッグ&ドロップでvscodeのウィンドウにドロップすると別々のウィンドウが開くことがあったが、1つのウィンドウで開くようになった。

## ネイティブプラットフォームのファイルを開くダイアログ
- ファイルを開くダイアログで複数のフォルダを指定した場合に、すべてのフォルダが一度にワークスペースに開くようになった。
- macOSのドックのアプリケーションアイコンに複数のフォルダをドロップした場合も同様。

## 新しいワークスペースファイルフォーマット
- 以前は`id`プロパティによってワークスペースを識別していたがそれがなくなり、パスによって識別するようになった。
- また、フォルダーパスの形式としてファイルリソースを使用することをやめ、単にパスを使用するようになった。
- さらに、ワークスペースファイルが保存されているフォルダーに対して相対フォルダーパスが適用され、ワークスペースファイルの場所がフォルダの親であることが検出された場合、相対パスとして自動的にパスが保存され、それ以外の場合は絶対パスが使用される。

## マルチルートワークスペースの変更
- マルチルートワークスペースで作業する場合、次の組み込み言語がフォルダ固有の設定をサポートするように変更された。CSS, Sass(SCSS), Less, JSON, HTML。
- 次のマイクロソフトの拡張機能が変更された。ESLint, TSLint, Go。

## マルチルートと言語サーバプロトコル
- マルチルートワークスペースをサポートするために提案されたプロトコルが言語サーバプロトコルに追加された。
- vscode言語クライアントとvscode言語サーバーの両方が、提案されたプロトコルをサポートするように更新された。
- さらに、vscodeの言語クライアントは、ワークスペースフォルダごとのサーバーをサポートするように拡張された。

# [その他](https://code.visualstudio.com/updates/v1_16#_miscellaneous)
- このリリースでは、Electronのバージョンが1.6.6から1.7.3に更新された。
- これにより、Chromeのアップデートがバージョン56から58に、Node.jsが7.4から7.9に変更された。

# [注目すべき変更](https://code.visualstudio.com/updates/v1_16#_notable-changes)
- Windows版で隠しファイルの保存ができない不具合の解消
- ファイルエクスプローラでAlt+クリックでサブツリーを完全に折りたためるようになった
    - フォルダによってはうまく動作しない場合もある？(Windows版)
- DPIが異なる複数モニタ対応
- マルチルート設定での`files.eol`対応
- 統合ターミナルでユニコードが含まれたファイルをcatするとターミナルがハングする不具合の解消
- アイコンの形が壊れる不具合の解消
- macOSで中国語/日本語IME変換中にバックスペースで最後の1文字を消去できない不具合の解消
- `terminal.integrated.rightClickCopyPaste`が64bit版で動作しない不具合の解消