发布于VeighNa社区公众号【vnpy-community】
 
原文作者:VeighNa小助手 | 发布时间:2025-07-23
 

特别说明:本文内容基于我们团队在特定时间点的研究和信息收集。由于技术迭代迅速,部分信息可能存在时效性或未能完全覆盖所有细节。我们非常欢迎并期待来自社区的反馈和讨论,共同完善认知。
 

概述

AI 正在重塑软件开发的各个环节。当我们讨论 AI 编程时,已不再仅仅局限于代码补全。如今,我们选取了三款具有代表性的工具:Cursor、Gemini CLI 与 Claude Code,它们各自代表了不同的产品理念与技术路径。本文将对它们进行深入的对比分析,以帮助开发者理解其核心差异和独特优势。

 

产品定位与架构对比

 

Cursor

产品特点:

  • 核心定位:AI 原生代码编辑器;
  • 主要优势:基于 VS Code 深度整合 AI 能力,提供无缝的嵌入式体验;
  • 工作模式:可视化编程环境;
  • 生态支持:继承 VS Code 完整的 IDE 功能和插件生态,并提供稳定的商业化支持。

Gemini CLI

产品特点:

  • 核心定位:命令行 AI 工作流工具;
  • 主要优势:支持超大上下文窗口(1M+ tokens)、强大的多模态能力,且 Google Gemini 费用相对低廉;
  • 工作模式:命令行交互环境;
  • 生态支持:完全开源,通过 MCP 协议扩展工具生态,支持项目级与用户级配置;

Claude Code

产品特点:

  • 核心定位:深度集成 IDE 的编程工作流助手;
  • 主要优势:强大的代码理解能力,以及丰富的内置工具;
  • 工作模式:命令行交互环境;
  • 生态支持:支持与 VS Code、JetBrains 等多种 IDE 深度集成,提供多层级配置体系。

     

功能特性详细对比

 

IDE 集成能力

功能 Cursor Gemini CLI Claude Code
选区上下文共享 原生支持 通过选定文件 通过插件支持
标签页同步 完全集成 通过选定文件 通过插件支持
诊断信息共享 编辑器内置 纯命令行模式 通过插件支持
快捷键支持 多种操作快捷键 暂不支持 仅有启动快捷键
支持的 IDE Cursor (VS Code) 基础编辑器支持 VS Code、JetBrains 系列

配置和记忆系统

功能 Cursor Gemini CLI Claude Code
项目级AI规则 .cursorrules.cursor/rules/ 项目级GEMINI.md 项目级CLAUDE.md
用户级AI规则 User Rules 全局~/.gemini/GEMINI.md + save_memory命令 全局~/.claude/CLAUDE.md + #快速添加
规则执行效果 不够稳定 较为可靠 较为可靠
历史对话记录 @past chats 当前对话中一键引用历史对话 /chat save/resume 可恢复之前手动保存的对话 --resume 开启对话前可选择恢复自动保存的对话

 

代码生成对比

 

开发任务

理论对比完成后,还是要看看这三款工具在实际工作中的表现。接下来,我们将通过一个简单的 VeighNa 数据导出脚本开发任务,来对比三款工具在同一个编程任务中的生成结果与工作流程。

以下是统一使用的提示词:

作为一名精通VeighNa框架的Python开发专家,请提供一个可以直接运行的Python脚本。

核心任务:
通过调用 'get_database' 函数来创建数据库实例,进而批量导出所有K线数据。

具体要求:
1.  参考实现:
    a. 'get_database' 的用法,请参考文件 'E:\github\vnpy\vnpy\trader\database.py'。
    b. 数据查询和文件生成的逻辑,请参考当前 'vnpy_datamanager' 插件内的实现。
2.  本地优先:为避免使用网上过时或不兼容的代码,请完全基于本地已有的代码和您对VeighNa框架的理解来完成任务。
3.  运行时输出:脚本执行时,每处理一个数据集,都需要在控制台清晰地打印出其合约代码、时间频率和数据长度。
4.  代码质量:
    a. 确保代码风格清晰、可读性好。
    b. 优先使用条件判断(如 'if')处理可预见的流程,避免不必要的 'try-except' 语句。

 

Cursor

import csv
from pathlib import Path

from vnpy.trader.database import get_database
from vnpy.trader.object import BarData

# 获取数据库实例
db = get_database()

# 获取所有K线数据的概览信息
overviews = db.get_bar_overview()

# 检查导出的数据存放路径
data_path = Path("output_data")
if not data_path.exists():
    data_path.mkdir()

# 遍历所有K线数据
for overview in overviews:
    # 加载特定K线的全部历史数据
    bars: list[BarData] = db.load_bar_data(
        symbol=overview.symbol,
        exchange=overview.exchange,
        interval=overview.interval,
        start=overview.start,
        end=overview.end
    )

    # 在控制台打印信息
    print(f"合约代码:{overview.symbol}")
    print(f"时间频率:{overview.interval.value}")
    print(f"数据长度:{len(bars)}")
    print("-" * 30)

    # 将数据写入到CSV文件中
    fieldnames: list = [
        "symbol",
        "exchange",
        "datetime",
        "open",
        "high",
        "low",
        "close",
        "volume",
        "turnover",
        "open_interest"
    ]

    filename = (
        f"{overview.symbol}_"
        f"{overview.exchange.value}_"
        f"{overview.interval.value}.csv"
    )
    file_path: Path = data_path.joinpath(filename)

    with open(file_path, "w", newline="") as f:
        writer = csv.DictWriter(f, fieldnames=fieldnames)
        writer.writeheader()

        for bar in bars:
            d: dict = {
                "symbol": bar.symbol,
                "exchange": bar.exchange.value,
                "datetime": bar.datetime.strftime("%Y-%m-%d %H:%M:%S"),
                "open": bar.open_price,
                "high": bar.high_price,
                "low": bar.low_price,
                "close": bar.close_price,
                "volume": bar.volume,
                "turnover": bar.turnover,
                "open_interest": bar.open_interest,
            }
            writer.writerow(d)

点击查看Cursor输出过程

从上图可以看出,Cursor 作为一款 AI 原生 IDE,其优势体现在与编码过程的深度融合上:

  • 无缝的 IDE 集成:用户在熟悉的类 VS Code 环境中操作,通过图形界面选择模型、管理上下文、查看 Diff,学习成本低。
  • 多维度的上下文管理:支持通过界面直接添加文件、利用 @ 符号引用代码片段或历史对话,上下文控制灵活直观。
  • 强大的编码辅助:除了生成代码,它还提供实时的代码补全、智能提示,并在编码过程中利用 IDE 的 Linter 进行检查和修正。
  • 支持多文件夹工作空间:可以轻松应对需要跨多个项目或代码库参考的复杂任务。
     
    #### Gemini CLI
# export_all_data.py
import os
import csv
from datetime import datetime
from typing import List

from vnpy.trader.database import get_database, BarOverview
from vnpy.trader.object import BarData
from vnpy.trader.constant import Exchange, Interval

# 创建用于存放导出数据的文件夹
output_folder = "kline_data_exported"
if not os.path.exists(output_folder):
    os.makedirs(output_folder)

# 获取数据库实例
# 该函数会自动读取全局配置(通常是 settings.json)来连接数据库
database = get_database()

# 获取所有K线数据的概要信息
overviews: List[BarOverview] = database.get_bar_overview()

print(f"发现 {len(overviews)} 个K线数据集,开始处理...")
print("-" * 60)

# 遍历所有数据集
for overview in overviews:
    symbol: str = overview.symbol
    exchange: Exchange = overview.exchange
    interval: Interval = overview.interval
    start: datetime = overview.start
    end: datetime = overview.end

    # 从数据库加载该合约的全部K线数据
    bars: List[BarData] = database.load_bar_data(
        symbol=symbol,
        exchange=exchange,
        interval=interval,
        start=start,
        end=end
    )

    data_length = len(bars)

    # 检查是否有数据
    if not data_length:
        print(f"合约: {symbol}, 频率: {interval.value} -> 数据长度为 0, 跳过")
        continue

    # 打印处理信息
    print(f"合约: {symbol}, 频率: {interval.value} -> 正在导出 {data_length} 条数据...")

    # 构建CSV文件名和路径
    file_name = f"{symbol}_{exchange.value}_{interval.value}.csv"
    file_path = os.path.join(output_folder, file_name)

    # 定义CSV表头
    fieldnames: list = [
        "symbol",
        "exchange",
        "datetime",
        "interval",
        "open",
        "high",
        "low",
        "close",
        "volume",
        "turnover",
        "open_interest"
    ]

    # 将数据写入CSV文件
    with open(file_path, "w", newline="") as f:
        writer = csv.DictWriter(f, fieldnames=fieldnames)
        writer.writeheader()

        for bar in bars:
            row_data = {
                "symbol": bar.symbol,
                "exchange": bar.exchange.value,
                "datetime": bar.datetime.strftime("%Y-%m-%d %H:%M:%S"),
                "interval": bar.interval.value,
                "open": bar.open_price,
                "high": bar.high_price,
                "low": bar.low_price,
                "close": bar.close_price,
                "volume": bar.volume,
                "turnover": bar.turnover,
                "open_interest": bar.open_interest,
            }
            writer.writerow(row_data)

print("-" * 60)
print(f"所有数据导出完成,文件已保存至 '{output_folder}' 文件夹。")

点击查看Gemini CLI输出过程

从上图可以看出,Gemini CLI 体现了其作为命令行工具的独特工作流:

  • 计划先行:在执行前,它会先分析问题、阅读代码,然后输出详细的计划步骤并提出运行建议。
  • 项目为基:与 Cursor 不同,它和 Claude Code 都以项目文件夹为基础进行交互,因此对于外部文件需要指定绝对路径。
  • 注重安全:Gemini CLI 非常注重安全性,在处理多文件夹交互时,推荐使用其沙盒模式来保障环境。
  • 部署灵活:其纯命令行模式不仅可以在本地 IDE 中使用,也非常适合在服务器上进行远程开发。
     
    #### Claude Code
#!/usr/bin/env python3
"""
批量导出所有K线数据的Python脚本
基于VeighNa框架的vnpy_datamanager插件实现
"""

import csv
import os
from datetime import datetime
from pathlib import Path

from vnpy.trader.database import BaseDatabase, get_database, BarOverview
from vnpy.trader.constant import Interval, Exchange
from vnpy.trader.object import BarData


def create_export_directory() -> Path:
    """创建导出目录"""
    export_dir = Path("exported_kline_data")
    export_dir.mkdir(exist_ok=True)
    return export_dir


def generate_filename(symbol: str, exchange: Exchange, interval: Interval) -> str:
    """生成导出文件名"""
    interval_name_map = {
        Interval.MINUTE: "1min",
        Interval.HOUR: "1hour", 
        Interval.DAILY: "1day"
    }

    interval_suffix = interval_name_map.get(interval, interval.value)
    return f"{symbol}_{exchange.value}_{interval_suffix}.csv"


def export_bar_data_to_csv(
    database: BaseDatabase,
    file_path: str,
    symbol: str,
    exchange: Exchange,
    interval: Interval,
    start: datetime,
    end: datetime
) -> bool:
    """导出K线数据到CSV文件"""
    bars = database.load_bar_data(symbol, exchange, interval, start, end)

    if not bars:
        print(f"  警告: {symbol}.{exchange.value} {interval.value} 无数据")
        return False

    fieldnames = [
        "symbol",
        "exchange", 
        "datetime",
        "open",
        "high",
        "low",
        "close",
        "volume",
        "turnover",
        "open_interest"
    ]

    with open(file_path, "w", newline="", encoding="utf-8") as f:
        writer = csv.DictWriter(f, fieldnames=fieldnames)
        writer.writeheader()

        for bar in bars:
            data_row = {
                "symbol": bar.symbol,
                "exchange": bar.exchange.value,
                "datetime": bar.datetime.strftime("%Y-%m-%d %H:%M:%S"),
                "open": bar.open_price,
                "high": bar.high_price,
                "low": bar.low_price,
                "close": bar.close_price,
                "volume": bar.volume,
                "turnover": bar.turnover,
                "open_interest": bar.open_interest,
            }
            writer.writerow(data_row)

    return True


def main():
    """主函数:批量导出所有K线数据"""
    print("=== VeighNa K线数据批量导出工具 ===")
    print("正在初始化数据库连接...")

    # 获取数据库实例
    database: BaseDatabase = get_database()

    # 创建导出目录
    export_dir = create_export_directory()
    print(f"导出目录: {export_dir.absolute()}")

    # 获取所有K线数据概览
    print("正在获取数据库中的K线数据概览...")
    overviews: list[BarOverview] = database.get_bar_overview()

    if not overviews:
        print("数据库中没有找到任何K线数据")
        return

    print(f"发现 {len(overviews)} 个数据集")
    print("-" * 80)

    success_count = 0
    failed_count = 0

    # 遍历所有数据集进行导出
    for i, overview in enumerate(overviews, 1):
        # 生成文件名和完整路径
        filename = generate_filename(overview.symbol, overview.exchange, overview.interval)
        file_path = export_dir / filename

        # 输出处理信息
        print(f"[{i:3d}/{len(overviews)}] 正在处理: {overview.symbol}.{overview.exchange.value} | "
              f"频率: {overview.interval.value} | 数据量: {overview.count:,} 条")
        print(f"        时间范围: {overview.start.strftime('%Y-%m-%d %H:%M:%S')} "
              f"至 {overview.end.strftime('%Y-%m-%d %H:%M:%S')}")

        # 导出数据
        success = export_bar_data_to_csv(
            database,
            str(file_path),
            overview.symbol,
            overview.exchange,
            overview.interval,
            overview.start,
            overview.end
        )

        if success:
            file_size = os.path.getsize(file_path)
            print(f"        ✓ 导出成功: {filename} ({file_size:,} 字节)")
            success_count += 1
        else:
            print(f"        ✗ 导出失败: {filename}")
            failed_count += 1

        print()

    # 输出汇总信息
    print("=" * 80)
    print("导出完成!")
    print(f"成功导出: {success_count} 个文件")
    print(f"导出失败: {failed_count} 个文件")
    print(f"导出位置: {export_dir.absolute()}")

    if success_count > 0:
        print("\n导出的文件列表:")
        for file_path in sorted(export_dir.glob("*.csv")):
            file_size = os.path.getsize(file_path)
            print(f"  - {file_path.name} ({file_size:,} 字节)")


if __name__ == "__main__":
    main()

点击查看Claude Code输出过程

从输出过程可以看出,Claude Code 强调的是结构化的任务管理和丰富的工具生态:

  • 结构化任务管理:在接收到复杂任务后,通过 TodoWrite 工具将任务分解为清晰的步骤并实时展示进度,让用户对AI的工作状态一目了然。
  • 人机协作流程:生成代码后会主动询问用户是否执行,提供了交互式的确认环节,增强了可控性(此行为可配置)。
  • 深度 IDE 集成:支持通过快捷键在 VS Code、JetBrains 等主流 IDE 中启动,实现上下文共享、差异对比和诊断信息利用。
  • 多模态辅助:支持便捷的图片输入,可以直接分析截图中的UI或错误信息,拓宽了交互的维度。

     

总结与选型建议

 

经过前面的详细对比和实战测试,我们对这三款工具有了全面的认识。它们各有千秋,而选择的关键在于开发者的具体需求和工作流偏好。

核心优势一览

工具 核心优势
Cursor AI与IDE的无缝融合体验,强大的实时编码辅助。
Gemini CLI 卓越的长上下文处理能力,高度可定制的开源框架。
Claude Code 完善的工具链生态与结构化任务管理,深度集成主流IDE。

适用场景推荐

Cursor

  • 提供实时的代码补全和预测(增强版智能提示)
  • 无缝集成 VS Code(完整插件生态支持 + 可视化的变更检查和编辑)
  • 支持多文件夹工作空间(便于在多个项目间切换开发)
  • 适合需要参考历史对话的项目(@past chats 功能)

Gemini CLI

  • 适合大型代码库的分析和重构(超大上下文窗口优势)
  • 适用于服务器环境和远程开发(纯命令行)
  • 注重项目安全的开发环境(沙盒模式 + 请求确认机制)
  • 适合需要深度定制的开发工作流(开源便于个性化开发)

Claude Code

  • 深度集成 IDE 的开发工作流(VS Code、JetBrains 自动上下文共享)
  • 提供丰富的工具链(智能文件导航、智能上下文选择等)
  • 支持图片辅助开发(直接传图片)
  • 提供结构化项目管理(TodoWrite 任务分解和进度跟踪)

成本对比

工具 成本水平 免费额度
Cursor 中等 提供两周免费试用
Gemini CLI 包含免费层级的 API 调用,新用户可叠加 GCP 试用赠金
Claude Code 无免费版,需订阅 Pro/Max

 

结语

 
三款工具各有其独特优势,选择应基于具体需求。随着工具的不断发展,未来的功能差距可能会缩小。每款工具都有其独特优势和适用场景,Cursor 更适合需要通过 IDE 实时编写代码的用户,Gemini CLI 适合对长上下文感知和项目安全有高要求的用户,Claude Code 则在 IDE 深度集成和丰富工具链方面表现突出。在实践中,建议开发者还是要根据自己的具体需求和工作方式选择合适的工具,或者考虑组合使用,以达到最佳的开发效率。