AIエディターCursorを使い始める手順と基本的な使い方を、丁寧にまとめただけの記事。

# はじめに

この記事は、AI エディタ Cursor （カーソル）について、使い始めるまでの手順と基本的な機能を試した内容を、丁寧にまとめただけの記事です。:relaxed:

Cursor 使ってみたい、導入の手順やできることを確認したい、という場合には、ぜひ読んでみていただけると幸いです。

## 使ってみたきっかけ

私が Cursor を使ってみようと思ったきっかけは、こちらのエンジニア系 YouTuber 山浦清透さんの YouTube 動画です。

https://www.youtube.com/watch?v=m-iuemnHpCk&t=172s

動画の中で「革命的なツール」だという感想があり、山浦さんのワクワクが伝わってきて、これは使い始めておこうと思いました。

## 気になるポイント :eyes::dizzy:

**コードベース全体について AI に質問できる機能（[Codebase Answers](https://cursor.sh/features#codebase-wide)）** があり、特に気になっています。

普段は ChatGPT に課金して gpt-4 を利用しており、コーディングのために毎日のように利用しているのですが、コード全体を質問のたびに貼り付ける訳にもいかないため、Cursor であればその点かなり効率化されると期待しています。

## 目次

[1. Cursor を使い始めるまでの手順](#1-cursor-を使い始めるまでの手順)
　[1-1. ダウンロード](#1-1-ダウンロード)
　[1-2. 初期設定](#1-2-初期設定)
　[1-3. VSCode の拡張機能を使用](#1-3-vscode-の拡張機能を使用)
　[1-4. サインイン](#1-4-サインイン)
　[1-5. ログイン](#1-5-ログイン)
 
　[1-参考. Cursor での指定ファイルの開き方](#1-参考-cursor-での指定ファイルの開き方)
　[1-参考. 価格](#1-参考-価格)
　[1-参考. OpenAI キーでの利用開始手順](#1-参考-openai-キーでの利用開始手順)
 
[2. Basic 基本的な使い方](#2-basic-基本的な使い方)
　[2-1. :pencil: Command K](#2-1-pencil-command-k)
　[2-2. :speech_balloon: Chat](#2-2-speech_balloonchat)
 
[3. Advanced 応用的な使い方](#3-advanced-応用的な使い方)
　[3-1. :sparkles: @ Symbols](#3-1-sparkles--symbols)
　[3-2. :computer: Codebase Answers](#3-2-computer-codebase-answers) ← :eyes::dizzy:
　[3-3. :page_facing_up: Docs](#3-3-page_facing_updocs)
　[3-4. :bug: Auto-Debug](#3-4-bugauto-debug)
　[3-5. :tools: Fix Lints](#3-5-toolsfix-lints)

## 環境

- macOS Monterey 12.7.1 (MacBook Pro 2016)
- Cursor 0.20.2

## Cursor とは

AI を活用したコードエディタです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527226/b8cef63c-0750-4a10-06f2-68fb6fa8cf84.png)


エディタでは以下のようなことができます。

- コードについて AI とチャットできる
- 自動でエラー修正してくれる
- コード全体についての質問ができる
- ライブラリのドキュメントを追加して、より良い回答を得られる

# 1. Cursor を使い始めるまでの手順

まずは Cursor を使い始めるまでの手順をまとめます。

## 1-1. ダウンロード

ブラウザからダウンロードします。

https://cursor.sh/

「Download for Mac」を押すと、インストーラをダウンロードできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527226/b8cef63c-0750-4a10-06f2-68fb6fa8cf84.png)

## 1-2. 初期設定

ダウンロードしたインストーラを起動します。

以下のような初期設定の画面が開きますので選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527226/f041703e-0013-6c47-ebe6-4ed724c91360.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527226/6259865d-7f64-779b-d9b0-fb25b06d118e.png)


## 1-3. VSCode の拡張機能を使用

VSCode の拡張機能を使用するかの確認があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527226/debf6fdb-26fa-f1a6-c641-2be78e518f8a.png)

（しばらく待ちます。）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527226/ca2c211b-094c-5290-ab80-f2f560af30f8.png)

結構待ちましたが、VSCode で使用していた拡張機能をそのまま持ってくることができました。

## 1-4. サインイン

ブラウザでサインインします。

https://cursor.sh/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527226/5e0936f0-b52f-e841-e583-770b8bbcee86.png)

私の環境では VSCode の拡張機能のセッティングに時間が 20 分以上かかったのでその間にサインインしました。

## 1-5. ログイン

サインインが完了していれば、「Log in」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527226/c7c52dbb-9d19-111c-d7e3-b45a50098d32.png)

以下の通り、初めて起動した画面はサンプルプロジェクトが開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527226/2fbd4ef4-4d92-c1ac-95e7-254af6b47ccc.png)

見た目は VSCode とほぼ変わらないですね。どちらのエディタを開いているか見間違えるレベルです。

## 1-参考. Cursor での指定ファイルの開き方

セッティングの時に cursor コマンドをインストールしていれば、ターミナルから、 Cursor エディタで任意のプロジェクトファイルを開けるようになっています。

```bash
$ cursor .
```

過去に作成したブラックジャックゲームをサンプルファイルとして開いてみます。

```bash
# r_yamate @ mbp in ~/development [11:08:08]
$ git clone https://github.com/ryamate/php-oop-cli-blackjack.git
Cloning into 'php-oop-cli-blackjack'...
remote: Enumerating objects: 446, done.
remote: Counting objects: 100% (54/54), done.
remote: Compressing objects: 100% (46/46), done.
remote: Total 446 (delta 8), reused 19 (delta 8), pack-reused 392
Receiving objects: 100% (446/446), 3.85 MiB | 9.80 MiB/s, done.
Resolving deltas: 100% (246/246), done.

# r_yamate @ mbp in ~/development [11:08:20]
$ cd php-oop-cli-blackjack

# r_yamate @ mbp in ~/development/php-oop-cli-blackjack on git:main o [11:36:13]
$ cursor .
```

https://github.com/ryamate/php-oop-cli-blackjack

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527226/3103c537-1874-c344-f90c-ca0a7ff86482.png)

ファイルを開くことができました！

## 1-参考. 価格

以下の通り、無料で利用開始ができます。

https://cursor.sh/pricing

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527226/d24a8e0f-e8f9-62aa-442d-bb6d2ade45bd.png)

無料だと、少なめの回数制限があるので、メインのエディタとして使うようになったら Pro に変更する必要がありそうです。

## 1-参考. OpenAI キーでの利用開始手順

無料枠以上に使いたいけどサブスク（Pro での有料利用）はちょっとまだ判断しかねる…という場合は、OpenAI キー利用で様子見する方法があります。

https://platform.openai.com/api-keys

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527226/fc39baef-ddc4-7b0a-9a9f-378d1f215c66.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527226/181b9f05-68fa-2e71-0045-401afef221aa.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527226/570d3174-e9fe-9565-70ae-0bdc43aedb90.png)

# 2. Basic 基本的な使い方

続いて、基本的な使い方を以下のページを参考に利用してみます。

https://cursor.sh/features

## 2-1. :pencil: Command K

### `Cmd+K` で編集したい行に AI を適用！

テキトーに編集を指示してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527226/dcd04107-8981-91a1-0b9b-e8385bd8d588.png)

範囲選択すると、`Edit ⌘K` `Chat ⌘L` と表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527226/052b0a0c-df14-2d38-67d5-29b24ad03a9f.png)

`Cmd+K` を押すと、フォームが出てくるので、編集指示をしてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527226/5bce3d5e-1f41-e64d-57bf-5ae5201d6c7d.png)

`Cmd+Y` を押したら変更が反映されます。（`Cmd+N` を押したら変更されません。）

```php
/** array<int,string> 各カードのマーク */
private const SUITS = [
    '♠',
    '♥',
    '♦',
    '♣',
];
```

## 2-2. :speech_balloon: Chat

### `Cmd+L` で AI チャット！

今度はファイル内のコードを全選択して、`Cmd+L` を押してみます。

> PHPDocを編集してください。
> 

と依頼したところ、詳細なPHPDocの編集内容を提案してくれました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527226/17eec327-693b-eecf-0613-1ceee9987b47.png)

回答のコードブロックで `▷` を押すと、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527226/cf3ebebe-ea65-3b7b-7d1e-2eac43939dc9.png)

ファイルに反映することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527226/0868e6ff-b2fe-a16a-3be2-bc38087c05bb.png)

# 3. Advanced 応用的な使い方

## 3-1. :sparkles: @ Symbols

### `@` でファイルなどを指定！

AI チャット（`Cmd+L`）での質問時に入力ボックスで `@` を入力すると、ファイルなどを指定でき、効率的に AI に伝えることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527226/27b119c8-d2e5-922a-58cd-24e0d0a13bc0.png)

## 3-2. :computer: Codebase Answers

### コード全体に対して AI に質問！

Codebase Answers を使用すると、コード全体に対して AI に質問できます！

こちら気になっていた機能です。

使用するには、AI チャット（`Cmd+L`）での質問時に入力ボックスの`with codebase` ボタンをクリック（もしくは `Cmd+Enter` 入力）します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527226/938fb192-590d-5c55-0686-38a9c7710030.png)

コード全体を見ないと回答できないような質問をしてみます。

💬 **質問**

コード全体のクラス設計について見直すべき点を提案してください。

🤖 **回答**

> 全体的に、クラス設計は適切に行われていますが、いくつか改善できる点があります。
> 
> 1. **単一責任の原則**: 一部のクラスが複数の責任を持っているように見えます。例えば、Gameクラスはゲームの進行、プレイヤーのアクション、勝敗の判定など、多くの責任を持っています。これらの責任をより具体的なクラスに分割することを検討してみてください
> 2. **依存性の注入**: Gameクラスは、DeckやDealerなどの他のクラスのインスタンスを直接作成しています。これはテストを難しくし、クラス間の疎結合を阻害します。これらの依存関係をコンストラクタまたはセッターを通じて注入することを検討してみてください
> 3. **テストの改善**: GameTest.phpにはテストが書かれていません。各クラスのメソッドが期待通りに動作することを確認するために、ユニットテストを追加することを強くお勧めします
> 4. **インターフェースの使用**: PlayerBetやPlayerActionなどのインターフェースが定義されていますが、これらはPlayerクラスに直接統合することを検討してみてください。これにより、Playerクラスのサブクラスがこれらのメソッドを実装することを強制できます
> 
> 以上の改善点を踏まえて、以下のようなクラス設計を提案します。
> 
> - Gameクラス: ゲームの進行を管理します。依存性を注入するためのコンストラクタを追加します
> - Playerクラス: プレイヤーのアクションとベットを管理します。PlayerBetとPlayerActionインターフェースを統合します
> - Dealerクラス: ディーラーのアクションを管理します
> - Judgeクラス: 勝敗の判定を管理します
> 
> 具体的なコードの変更は以下の通りです。
> 
> ```php
> class Game
> {
>     private $deck;
>     private $dealer;
>     private $players;
> 
>     public function __construct(Deck $deck, Dealer $dealer, array $players)
>     {
>         $this->deck = $deck;
>         $this->dealer = $dealer;
>         $this->players = $players;
>     }
> 
>     // その他のメソッド...
> }
> 
> abstract class Player implements PlayerAction, PlayerBet
> {
>     // その他のメソッド...
> }
> 
> ```
> 
> これらの変更により、クラス設計はより堅牢でテスト可能になり、各クラスの責任が明確になります。
>
テストとしての質問なのでまだまだ試してみないとなんとも言えませんが、全体としての改善点などを見つけてくれそうで、期待できそうです。

## 3-3. :page_facing_up: Docs

### ドキュメントに基づいた回答！

Docs 機能は、AI のサードパーティライブラリの理解を向上させ、チャットや `Cmd+K` で、`@LibraryName`や`@Add`を入力することで、ドキュメントの使用やカスタムドキュメントのクロール（Web サイトやドキュメントから自動的に情報収集）することが可能です。

`Cmd+K` で、`@` を入力し、Docsをクリックして、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527226/3ae8695f-3cc7-5190-ee6e-4f0775f854c4.png)

「+Add new doc」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527226/e276e91b-a290-a921-a296-660762da72fc.png)

試しに、Qiita API のドキュメントを追加してみます。

https://qiita.com/api/v2/docs

URLを貼り付けます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527226/533b0154-6fca-1aa5-ce3a-55358d88c717.png)

Confirm を押します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527226/1621a1ab-ce14-9218-c7dc-caff0845375b.png)

追加されると、`@` → Docs で選択できるようになっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527226/20d4c220-15ea-06c8-1dd6-027999064f17.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527226/5dfd2cff-7873-e4b1-19b0-7073b57d6bdd.png)

これで選択したドキュメントを踏まえて回答をしてもらえるようになりました。

例えば今回参考に追加した Qiita API であれば、API を呼ぶコードを実装する際にはドキュメントに基づいたコードを提案してくれるようになります。

## 3-4. :bug: Auto-Debug

### 自動でエラー修正！

わざとバグを起こすために 8 行目の `;` を削除して、

```php
<?php

namespace Blackjack;

require_once('lib/Game.php');

$game = new Game();
$game->play()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527226/dd3f31c6-aa92-ba95-f78a-63c5070d073f.png)

ファイルを実行してみます。

```bash
$ php src/Main.php
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527226/16ae8300-f269-c6e4-87f1-1c96cf89d046.png)

「Debug with AI」の緑のボタンをクリックすると、自動でデバッグして、エラーを特定してくれます。

## 3-5. :tools: Fix Lints

### Lint エラーを修正！

任意の Lint エラーにカーソルを合わせて、表示される青い「Fix」ボタンをクリックすると、修正案がチャットに表示されます。

（まだ試せてません。が、機能としては想像できるので割愛します。）

# おわりに

AI エディタ Cursor （カーソル）について、使い始めるまでの手順と、基本的な機能を試してみた内容をまとめました。

使ってみた感想としては、期待の [Codebase Answers](#3-2-computer-codebase-answers)（コード全体に対して AI に質問！）と、[Docs](#3-3-page_facing_updocs)（ドキュメントに基づいた回答！）がかなり使えそう！という感想です。

仕事では使わないようにしているため、慣れる機会がまだ少ないですが、個人開発では積極的に使っていきたいと思っています。

ありがとうございました。