一日一技:如何使用Cursor学习开源项目

大家肯定经常在微信公众号里面看到类似于《30秒使用Cursor开发xxx》这种文章。典型的标题党装逼货,大家当个笑话看就行了。

Cursor目前还没有强到真的让一个完全不懂代码的人轻轻松松开发一个有用的软件,但Cursor确实可以让懂代码的人如虎添翼。正好最近有不少同学在群里面问我,如何正确使用Cursor:

那么今天我就来讲讲我使用Cursor的一个场景:快速理解开源项目的核心逻辑。

Cline为例,这是一个VSCode插件,能够让VSCode实现Cursor的功能,配合DeepSeek最新模型,有人声称可以完美平替Cursor。那么,如果我完全看懂了Cline的原理,也就相当于看懂了Cursor的实现原理了。那么我们来看看如何使用Cursor辅助我学习Cline的源代码。

首先把Cline的代码clone到本地,然后用Cursor打开。如下图所示:

这个时候,如果是完全不懂代码的人,肯定一上来就让Cursor解释这个项目的原理。但这个插件的代码量还是挺大的,完全没有重点的让Cursor来解释,只会得到一个大而空的整体解释,对你的学习没有任何帮助。

我们作为工程师,在提问之前,一定要对我们想问的东西有一个初步的了解,否则没有办法提出有用的问题。要初步了解一个程序项目,第一步肯定是看一下这个项目的文件结构,通过它的文件结构,应该能够知道它每个文件夹里面的代码大概是什么功能。这样一来可以直接略过不太重要的部分。例如这个项目是一个VSCode插件,那么里面肯定有一部分代码是为了让他能被VSCode识别和调用。这种代码我们完全不需要关心。我们只需要关心它怎么让AI生成代码,怎么自动修改代码就可以了。

这就像是在拿到一本新书的时候,我一般会先看书的目录,知道这本书的整体结构,然后再带着问题来读书。

浏览一下这个项目文件结构,可以看到,AI生成代码的相关逻辑,应该在src/core文件夹里面。其中src/core/prompts里面是相关的提示词,src/core/assistant-message里面是解析大模型返回的XML并实现自动化操作的逻辑。

Cline的功能跟Cursor很像,能自动执行命令,能自动生成文件,能修改已经有的文件。

以Cline自动修改已有文件这个功能为例。假设我们自己的程序已经有不少代码了,现在我在安装了Cline的VSCode中,让AI帮我给这个项目增加一些功能。它的流程肯定是这样的:

  1. 读取已经有的代码
  2. 构造出一段Prompt,里面包含已经有的代码以及我们的新需求,调用大模型
  3. 大模型返回一段内容,Cline解析这段内容,根据里面的提示,修改对应的文件中的对应的部分。

现在,我就想学习一下,大模型返回的内容长什么样?Cline是怎么解析这段内容,并让他变成对文件的操作的?

所以,我首先在Cursor中提出第一个问题:

1
2
@folder src/core/assistant-message
这是cline这个自动化编程copilot在收到大模型返回的信息以后,对信息进行处理的逻辑。请阅读它的代码并告诉我它的解析逻辑。

如下图所示

从它返回的内容,我们可以知道,大模型返回给Cline的内容是XML格式,Cline解析这个XML,从而进一步执行具体的操作。在它返回的内容中,支持的操作包含下面这一段内容:

我最关心的就是replace_in_file这个功能是怎么实现的,所以我进一步提问:

1
详细解释一下replace_in_file的具体逻辑和流程

返回的部分内容如下:

这段内容比较长,我总结一下它返回的重点:

  1. 显示了大模型返回的内容格式
  2. 代码里面如何解析大模型返回的内容
  3. 如何修改代码

它解释得已经比较清楚了,但由于Cline是使用JavaScript语法写的,有些同学可能对JS没有Python熟悉,所以,我们让大模型再做一步翻译,把核心代码改写成Python,并且创建一个Demo来运行这段Python代码:

1
2
3
4
5
6
7
现在,为了便于我的理解,请帮我实现一个replace_in_file 的Python版本。请在项目根目录创建一个example文件夹。这个文件夹里面有4个文件,分别为:

1. example_llm_response.txt:假设一段从大模型返回的内容
2. example_old.py:一段需要被修改的代码
3. replacer.py: Python版本的replace_in_file

当我运行replacer.py以后,它应该能够根据example_llm_response.txt中的内容,修改example_old.py,然后生成example_new.py

如下图所示:

我们可以先看一下它生成的example_llm_response.txt,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
我会帮你修复calculate_multiply函数中的bug。

<replace_in_file>
<diff>
<<<<<<< SEARCH
def calculate_multiply(a, b):
# 这是一个有bug的乘法函数
return a + b # 这里错误地使用了加法
=======
def calculate_multiply(a, b):
# 修复后的乘法函数
return a * b # 修正为正确的乘法运算
>>>>>>> REPLACE
</diff>
</replace_in_file>

现在乘法函数已经修复了,它会返回正确的结果。

需要被修改的,有问题的example_old.py如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
def calculate_sum(a, b):
# 计算两个数的和
return a + b

def calculate_multiply(a, b):
# 这是一个有bug的乘法函数
return a + b # 这里错误地使用了加法

def greet(name):
# 打招呼函数
print("Hello " + name)

if __name__ == "__main__":
result = calculate_multiply(3, 4)
print(f"3 x 4 = {result}") # 这里会输出错误结果

直接运行,会看到最后输出的结果是错误的:

现在运行replacer.py,会自动生成example_new.py,内容如下:

可以看到,输出的结果已经正确了。虽然新代码最后一行的注释还有问题,但毕竟这个返回的内容是模拟的,所以可以理解。

现在,我们直接阅读replacer.py文件,就可以用Python的语法来理解Cline的逻辑了。生成的代码不依赖任何第三方库,因此理论上可以在任何能够运行Python的环境运行。大家还可以把自己的一些想法直接改到代码上,来测试它的运行效果。

生成的代码这里是使用正则表达式来提取XML。在正式项目中,肯定需要使用专门的XML解析模块来解析。不过这个Demo使用正则表达式反而帮我们能更好理解代码。

完整的代码我就不贴上来了,有Cursor的同学可以使用Cursor试一试。没有Cursor的同学可以使用Cline + DeepSeek来试一试,得到的结果应该跟我这个是一样的。

再附上我使用Cusror解析Bolt.new的代码结构,并通过Mermaid语法生成的时序图:

总结

Cursor不仅可以写代码,还能帮我们学习代码。大家在提问时,一定要针对某个功能精确提问,只有你的问题越具体,它返回的内容才会越具体。