GitHub Copilot用了一段时间,发现很多人只用到了基础功能。

本文分享一些进阶技巧,包括更好的提示词、上下文管理、多文件协作、测试生成、代码重构,以及一些隐藏功能。

一、基础回顾

1. 什么是GitHub Copilot

GitHub Copilot是一个AI编程助手。

  • 由GitHub和OpenAI合作开发
  • 基于大语言模型
  • 集成在IDE中
  • 根据上下文自动补全代码

支持的IDE:

  • VS Code
  • Visual Studio
  • JetBrains系列
  • Neovim

2. 基础用法

基础用法很简单:

  • 写注释,Copilot生成代码
  • 写函数名,Copilot补全函数体
  • 写一半代码,Copilot继续写
  • 按Tab接受建议

但这些只是基础,Copilot还有很多进阶用法。

二、进阶技巧一:写更好的提示词

1. 注释要详细

注释越详细,生成的代码越好。

不好的注释:

// 排序数组
function sortArray(arr) {
  // Copilot可能生成简单的冒泡排序
}

好的注释:

// 对数字数组进行快速排序,升序排列,原地修改
// 时间复杂度O(n log n),空间复杂度O(log n)
// 参数:arr - 数字数组
// 返回:排序后的数组(原数组也会被修改)
function quickSort(arr) {
  // Copilot会生成更符合要求的快速排序
}

2. 给出输入输出示例

给出输入输出示例,Copilot理解更准确。

// 函数:格式化日期
// 输入:new Date(2023, 0, 15)
// 输出:"2023-01-15"
// 输入:new Date(2023, 11, 5)
// 输出:"2023-12-05"
function formatDate(date) {
  // Copilot会根据示例生成正确的格式化逻辑
}

3. 指定约束条件

在注释中指定约束条件。

// 函数:验证邮箱格式
// 约束:
// 1. 使用正则表达式
// 2. 不使用任何外部库
// 3. 性能要高,避免灾难性回溯
// 4. 返回布尔值
function validateEmail(email) {
  // ...
}

4. 用自然语言描述复杂逻辑

复杂逻辑,用自然语言描述清楚。

// 函数:计算两个时间段的重叠时长
// 逻辑:
// 1. 计算两个时间段的重叠开始时间(取较大的开始时间)
// 2. 计算重叠结束时间(取较小的结束时间)
// 3. 如果结束时间 <= 开始时间,返回0
// 4. 否则返回重叠的毫秒数
// 参数都是Date对象
function getOverlapDuration(start1, end1, start2, end2) {
  // ...
}

三、进阶技巧二:上下文管理

1. 打开相关文件

Copilot会参考当前打开的文件。

  • 如果你在写一个使用React组件的代码
  • 打开那个组件的定义文件
  • Copilot会参考组件的props和方法
  • 生成更准确的代码

2. 用注释引用其他文件

可以在注释中引用其他文件。

// 参考:./utils/helpers.js 中的 formatDate 函数
// 参考:./types/user.ts 中的 User 接口
function createUserCard(user) {
  // Copilot会参考这些文件
}

3. 利用代码库的模式

Copilot会学习你的代码库的模式。

  • 如果你的代码库用了特定的命名规范
  • 特定的代码结构
  • 特定的设计模式
  • Copilot会模仿这些模式

所以,代码库越规范,Copilot生成的代码越好。

四、进阶技巧三:多文件协作

1. 生成配套文件

写一个文件后,可以让Copilot生成配套文件。

比如写了一个React组件:

// Button.jsx
export function Button({ text, onClick }) {
  return <button onClick={onClick}>{text}</button>;
}

然后新建Button.test.js,Copilot会自动生成测试:

import { render, screen, fireEvent } from '@testing-library/react';
import { Button } from './Button';

test('renders button with text', () => {
  render(<Button text="Click me" onClick={() => {}} />);
  expect(screen.getByText('Click me')).toBeInTheDocument();
});

2. 生成类型定义

写了JavaScript代码后,可以让Copilot生成TypeScript类型定义。

// user.js
export function createUser(name, age) {
  return { id: Date.now(), name, age, createdAt: new Date() };
}

新建user.d.ts:

export interface User {
  id: number;
  name: string;
  age: number;
  createdAt: Date;
}

export function createUser(name: string, age: number): User;

3. 生成文档

写了代码后,可以让Copilot生成文档。

在函数上方写:

/**
 * 计算斐波那契数列的第n项
 * 
 * @param {number} n - 第几项(从0开始)
 * @returns {number} 第n项的值
 * @example
 * fibonacci(0) // 0
 * fibonacci(1) // 1
 * fibonacci(10) // 55
 */
function fibonacci(n) {
  // ...
}

Copilot会帮你补全JSDoc注释。

五、进阶技巧四:测试生成

1. 生成单元测试

选中函数,让Copilot生成测试。

// 选中这个函数
function calculateDiscount(price, discountPercent) {
  if (discountPercent < 0 || discountPercent > 100) {
    throw new Error('折扣比例必须在0-100之间');
  }
  return price * (1 - discountPercent / 100);
}

Copilot生成的测试:

describe('calculateDiscount', () => {
  test('正常折扣计算', () => {
    expect(calculateDiscount(100, 20)).toBe(80);
  });

  test('零折扣', () => {
    expect(calculateDiscount(100, 0)).toBe(100);
  });

  test('全额折扣', () => {
    expect(calculateDiscount(100, 100)).toBe(0);
  });

  test('折扣小于0抛出错误', () => {
    expect(() => calculateDiscount(100, -10)).toThrow('折扣比例必须在0-100之间');
  });

  test('折扣大于100抛出错误', () => {
    expect(() => calculateDiscount(100, 110)).toThrow('折扣比例必须在0-100之间');
  });
});

2. 生成边界测试

在注释中要求生成边界测试。

// 为下面的函数生成单元测试
// 要求覆盖:正常情况、边界情况、错误情况
function parseAge(ageStr) {
  const age = parseInt(ageStr);
  if (isNaN(age) || age < 0 || age > 150) {
    return null;
  }
  return age;
}

3. 生成集成测试

Copilot也能生成集成测试。

// 为用户注册流程生成集成测试
// 测试:注册成功、邮箱已存在、密码太弱、参数缺失

六、进阶技巧五:代码重构

1. 选中代码让Copilot优化

选中一段代码,让Copilot优化。

比如选中:

function getTotal(prices) {
  let total = 0;
  for (let i = 0; i < prices.length; i++) {
    total = total + prices[i];
  }
  return total;
}

然后写注释:

// 优化上面的函数,使用数组方法,更简洁

Copilot会生成:

function getTotal(prices) {
  return prices.reduce((sum, price) => sum + price, 0);
}

2. 代码转换

可以让Copilot转换代码。

JavaScript转TypeScript:

// 将下面的JavaScript代码转换为TypeScript
function add(a, b) {
  return a + b;
}

生成:

function add(a: number, b: number): number {
  return a + b;
}

Promise转async/await:

// 将下面的Promise链转换为async/await
function getData() {
  return fetch('/api/user')
    .then(res => res.json())
    .then(user => fetch(`/api/posts?userId=${user.id}`))
    .then(res => res.json());
}

生成:

async function getData() {
  const userRes = await fetch('/api/user');
  const user = await userRes.json();
  const postsRes = await fetch(`/api/posts?userId=${user.id}`);
  return postsRes.json();
}

3. 代码解释

看不懂的代码,让Copilot解释。

// 解释下面的代码在做什么
const debounce = (fn, delay) => {
  let timer;
  return (...args) => {
    clearTimeout(timer);
    timer = setTimeout(() => fn(...args), delay);
  };
};

Copilot会生成详细的解释。

七、进阶技巧六:隐藏功能

1. Copilot Chat

Copilot Chat是一个聊天界面,可以直接问问题。

  • 解释代码
  • 生成代码
  • 调试错误
  • 代码重构
  • 写测试

在VS Code中,打开Copilot Chat面板,直接输入问题。

2. 内联聊天

在代码中选中,按Ctrl+I,可以打开内联聊天。

  • 直接在代码旁边对话
  • 生成的代码直接替换选中部分
  • 更方便

3. 语音输入

Copilot支持语音输入。

  • 按住Ctrl+Alt+V
  • 用语音描述你想要的代码
  • Copilot会生成代码

适合不想打字的时候。

4. 命令面板

VS Code的命令面板里,有很多Copilot命令。

  • Copilot: Open Chat
  • Copilot: Generate Tests
  • Copilot: Explain This
  • Copilot: Fix This
  • Copilot: Make Better

可以快速调用各种功能。

八、最佳实践

1. 不要盲目接受

Copilot生成的代码,一定要审查。

  • 可能有bug
  • 可能有安全问题
  • 可能不符合你的代码规范
  • 可能不是最优解

AI是助手,不是替代。

2. 保持代码库规范

代码库越规范,Copilot生成的代码越好。

  • 统一的命名规范
  • 统一的代码结构
  • 清晰的注释
  • 好的类型定义

3. 小步生成

不要让Copilot一次生成太多代码。

  • 一个函数一个函数地生成
  • 每生成一个,就审查和测试
  • 小步迭代
  • 质量更高

4. 结合自己的思考

Copilot是工具,思考还是要靠自己。

  • 先想清楚要做什么
  • 再让Copilot生成
  • 审查和修改
  • 不要完全依赖

5. 保护敏感信息

不要把敏感信息发给Copilot。

  • API密钥
  • 密码
  • 客户数据
  • 公司机密

Copilot可能会学习这些信息。

九、常见问题

1. Copilot生成的代码有bug怎么办?

  • 审查代码
  • 修改bug
  • 用更详细的提示词重新生成
  • 自己写关键部分

2. Copilot生成的代码不符合规范怎么办?

  • 在提示词中说明规范
  • 打开相关文件作为参考
  • 手动调整
  • 用ESLint/Prettier统一格式

3. Copilot太慢怎么办?

  • 检查网络
  • 减少打开的文件
  • 简化提示词
  • 升级Copilot计划

4. Copilot收费吗?

  • 个人用户:每月10美元
  • 企业用户:每月19美元
  • 学生可以免费申请
  • 有30天免费试用

十、写在最后

GitHub Copilot是一个强大的AI编程助手,但很多人只用到了基础功能。

通过更好的提示词、上下文管理、多文件协作、测试生成、代码重构,以及隐藏功能,可以大大提高编程效率。

但记住:Copilot是助手,不是替代。审查代码、保持思考、保护敏感信息,这些都是必须的。

2023年了,AI编程越来越普及。掌握Copilot的进阶技巧,能让你在AI时代更有竞争力。

最后,用一句话总结:"Copilot的价值,不在于它能写多少代码,而在于你能多好地引导它。好的提示词 + 审查 + 迭代,才能发挥Copilot的最大价值。"

愿你用好AI编程工具,写出更好的代码。