開発ブログ

株式会社Nextatのスタッフがお送りする技術コラムメインのブログ。

電話でのお問合わせ 075-744-6842 ([月]-[金] 10:00〜17:00)

  1. top >
  2. 開発ブログ >
  3. 開発環境 >
  4. PhpStormでGitHub Copilotを使ってみた

PhpStormでGitHub Copilotを使ってみた

こんにちは、モリです。
今回は、最近利用しているGitHub Copilotの使い方の記事になります。
といいましてもGitHub Copilotの使い方を説明する記事は既にあるかと思われますので、自分の開発環境であるMacかつPhpStorm上での使い方についての備忘録的な記事となります。

また、GitHub Copilotの導入方法については割愛させていただき、基本的な使い方もしくは操作方法について紹介します。

環境

  • MacBook Pro
    • macOS Monterey
  • PhpStorm 2023.2
    • GitHub Copilot 1.2.21.2995
    • Japanese Language Pack / 日本語言語パック 232.172
    • 新しいUIの有効化 ON
    • コンパクトモード ON
  • PHP: 8.1
  • Laravel Framework: 10.11.0

基本の使い方

GitHub Copilotは、コードを書いているときに、そのコードの文脈に合わせて、コードを自動生成してくれる機能です。

実は、上の一文はGitHub Copilotが提案したものです。この記事はmd拡張子ファイルに文章を書いて作成しているのですが、文字を打ち込むと絶えず提案が出てきます。 タイトルや前後の文章などからそれらしい提案をしてくれているようです。

話がそれましたが、コード生成をしてみたいと思います。 今回はPHP言語で関数を作成したいので、下記のようにTestService.phpというファイルを作成し、適当な関数を途中まで書いてみます。

public function getOrderAmount()

このあたりまで書くと提案が表示されるので、確定するのであればTabキーを押します。
また、提案を表示させたくない場合は、Escキーを押すと消えます。
ちなみに、上記関数名で生成されたコードは以下になります。

public function getOrderAmount($order): int
{
    $amount = 0;
    foreach ($order->items as $item) {
        $amount += $item->price * $item->quantity;
    }
    return $amount;
}

このコードが自分の意図に沿っているかどうかというと、そうでないことが多くあります。
他に書きたいコードに類似するコードが存在すれば、より適切なコードが生成される可能性が高くなりますし、 関数の意図をより詳しくCopilotに伝える方法を利用することで改善する場合もあります(そちらについては後述します)。
したがって現状では、単純であるが面倒な処理に向いていると思います。
例えば、Eloquent ModelのPHPDocの生成や繰り返し似たようなコードがみられるテストコードの生成などです。

/**
class Department extends Model

このようにPHPDocを書き始めた状態で、提案されます。その結果が下記になります。 リポジトリ内のファイルから似たような記述を読み取り、自動生成されるため、自分で書くよりも早く生成できるので便利です。

/**
 * Class Department
 * @package App\Models
 * @property integer $id id
 * @property string $name 部署名
 * @property Employee[] $employees 社員
 * @property Employee $latestEmployee 最新の社員
 * @property Employee $oldestEmployee 最古の社員
 * @property Employee $highestEmployee 一番身長が高い社員
 */
class Department extends Model

その他の使い方(操作)

特定の状態で提案して欲しい時

提案をEscで却下したものの提案を再表示して欲しいときや、特定のカーソル位置で提案をはじめて欲しいときに使うコマンドがあります。 しかし、そのコマンドのショートカットはPhpStormのデフォルトのショートカット設定のままだとうまく動作しないことがあります。
画像1(キーマップ).png

デフォルトのキーマップは上記画像のようになっていると思われます。Copilot: Show Completionsが該当のコマンドになるので、「Option + \」がショートカットになります。
ただしお使いのMacの入力方法によっては、ただ「\」という文字を打ち込むだけになってしまうため、自分の好きなショートカットを新たに追加しておく必要があります。

ショートカットを正しく設定できれば、好きな場所で手動で提案を表示させることができます。

複数の提案から選択する

提案が表示されている状態で、その他の提案に変えたい場合は「Option + ]」を押すと、提案が変わります。 また、以前の提案に戻りたい際は、「Option + [」を押すと戻ります。

複数の提案を一覧表示させることもできます。
こちらはショートカットがデフォルトでは設定されていないので、ショートカットを設定しておきましょう。
キーマップのOpen GitHub Copilot が該当のコマンドになります。他のショートカットと競合しないように設定しましょう。

画像2(キーマップ).png

ショートカットを使わずに一覧表示させることもできます。
PhpStormの右上部分のGitHub Copilotアイコンをクリックすると一覧表示されます。
アイコンが表示されていない場合は、PhpStormのメニューから、表示 > ツールウィンドウ > GitHub Copilotを選択すると、一覧表示されます。

画像3(GitHub Copilotアイコン).png

提案の一覧表示は、以下のようになります。採用したいコードをAccept solutionをクリックすると、コードが挿入されます。

画像4(提案の一覧表示).png

コメントで詳しく指示を出す

コメントに生成してほしいコードの詳細を書くことで、より適切なコードを生成してくれるようになります。

// 従業員の取得
public function

上記コメントを一文書いた状態で生成されたコードは以下になります。

public function getEmployee($employeeId): ?Employee
{
    $employee = Employee::query()
        ->where('id', '=', $employeeId)
        ->first();
    return $employee;
}

より詳細に関数の作り方を指示してみます。(指示の出し方も提案してくれます)

// 従業員コレクションの取得
// 引数:部署IDと現在日時($now)
// 戻り値:Collection
// 仕様:部署IDで絞り込む
//    created_atが現在日時から1か月以内の従業員を取得する
//      身長が高い順に並び替える
public function

複数の提案の一つがこちらになります。

public function getEmployeeCollectionByCreatedAt($departmentId, $now): Collection
{
    $employeeCollection = [];
    $employees = Employee::query()
        ->where('department_id', '=', $departmentId)
        ->where('created_at', '>', $now)
        ->orderBy('height', 'desc')
        ->get();
    foreach ($employees as $employee) {
        $employeeCollection[] = $employee;
    }
    return $employeeCollection;
}

最後に

以上が、特定の環境におけるGitHub Copilotの基本の使い方になります。
今回はPhpStormでの紹介になりましたが、VSCodeではGitHub Copilot Labsという拡張機能があり、より便利な使い方ができるようです。PhpStormでも同様の拡張機能があればよいのですが、残念ながら現状は見当たりませんでした。
ただ、PhpStormは2023.2の新機能としてAI Assistantと呼ばれる機能が追加され、チャット形式でのコーディング支援をしてくれるようです。 AIの発展がめざましい昨今、今後もAIによるコーディングは進化していくと思われます。新しい技術に置いていかれず、うまく利用できるようにありたいですね。
以上となります。ありがとうございました。

TOPに戻る