VSCodeのGitHub Copilotが色々便利になっていた件

## はじめに
知らない間にGitHub Copilotが結構進化していたので、それらの内容を紹介します。
GitHub Copilot Chatは知っていたのですが、単なるChatGPTみたいな会話機能を追加しただけだと思っていました。

:::note warn
IDEはVSCodeを前提としています。
:::

## 要約
- 右クリックメニューや`#file`のようなコマンドが登場し、それを入力するだけでChatに見てほしいコンテキストを伝えることができるようになった。
  - ファイル単位だけでなく、選択した行やブロックに限定することもできる。
- テストコードや新しいプロジェクトをコマンド一つで生成できるようになっている。
- 推薦の候補も複数を同時に比較できるようになった。
  - 一度に最大10個くらい出る上、タブで保管できる。
- ターミナルや編集中のファイルからコマンド一つでChatを立ち上げることができる。
  - 特別なプロンプトを入力しなくても、開いた場所の文脈を読み取ってくれる。

## 右クリックメニューが充実している
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3863109/fdab6e22-3f92-2a67-384b-12b3b990470d.png)
右クリックで色々できることが増えています。この画像は、編集中のファイルで右クリックをしたときに出てきたものです。
Copilotに参照してほしいファイルを渡したり、ドキュメンテーションやテスト生成がワンクリックで出来るようです。下記に6つの項目の詳細を解説します。

### 1. ファイルをチャットに追加
この項目をクリックすることで、現在開いているファイルをCopilot Chatに参照するようにできます。
複数のファイルを読み込ませることもできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3863109/653b08ca-543d-b59e-1b61-2451760d1b0c.png)
個人的には、MVCモデルでModelを参照させつつ、Controllerに新機能を書く場合などに役立っています。

### 2. エディターで開始する
クリックするとCopilot Chatのポップアップウィンドウが出ます。
`⌘ + i`, `Ctrl + i`のショートカットで出せるため、カジュアルにCopilot Chatを利用できるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3863109/6117f21d-0807-46d6-b5f4-cae9c0757353.png)
ターミナルでも出すことができるのも便利です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3863109/2fa3b8ee-b5a4-bd2d-ba2d-66dd712ac6b5.png)
おかげさまで、基本的なコマンドをググることがほとんどなくなりました。

### 3. これを説明する
今開いているコードをCopilotに説明してもらうことができます。
コードブロックやマークダウンのセクションなどの単位で、今画面に表示されているブロックに絞って解説する範囲を限定することもできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3863109/54418a23-7919-7fa6-c03b-ed78cd5a3bdf.png)
フレームワークやプロジェクト固有の設定ファイルや、ベンダーファイルの説明は特にありがたいです。

### 4. これを修正する
警告やエラーとなっている箇所の修正を提案してくれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3863109/9470090d-2302-7fa0-6410-ef5a8587b860.png)
使ってみたところ基本エラー対応に限定されている感じで、クイックフィックスもCopilotが対応してくれるので、正直あんまり使い所はない気がします、、、

### 5. ドキュメントを生成する
下記のようにコメントを書いてくれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3863109/8bcba19c-d566-a5f0-d807-f19a527ab94d.png)
**選択されている範囲だけコメントする**点にご注意ください。 
「関数内部のコメントは不要です。」というプロンプトを入力してEnterを押したところ、関数だけのドキュメンテーションをしてくれました。クリップボードツールにカスタムプロンプトを入れておくと捗りそうな雰囲気です。

クリックしたら既存のコードを書き換えるため、既存のドキュメントを修正する場合は、範囲を選択して`⌘ + i`, `Ctrl + i`でCopilotのエディターを開始して *「英語を日本語に」* などのプロンプトを入れる方が便利だなと感じました。
また、`⌘ + Enter`や`Ctrl + Enter`で提案を受け入れることができるため、まとめてAcceptするときに便利です。

### 6. テストを生成する
ワンクリックでテストを生成してくれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3863109/efdc52a8-17b5-41c4-1a31-f5baf9c3fc64.png)
画像赤丸部分を押すと新しいタブに提案を書き出してくれるので、保存すればテストを作成できます。
追加のプロンプトを書いたときレスポンスが来たことがなかったので、Copilot Chatを立ち上げて書いたほうがいいかもしれません。

## 変数名やコミットメッセージも提案してくれる
変数名の変更時にF2を押すと新たな変数名も提案してくれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3863109/df896a52-8657-066b-0aee-dd2a7689bba1.png)
`⌘ + Enter`や`Ctrl + Enter`を押すと変更箇所のプレビューもしてくれます。

コミットメッセージは、下記の赤丸部分をクリックするとコミットメッセージを自動で生成してくれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3863109/1bfbe9c8-d177-bc78-a208-0e8b47ba3d90.png)
過去のコミットを参考にしてくれるため日本語にあわせてくれましたが、ドキュメンテーションしただけなのにテストケースを新しく追加したような文言になってしまっています、、、

なお、アイコンをクリックすると何度でも新しいコミットメッセージを提案してくれます。
途中で書かれたコミットはCopilotが参考にすることはなく、完全に上書きされるようです。

## 入力候補を複数表示できる
入力後の推薦が出たタイミングで`⌘ + Enter`や`Ctrl + Enter`を押すと新しいタブを立ち上げ、他の推薦をすべて表示してくれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3863109/81b5bc6d-63de-88dd-2fd1-06c82c5473e6.png)
Goのテストを新しいタブで立ち上げたときに、１０個のテストコードを提案してくれました。
これの素晴らしいところは、ショートカットキー一つで**何度でも新しいタブで複数の提案をしてくれる**ところで、上の画像の別タブでも１０個の異なる提案をしてくれています。
今回紹介した機能の中で、個人的に一番気に入っています。

詳細や他の細かいAccept方法については、下記の公式ドキュメントをご覧ください。

https://docs.github.com/ja/copilot/using-github-copilot/getting-code-suggestions-in-your-ide-with-github-copilot?tool=vscode

## キーワードで見てほしいコンテキストをCopilot Chatに指定できる
GitHub Copilot Chatを開いているときに`⌘　 + /`や`Ctrl + /`を入力すれば「コンテキストのアタッチ」が立ち上がり、Chatに見てほしいファイルやコンテキストを指定することができます。

### コンテキストのアタッチについて
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3863109/3e9da038-3c8a-ea2e-931e-1eecefa45c7b.png)
最近開いたファイルも一覧に出してくれるため、使いやすいです。
なお、Chatのクリップマーク（画像の赤丸部分）を押しても同じ画面を出せます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3863109/82c17d58-4e8e-aed4-6e98-da8496f66857.png)
画像にある上４つの項目は主に選択箇所のみを解説するといった、ファイルの一部分だけをコンテキストとして渡したい際に利用するものです。
- `selection`: 現在選択しているコードをChatに参照させる（あらかじめ選択してからこの項目をクリックする必要があります）
- `Terminal Selection`: 現在選択しているターミナルをChatに参照させる（こちらも選択する必要があります）
- `VS Code API`: [VSCodeのAPIリファレンス](https://code.visualstudio.com/api)を使用して、VSCode拡張機能の開発に関する質問に回答する。
- `シンボル`: 選択したシンボルをChatに参照させる。

`VS Code API`は拡張機能の開発時以外でも、 *「インデントをスペース２つにしたい」* というようなVSCodeのメタ的な設定方法を教えてくれたりします。`VS Code API`がない場合は開いているファイルのインデントを修正したコードを掲示しただけでした。質問に答えるだけで、ファイルの編集や作成などを自動でやってくれないのは歯がゆいです、、、

`シンボル`は変数や関数などのブロックごとにまとめたものです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3863109/c073a7b8-b70b-6b46-8a2d-b797b297fa1d.png)
ワークスペース内の全シンボルを検索することができます。

### スラッシュコマンドやチャットコンテキストを利用する
GitHub Copilot Chatでは、`/`や`@`、`#`を利用することでもChatに参照してほしい情報や特定の指示を指定できます。

個人的には`#file`で参照してほしいページをすべて入れて、テストや新しいAPIを生やすのがおすすめです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3863109/97cb41ce-c844-7430-b819-e62808d72f3a.png)
`#file`を選べば検索のポップアップが出てくれるのでスムーズです。

下記のURLにすべてのコマンドがあります。

https://code.visualstudio.com/docs/copilot/copilot-chat#_slash-commands

なにげに`/clear`が便利です。今まではチャットの☓ボタンを連打してました。
`/new`で新しいプロジェクトをファイル付きで作成できたのは面白かったですが、フォルダをネストできないのと、返信が前回の会話を覚えてくれないので、小規模のプロジェクトなどに用途が限定されるイメージです。

## アップデートされた機能を使ってみて
GitHub CopilotはIDEと連携しているのに、コンテキストの参照がなんでこんなにもややこしいのだろうと思っていたのですが、アップデート機能を追いかけたらだいぶ楽になりました。
コーディングの生成AI利用はほとんどChatGPTに頼っていたのですが、半々くらいにはCopilotも活躍してくれています。

## まとめ
- Chatに参照してほしい文脈を伝える方法が整備されてきた。
    - 範囲選択も影響があるので使い分けると便利。
    - 編集中のファイルやターミナルからChatを開くことができ、文脈も読み取ってくれる。
- コミットメッセージや変数もCopilotが提案してくれる。
- 推薦候補をショートカットキーで安定して生成できる。
- 特定のコマンドは過去の文脈を参照してくれないので注意が必要。