IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    Cursor使用技巧,配置详解

    Elmagnifico\'s Blog发表于 2025-05-13 00:00:00
    love 0

    Foreword

    Cursor配置详解

    关键点还是写在前面,如果你是个新手,Cursor可以帮你快速达到一个熟手的水平,但是要再提高,还是需要你自己去深入代码,深入设计本身,Cursor只能把你拉到一般水平,专业的事情,还是要专业的人来做。

    Cursor

    收费

    img

    Cursor免费版本,可以有半个月的试用,你可以去体验,对比一下,看是不是符合你的习惯;我们默认给配的都是Pro版本,Bussiness版本和Pro一样,只是多了一些审计的功能,没必要,企业版需要250+人才有资格谈

    https://www.cursor.com/cn/settings

    img

    正常来说我们用的Pro版本,每月都有500次高级模型的请求次数,gpt-4o-mini这种小模型有不限次数的请求,建议用高级模型,一般不容易用完这500次

    功能演示

    自动import

    可以看到在自动补全以后,会灰色提示你需要导入这个包

    image-20250513171831257

    根据注释补全代码

    使用Doxygen的注释方式来写代码,这样这代码既可以被作为文本导出,同时也能让AI帮忙完成代码编写

    /**
    * Initialize the AVCodecContext to use the given AVCodec. Prior to using this
    * function the context has to be allocated with avcodec_alloc_context3().
    *
    * The functions avcodec_find_decoder_by_name(), avcodec_find_encoder_by_name(),
    * avcodec_find_decoder() and avcodec_find_encoder() provide an easy way for
    * retrieving a codec.
    *
    * @warning This function is not thread safe!
    *
    * @note Always call this function before using decoding routines (such as
    * @ref avcodec_receive_frame()).
    *
    * @code
    * avcodec_register_all();
    * av_dict_set(&opts, "b", "2.5M", 0);
    * codec = avcodec_find_decoder(AV_CODEC_ID_H264);
    * if (!codec)
    *     exit(1);
    *
    * context = avcodec_alloc_context3(codec);
    *
    * if (avcodec_open2(context, codec, opts) < 0)
    *     exit(1);
    * @endcode
    *
    * @param avctx The context to initialize.
    * @param codec The codec to open this context for. If a non-NULL codec has been
    *              previously passed to avcodec_alloc_context3() or
    *              for this context, then this parameter MUST be either NULL or
    *              equal to the previously passed codec.
    * @param options A dictionary filled with AVCodecContext and codec-private options.
    *                On return this object will be filled with options that were not found.
    *
    * @return zero on success, a negative value on error
    * @see avcodec_alloc_context3(), avcodec_find_decoder(), avcodec_find_encoder(),
    *      av_dict_set(), av_opt_find().
    */
    

    image-20250513184109777

    下面是补全的代码内容

    /**
     * @brief 初始化AVCodecContext以使用给定的AVCodec;
     *
     * @param avctx 要初始化的上下文;
     * @param codec 用于此上下文的编解码器;
     * @param options 包含AVCodecContext和编解码器私有选项的字典;
     *
     * @return 成功返回零,失败返回负值;
     */
    int avcodec_open2(AVCodecContext *avctx, const AVCodec *codec, AVDictionary **options)
    {
        int ret = 0;
        
        /* 检查参数有效性 */
        if (!avctx || !codec)
        {
            return -1;
        }
        
        /* 检查编解码器兼容性 */
        if (avctx->codec && avctx->codec != codec && codec)
        {
            return -1;
        }
        
        /* 设置编解码器 */
        avctx->codec = codec;
        
        /* 初始化编解码器特定数据 */
        if (codec->priv_data_size > 0)
        {
            /* 分配编解码器私有数据 */
            if (!avctx->priv_data)
            {
                avctx->priv_data = av_mallocz(codec->priv_data_size);
                if (!avctx->priv_data)
                {
                    return -1;
                }
            }
        }
        
        /* 应用编解码器选项 */
        if (options && *options)
        {
            /* 处理选项字典 */
            ret = av_opt_set_dict2(avctx, options, AV_OPT_SEARCH_CHILDREN);
            if (ret < 0)
            {
                return ret;
            }
        }
        
        /* 调用编解码器初始化函数 */
        if (codec->init)
        {
            ret = codec->init(avctx);
            if (ret < 0)
            {
                return ret;
            }
        }
        
        return 0;
    }
    

    从这里反向提取一些有用的信息,你得告诉AI什么,他才能帮你写好代码

    /**
    * 说明这个函数要用来实现一个什么功能
    *
    * 附加这个函数可能可以使用的函数或者子功能可以用某些现有的函数来替代
    *
    * @warning 使用这个函数的警告信息,比如线程安全与否
    *
    * @note 使用这个函数要注意的点,比如必须先调用某个函数才能调用这个函数
    * @ref 参考信息,比如某个关联的函数
    *
    * @code
    * 一般是在行程文档时给出的示例代码
    * @endcode
    *
    * @param 函数的输入参数是什么,具体类型,作用
    * @param 同上,多个参数时使用
    *
    * @return 函数的返回值是什么,明确说明关联的状态
    * @see 引入参考信息,是单独成列的,可以跳转的,比如某某类似功能的函数
    */
    

    质疑式反问

    对于Cursor补全的代码,可以再次进行反问,你甚至不用在意这个代码是否正确,直接反问他就行

    一个正确的内容是经得起多次质疑的

    AI没有记忆

    同一个问题,如果新建一个对话,AI就会完全忘记你上次教他的内容。同样的上下文隔了非常远,AI也会忘记教他的内容

    这里的SCB_InvalidateDCache放在HAL_SD_ReadBlocks_DMA的后面是否正确
    

    image-20250513193631073

    不仅仅是代码

    直接拿Cursor当作知识库去提问一样可以

    image-20250513194133283

    PDF文档阅读

    Cursor阅读PDF比较困难,之前我有用转成txt在询问,但是对于大文本不是很好,那种图文夹杂在一起的也不是很好用

    这里可以用这个项目,把pdf转成markdown,做成类似RAG的知识库,然后作为一个项目给Cursor去读

    https://github.com/denisalevi/bib4llm

    • 不过这个项目对于巨大的PDF不是很好,转换很慢,转换后的文档没有分片,提问时可能上下文特别大
    • image-20250513200629293

    安装

    pip install bib4llm
    

    使用

    bib4llm convert xxxx.pdf
    

    比如这里使用 bib4llm convert ./invoice.pdf

    image-20250513195643631

    他会直接生成一个新目录,这个目录下就是转换后的内容,你可以直接用Cursor打开这个目录,然后进行提问即可

    对于那种拍摄的PDF,不是源文本的,可以用下面这个在线工具来清晰化PDF

    https://mistral.ai/news/mistral-ocr

    Commit对比

    image-20250513202757629

    可以直接对Git提问,甚至可以直接比较不同Commit之间的区别

    image-20250513203024788

    让他评价一下commit,看下是否有问题

    配置

    模型选择

    img

    Cursor是支持deepseek的,但是我试过感觉效果不是很好。建议使用claude-3.5-sonnet或者gemini-2.5-pro-exp-03-35

    如果后续继续出新模型,也建议用新模型,Cursor上新还是非常快的

    img

    如果问的比较深或者回答效果你感觉不是很好,可以把Thinking勾上,AI思考链会增加,可能更容易理解你的想法

    • 深度思考的时候会额外消耗请求次数

    Feature介绍

    img

    可以用Tab自动帮你导入没导入的模块,类比VS里C# 复制一段某个模块的代码,会自动搜索对应的内容,直接就能在文件头添加这个模块

    • 目前只支持TS、Python,其他语系还不太行

    img

    1. 与AI对话的设置中,建议选择使用Agent模式进行对话,而不是ask或者其他的,其他的上下文响应要弱一些,更像是一个编程伙伴,更像人的感觉。
    2. 自动运行模式,建议不要勾选,因为他会自动调用MCP等等内容,可能会直接修改你本地文件,有些内容修改了你可能都没注意,所以最好让你人工确认一下
    3. 自动导入你的工程结构作为对话的前提,这样AI对你在干啥,想干啥会理解的更好

    img

    使用较大的上下文,这个可以明显提升AI对你提出要求的理解,但是消耗请求可能更多

    img

    1. 自动接受代码建议,看使用习惯,自动接受的话会自动使用了 git add 这个文件 ,相当于认为这文件修改就是可行了,建议还是不要勾选,你可能分不清哪部分是你应该改的,哪部分是误操作改的
    2. 允许agent去网络搜索,很重要,建议勾选

    补全选项

    img

    补全选项里可以忽略一些文件,比如你有一些特殊文件,他不应该参考,比如这里的password.txt 就可以用类似.gitignore的方式来忽略

    img

    比如这里提一个规则,所有注释必须以分号结尾,规则模式是必须,可以看到AI给出的注释建议,自动增加了封号

    • 这个规则具体使用可以是默认、也可以是手动要求agent符合某一个规则

    也可以通过这个规则,快速让Agent梳理代码格式,如果规则内给的代码格式够多的话

    img

    这个规则可以设定的很复杂,比如什么目录用什么规则,什么文件用什么规则

    Docs

    Cursor也可以直接引入外部文档或者链接,类似RAG一样,作为代码提示或者Agent搜索的额外知识库

    image-20250513171350572

    比如这里,我就直接把Maya Cmds的API文档输入进去

    https://help.autodesk.com/view/MAYAUL/2024/ENU/?guid=__CommandsPython_index_html
    

    在与Agent的对话中,就可以稍微上刚才加入的知识库作为搜索对象

    image-20250513172313344

    然后对这个内容进行提问即可,同样的这个地方可以对规则、终端、Git等等信息直接进行提问

    MCP

    img

    MCP的介绍就是另外一个内容了,比较复杂,需要先安装好node.js,然后系统可以正常调用到他

    filesystem的安装代码

    {
        "mcpServers": {
          "filesystem": {
            "command": "powershell",
            "args": [
              "-WindowStyle", 
              "Hidden", 
              "-Command", 
              "npx -y @modelcontextprotocol/server-filesystem C:/Users/elmag/Desktop"
            ]
          }
        }
    }
    

    然后就可以让AI直接帮你建立对应的文件

    同理类似的有MySql的、搜索的、画UI的,等等各种MCP应用,让AI可以直接调用程序,完成你的要求

    键盘技巧

    • 掌握键盘快捷键:Cursor 的键盘绑定与 VS Code 类似,但也有一些不同之处。

    例如,使用Command + K进行内联编辑,使用Command + L启用聊天功能,使用Command + I启用Composer 。熟悉这些快捷键会节省很多时间,使工作流程更加高效。

    • 优化代码编辑:对于小规模的编辑,使用内联建议。对于更大、更复杂的修改,利用聊天功能。这样双管齐下,你可以轻松处理简单调整和全面修改。
    • 利用特定文件索引:使用聊天功能时,指定你希望 Cursor 聚焦的文件。这将提高输出的质量,尤其是在需要多文件上下文的复杂修改时。

    Summary

    Cursor的配置总结还是比较少的,官方的功能说明写的很难看懂啊

    Quote

    https://breezetemple.github.io/2019/12/27/doxygen-syntax/



沪ICP备19023445号-2号
友情链接