AI 工具 | | 约 15 分钟 | 5,682 字

Trae Chat 与 Inline Edit:日常编码的 AI 搭档

掌握 Trae 的 Chat Mode 和 Inline Editing,让 AI 融入你的编码节奏

开篇:日常编码最常用的两个 AI 功能

Builder 和 SOLO 很酷,但你日常用得最多的其实是两件事:问 AI 一个问题,或者让 AI 帮你改一段代码。这就是 Chat Mode 和 Inline Edit 的主场。

Chat 负责”聊”——讨论、分析、生成代码。Inline Edit 负责”改”——选中代码,原地修改,逐行审查 diff。两者配合,覆盖日常编码 80% 的 AI 场景。

Chat Mode 详解:多轮对话

打开与基本使用

# macOS: Cmd + L / Windows: Ctrl + L
# 或点击侧边栏 Chat 图标

直接输入问题就行。和 ChatGPT 不同的是,Trae 的 Chat 天然理解你的项目上下文:

你:这个项目用的什么状态管理方案?
Trae:根据 package.json 和代码分析,项目使用 Zustand...

你:帮我写一个新的 store,管理购物车状态
Trae:好的,基于项目现有的 store 风格,这是购物车 store:

如果你之前的 store 都用了 immer 中间件,它生成的新 store 也会自动用上。

多轮对话技巧

核心原则:每一轮建立在上一轮基础上,不要每次从头开始。

# 第一轮:让 AI 理解现状
你:分析一下 src/services/api.ts 的错误处理逻辑

# 第二轮:基于分析提需求
你:针对你发现的问题,重构错误处理,统一使用自定义 Error 类

# 第三轮:细化
你:把 NetworkError 的重试改成指数退避,最多 3 次

Trae 会记住整个对话链,不需要重复上下文。

上下文引用:@files / @folders 基础

@ 符号把文件、目录、代码符号”喂”给 AI,这是 Chat 最强大的能力之一。

你:@src/utils/format.ts 日期格式化函数有 bug,UTC 时间少 8 小时
你:@src/components/ 这个目录下哪些组件没做 loading 状态处理?

常用 @ 引用速查

引用方式作用示例
@file引用单个文件@src/index.ts 解释这个文件
@folder引用整个目录@src/hooks/ 有哪些自定义 Hook
@symbol引用代码符号@UserService 这个类的职责是什么
@selection引用选中代码选中后在 Chat 中提问
@terminal引用终端输出@terminal 这个报错怎么解决
@git引用 Git 变更@git 这次改动有没有副作用

输入 @ 后会弹出自动补全列表,方向键选择,回车确认,不需要手动输完整路径。

Inline Editing:选中代码,原地修改

基本流程

# 1. 选中要修改的代码
# 2. 按 Cmd + I (macOS) / Ctrl + I (Windows)
# 3. 描述你想要的修改
# 4. AI 以 inline diff 形式展示修改
# 5. 逐处接受或拒绝

Inline Diff 审查

AI 不会直接覆盖你的代码,而是展示 diff,你可以逐个审查:

  function calculateTotal(items: CartItem[]): number {
-   let total = 0;
-   for (const item of items) {
-     total += item.price * item.quantity;
-   }
-   return total;
+   return items.reduce(
+     (total, item) => total + item.price * item.quantity, 0
+   );
  }

点击 ✅ 接受、❌ 拒绝,多处修改可以选择性接受。

Chat vs Inline Edit 场景选择

场景推荐方式原因
理解代码逻辑Chat需要解释,不改代码
添加类型注解Inline Edit范围明确,选中即改
重构整个模块Chat需要讨论,可能跨文件
修复小 bugInline Edit定位明确,改完就走
设计 API 接口Chat多轮讨论,逐步完善
添加错误处理Inline Edit现有代码上增量修改
学习新概念Chat纯问答
性能优化Inline Edit选中热点代码优化
代码审查Chat + @git审查整体变更
写单元测试Chat需要生成新文件

简单记:改现有代码用 Inline Edit,讨论或生成新内容用 Chat。

实战:用 Chat 重构函数

你有一个越写越复杂的订单处理函数:

async function processOrder(orderId: string, userId: string) {
  const order = await db.orders.findById(orderId);
  if (!order) throw new Error('Order not found');
  if (order.userId !== userId) throw new Error('Unauthorized');
  if (order.status !== 'pending') throw new Error('Order is not pending');

  const items = await db.orderItems.findByOrderId(orderId);
  let totalAmount = 0;
  for (const item of items) {
    const product = await db.products.findById(item.productId);
    if (!product) throw new Error(`Product ${item.productId} not found`);
    if (product.stock < item.quantity)
      throw new Error(`Insufficient stock for ${product.name}`);
    totalAmount += product.price * item.quantity;
  }
  // ... 扣库存、支付、回滚、通知,全塞在一个函数里
}

在 Chat 中输入:

@src/services/order.ts processOrder 太长了,帮我拆分:
1. 验证逻辑单独抽出
2. 库存检查和扣减单独抽出
3. 支付失败要有回滚
4. 保持 TypeScript 类型安全

Trae 会输出拆分后的多个函数:validateOrdercalculateAndValidateStockdeductStockrollbackStock,以及精简后的 processOrder 主函数。你可以继续追问”把自定义 Error 类也定义一下”,Chat 会基于上下文继续生成。

实战:用 Inline Edit 添加错误处理

你写了一个没有错误处理的 API 函数:

export async function fetchUserProfile(userId: string) {
  const response = await fetch(`/api/users/${userId}`);
  const data = await response.json();
  return data;
}

选中这个函数,按 Cmd + I,输入”添加错误处理:状态码检查、超时、类型校验”。AI 会生成 diff:

export async function fetchUserProfile(userId: string): Promise<UserProfile> {
  const controller = new AbortController();
  const timeoutId = setTimeout(() => controller.abort(), 5000);

  try {
    const response = await fetch(`/api/users/${userId}`, {
      signal: controller.signal,
    });
    if (!response.ok) {
      throw new ApiError('Failed to fetch user profile', response.status);
    }
    const data = await response.json();
    if (!isUserProfile(data)) {
      throw new ApiError('Invalid response format', response.status);
    }
    return data;
  } catch (error) {
    if (error instanceof DOMException && error.name === 'AbortError') {
      throw new ApiError('Request timeout', 408);
    }
    throw error;
  } finally {
    clearTimeout(timeoutId);
  }
}

审查 diff 时觉得哪里不对,直接拒绝那一处,手动调整就行。Inline Edit 的输出是起点,不是终点。

代码补全:整行与整函数

除了 Chat 和 Inline Edit,代码补全是你每时每刻都在用的功能。

// 你输入函数签名:
function debounce<T extends (...args: any[]) => any>(fn: T, delay: number) {

// Trae 自动补全整个函数体:
  let timeoutId: ReturnType<typeof setTimeout>;
  return (...args: Parameters<T>) => {
    clearTimeout(timeoutId);
    timeoutId = setTimeout(() => fn(...args), delay);
  };
}
操作快捷键说明
接受补全Tab接受整个建议
接受单词Cmd + →只接受到下一个单词
拒绝补全Esc忽略当前建议
触发补全Alt + \手动触发建议

补全不理想?按 Esc 后多输入几个字符,Trae 会重新生成建议。

对话历史管理技巧

Chat 用久了历史会越来越多,几个管理习惯:

1. 一个对话聚焦一个主题
   ✅ "购物车功能开发" 一个对话搞定
   ❌ 购物车、认证、支付混在一起

2. 第一轮就把上下文给足
   ✅ "React + TS 电商项目,Zustand 状态管理,现在需要..."
   ❌ "帮我写个组件"

3. 善用 @ 引用代替复制粘贴
   ✅ "@src/components/Cart.tsx 性能有问题"
   ❌ 把整个文件粘贴到对话框

4. 对 AI 输出及时反馈
   ✅ "方向对了,但 handleSubmit 不需要 try-catch,上层有统一处理"
   ❌ 默默接受,后面手动改

什么时候新建对话?如果你想说”忘掉之前的内容”,那就该新建了。历史对话可以右键重命名,方便后续查找。

小结

Chat 负责聊,Inline Edit 负责改。@ 引用给 AI 精准上下文,diff 审查让你对每处修改有掌控感,代码补全是无感的效率提升。

下一篇聊 Builder Mode——Trae 真正和其他 AI IDE 拉开差距的地方。

好的工具不会替代你思考,但会让你把更多时间花在值得思考的事情上。Chat 和 Inline Edit 处理重复和琐碎,你专注创造和决策。

评论

加载中...

相关文章

分享:

评论

加载中...