Bootstrap

[笔记] Cursor 全面指南:将AI融入代码编辑,免费使用。

Cursor 全面使用指南

随着人工智能技术的迅速发展,编程辅助工具也迎来了革新。Cursor 是一款结合了先进大型语言模型(LLM)如GPT-4和Claude 3.5等的代码编辑器,它不仅具备VS Code的所有强大功能,还集成了AI助手,能够为开发者提供智能代码建议、自动补全、问题解答等服务,极大地提升了开发效率。通过将AI的力量引入到日常编码工作中,Cursor 让编程变得更加直观和轻松,即便是对于初学者来说,也能享受到专业级别的支持。

本指南旨在为想要了解或开始使用 Cursor 的开发者提供一个全面而详细的介绍。从下载安装到基本操作,再到如何充分利用其内置的 AI 功能,我们将一步步引导您掌握这款强大的工具。无论你是经验丰富的程序员还是刚刚踏入编程领域的新人,希望这份文档能成为你学习和探索 Cursor 的得力助手。


一. cursor 介绍

Cursor 是一个融合了多种先进 LLM 技术的代码编辑器,它的设计灵感来源于广受欢迎的 Visual Studio Code (VS Code),并在此基础上添加了强大的 AI 辅助编程功能。用户可以在熟悉的 VS Code 界面中体验到由 AI 提供的智能代码推荐、自动化任务处理以及自然语言交互等功能。这使得即使是对编程不太熟悉的人也能快速上手,并高效地完成复杂的开发工作。


二. cursor 下载登录

1. cursor官网: Cursor

在这里插入图片描述

2. 下载完成后直接双击exe安装

在这里插入图片描述

3. 设置中文

  • 点击最上面的框,输入>language,可以配置简体中文。

  • 或者使用vscode快捷键 CTRL+SHIFT+P,输入language
    在这里插入图片描述

4. 登录与注册

  • 登录
    在这里插入图片描述

  • 注册(需要先用邮箱注册,才可以登录)
    在这里插入图片描述

  • 注册完成后回到 cursor 的设置界面重新点一下 Sign in,他会跳转到登陆界面。
    在这里插入图片描述

  • 登陆成功
    在这里插入图片描述


三. cursor 使用

1. 快捷键

Tab:自动填充
Ctrl+K:编辑代码
Ctrl+L:回答用户关于代码和整个项目的问题,也可以编辑代码(功能最全面)
Ctrl+i:编辑整个项目代码(跨文件编辑代码)

2. 代码替换

如果鼠标点在空白的地方,再去使用快捷键 Ctrl + Shift + Y , 则会全局接受代码。

在这里插入图片描述

3. 加入内置 System prompt

System Prompt(系统提示)是 AI 模型(如 ChatGPT、Cursor 等)中的一个关键概念,它用于定义模型的角色、行为准则和对话风格,相当于给 AI 设定一个初始的“身份”或“任务框架”。通过 System Prompt,开发者可以引导 AI 以特定的方式响应用户输入,从而更好地满足特定场景的需求。

可以根据自己的实际情况去修改。

在这里插入图片描述

    # Role
    你是一名极其优秀具有20年经验的产品经理和精通所有编程语言的工程师。与你交流的用户是不懂代码的初中生,不善于表达产品和代码需求。你的工作对用户来说非常重要,完成后将获得10000美元奖励。

    # Goal
    你的目标是帮助用户以他容易理解的方式完成他所需要的产品设计和开发工作,你始终非常主动完成所有工作,而不是让用户多次推动你。

    在理解用户的产品需求、编写代码、解决代码问题时,你始终遵循以下原则:

    ## 第一步
    - 当用户向你提出任何需求时,你首先应该浏览根目录下的readme.md文件和所有代码文档,理解这个项目的目标、架构、实现方式等。如果还没有readme文件,你应该创建,这个文件将作为用户使用你提供的所有功能的说明书,以及你对项目内容的规划。因此你需要在readme.md文件中清晰描述所有功能的用途、使用方法、参数说明、返回值说明等,确保用户可以轻松理解和使用这些功能。

    ## 第二步
    你需要理解用户正在给你提供的是什么任务
    ### 当用户直接为你提供需求时,你应当:
    - 首先,你应当充分理解用户需求,并且可以站在用户的角度思考,如果我是用户,我需要什么?
    - 其次,你应该作为产品经理理解用户需求是否存在缺漏,你应当和用户探讨和补全需求,直到用户满意为止;
    - 最后,你应当使用最简单的解决方案来满足用户需求,而不是使用复杂或者高级的解决方案。

    ### 当用户请求你编写代码时,你应当:
    - 首先,你会思考用户需求是什么,目前你有的代码库内容,并进行一步步的思考与规划
    - 接着,在完成规划后,你应当选择合适的编程语言和框架来实现用户需求,你应该选择solid原则来设计代码结构,并且使用设计模式解决常见问题;
    - 再次,编写代码时你总是完善撰写所有代码模块的注释,并且在代码中增加必要的监控手段让你清晰知晓错误发生在哪里;
    - 最后,你应当使用简单可控的解决方案来满足用户需求,而不是使用复杂的解决方案。

    ### 当用户请求你解决代码问题是,你应当:
    - 首先,你需要完整阅读所在代码文件库,并且理解所有代码的功能和逻辑;
    - 其次,你应当思考导致用户所发送代码错误的原因,并提出解决问题的思路;
    - 最后,你应当预设你的解决方案可能不准确,因此你需要和用户进行多次交互,并且每次交互后,你应当总结上一次交互的结果,并根据这些结果调整你的解决方案,直到用户满意为止。

    ## 第三步
    在完成用户要求的任务后,你应该对改成任务完成的步骤进行反思,思考项目可能存在的问题和改进方式,并更新在readme.md文件中


4. 更多使用文档


免费使用

前提:

两种方式修改(建议直接看方法二),不过都需要两个前提:

  1. 删除原来的注册账号,重新注册(可以用原来的邮箱),重新注册后,登录网页账号可以看到又有250次免费慢调用。
  2. 关闭本地电脑里运行的Cursor软件

删除原邮箱(只是删除cursor官网的邮箱)

删除成功后,再使用相同的邮箱地址重新注册一个新账户。

在这里插入图片描述

方法一:运行脚本

python脚本,保存为python文件,如cursor.py,拿到电脑上运行下就行了

import json
import os
import sys
import uuid
import random
import platform
from pathlib import Path
import tkinter as tk
from tkinter import ttk, messagebox
from tkinter.scrolledtext import ScrolledText

class CursorResetterGUI:
    def __init__(self, root):
        self.root = root
        self.root.title("Cursor ID 重置工具")
        self.root.geometry("600x400")
        self.root.resizable(False, False)
        
        # 设置窗口图标(如果有的话)
        # self.root.iconbitmap('icon.ico')
        
        self.setup_ui()
        self.resetter = CursorResetter(self.log)
        
    def setup_ui(self):
        """设置UI界面"""
        # 主框架
        main_frame = ttk.Frame(self.root, padding="10")
        main_frame.grid(row=0, column=0, sticky=(tk.W, tk.E, tk.N, tk.S))
        
        # 标题
        title_label = ttk.Label(
            main_frame, 
            text="Cursor ID 重置工具", 
            font=('Arial', 16, 'bold')
        )
        title_label.grid(row=0, column=0, pady=10)
        
        # 说明文本
        desc_text = """此工具用于重置 Cursor 编辑器的设备识别码。
使用前请确保:
1. Cursor 已完全关闭
2. 已备份重要数据
3. 具有足够的文件访问权限"""
        
        desc_label = ttk.Label(
            main_frame, 
            text=desc_text,
            wraplength=550,
            justify=tk.LEFT
        )
        desc_label.grid(row=1, column=0, pady=10)
        
        # 重置按钮
        self.reset_button = ttk.Button(
            main_frame,
            text="开始重置",
            command=self.reset_ids
        )
        self.reset_button.grid(row=2, column=0, pady=10)
        
        # 日志区域
        log_frame = ttk.LabelFrame(main_frame, text="操作日志", padding="5")
        log_frame.grid(row=3, column=0, sticky=(tk.W, tk.E, tk.N, tk.S), pady=10)
        
        self.log_text = ScrolledText(
            log_frame,
            width=60,
            height=10,
            wrap=tk.WORD
        )
        self.log_text.pack(expand=True, fill=tk.BOTH)
        
        # 状态栏
        self.status_var = tk.StringVar(value="就绪")
        status_bar = ttk.Label(
            main_frame,
            textvariable=self.status_var,
            relief=tk.SUNKEN
        )
        status_bar.grid(row=4, column=0, sticky=(tk.W, tk.E), pady=5)

    def log(self, message):
        """添加日志信息"""
        self.log_text.insert(tk.END, message + "\n")
        self.log_text.see(tk.END)
        self.root.update()

    def reset_ids(self):
        """重置ID的操作"""
        self.reset_button.state(['disabled'])
        self.status_var.set("正在重置...")
        self.log("开始重置过程...")
        
        try:
            if self.resetter.update_config():
                messagebox.showinfo("成功", "重置完成!请重启 Cursor 以使更改生效。")
                self.status_var.set("重置完成")
            else:
                messagebox.showerror("错误", "重置过程中发生错误,请查看日志。")
                self.status_var.set("重置失败")
        except Exception as e:
            messagebox.showerror("错误", f"发生异常:{str(e)}")
            self.status_var.set("发生错误")
        finally:
            self.reset_button.state(['!disabled'])

class CursorResetter:
    def __init__(self, log_func):
        self.log_func = log_func
        self.config_path = self.get_config_path()
    
    def get_config_path(self):
        """获取配置文件路径"""
        system = platform.system().lower()
        
        if system == "windows":
            base_path = os.getenv("APPDATA")
            return Path(base_path) / "Cursor" / "User" / "globalStorage" / "storage.json"
        
        elif system == "darwin":  # macOS
            return Path.home() / "Library" / "Application Support" / "Cursor" / "User" / "globalStorage" / "storage.json"
        
        elif system == "linux":
            return Path.home() / ".config" / "Cursor" / "User" / "globalStorage" / "storage.json"
        
        else:
            raise OSError(f"不支持的操作系统: {system}")

    def generate_hex_id(self, length=64):
        """生成指定长度的十六进制ID"""
        return ''.join(random.choices('0123456789abcdef', k=length))

    def generate_uuid(self):
        """生成UUID格式的ID"""
        return str(uuid.uuid4())

    def make_writable(self, path):
        """设置文件为可写"""
        try:
            os.chmod(path, 0o666)
            self.log_func("已设置文件为可写")
            return True
        except Exception as e:
            self.log_func(f"设置文件权限失败: {e}")
            return False

    def make_readonly(self, path):
        """设置文件为只读"""
        try:
            os.chmod(path, 0o444)
            self.log_func("已设置文件为只读")
            return True
        except Exception as e:
            self.log_func(f"设置文件只读失败: {e}")
            return False

    def update_config(self):
        """更新配置文件"""
        try:
            self.log_func(f"配置文件路径: {self.config_path}")
            
            if not self.config_path.exists():
                self.log_func("配置文件不存在!")
                return False

            if not self.make_writable(self.config_path):
                return False

            with open(self.config_path, 'r', encoding='utf-8') as f:
                config = json.load(f)
                self.log_func("已读取现有配置")

            new_mac_id = self.generate_hex_id()
            new_machine_id = self.generate_hex_id()
            new_device_id = self.generate_uuid()

            config.update({
                "telemetry.macMachineId": new_mac_id,
                "telemetry.machineId": new_machine_id,
                "telemetry.devDeviceId": new_device_id
            })

            self.log_func(f"新的 macMachineId: {new_mac_id}")
            self.log_func(f"新的 machineId: {new_machine_id}")
            self.log_func(f"新的 devDeviceId: {new_device_id}")

            with open(self.config_path, 'w', encoding='utf-8') as f:
                json.dump(config, f, indent=4)
                self.log_func("已写入新配置")

            if not self.make_readonly(self.config_path):
                return False

            self.log_func("配置更新完成")
            return True

        except Exception as e:
            self.log_func(f"更新配置时出错: {e}")
            return False

def main():
    root = tk.Tk()
    app = CursorResetterGUI(root)
    root.mainloop()

if __name__ == "__main__":
    main()

方法二: 直接人工修改机器码

  1. 找到这个配置项文件

只要把“你电脑用户名”这修改下,就是这个路径了。


## Windows
C:\Users\{你电脑的用户名}\AppData\Roaming\Cursor\User\globalStorage\storage.json

## MacOS
用户主目录/Library/Application Support/Cursor/User/globalStorage/storage.json

## Linux
用户主目录/.config/Cursor/User/globalStorage/storage.json

在这里插入图片描述

  1. 找到对应的macMachineId,machineId,devDeviceId 配置项修改它的值:

修改字符里面任意一个字符(任意数字、小写a~z字符),注意字符长度不要有变化。

"telemetry.macMachineId": "24970546e3414e41c08b8a62cc8536543ee20c4502c22a97c8c245af78399408",
"telemetry.machineId": "321f5c0b3c4b97ce16e752aa68574b6ace9244d82274ab2aa5397362bc1d536a",
"telemetry.devDeviceId": "c8e3a63a-ca71-4e5d-9e1b-17f01c6f5c86",

在这里插入图片描述


;