当前位置: 首页 > news >正文

Github Copilot 使用技巧

🎯目标读者

  • 本文不包含如何安装 Github Copilot
  • 本文介绍了 Github Copilot 使用方法和一些技巧

本人已经使用 Github Copilot 2 年了,交了 3 次年费,每年 100$ 着实心痛,但是用着确实爽歪歪

但是感觉一直只用了一小部分功能,并没有物有所值,遂学习了一下 Github Copilot 的使用方法,也是了解了一些之前不知道的东西,在这里分享给感兴趣的人。☝️☝️☝️

想快速概览本文,可以参考如下目录
(我一开的水平处于 “代码补全使用” 的初级阶段 🤣,想想之前这 200$ 着实心痛)

  • 第一部分 - 代码补全使用:这部分是基础使用,重点是通过功能和快捷键的使用提高效率
  • 第二部分 - Copilot Chat 使用:这部分介绍了 Copilot Chat 能干什以及一些基本使用方法
  • 第三部分 - Copilot Chat 使用案例:绝对值得一看,一些实际的使用例子
  • 第四部分 - Github Copilot 的提示工程:如何更好的让 Copilot 理解你的意图

我觉得很重要的一些点

  • 如何引用文件和代码,让 Copilot 知道你在问什么
  • Copilot Chat 中 / + 关键词 的使用,可以明确你的意图,并且不需要编写大量的提示词
  • 如何修改 Copilot 的快捷键(JetBrains IDE),要不然有的快捷键使不出来很头大
  • 一些提示词的良好实践,不过大多数无论是 Copilot 还是 Chatgpt 都是试用的
    (LLM 提示词工程的思路和技巧大同小异,但每个 LLM 模型都有自己的一些 “偏好”)

目录

  • 🎯目标读者
  • 1. 代码补全使用
    • 1.1 基础中的基础
    • 1.2 补全切换
    • 1.3 新窗口中打开所有补全候选
    • 1.4 接受补全中的一部分(一个单词或者一行)
    • 🌟🌟🌟 !!!重要:如何修改 Copilot 的快捷键!!! 🌟🌟🌟
  • 2. Copilot Chat 使用
    • 2.1 在提示中使用命令(`/ + 关键词`)
    • 2.2 引用参考代码文件
  • 3. Copilot Chat 使用案例
    • 3.1 提问通用的软件问题
    • 3.2 问有关项目的问题
    • 3.3 写代码
    • 3.4 修复、改进和重构代码
    • 3.5 编写测试代码
  • 4. Github Copilot 的提示工程
    • 4.1 从通用到具体
    • 4.2 提供示例(注意:这个示例我没有尝试成功,无法生成良好的代码)
    • 4.3 将复杂的任务分解为简单的任务(所有的提示工程中,这一条都很适用)
    • 4.4 避免模糊不清的语句
    • 4.5 明示相关代码
    • 4.6 尝试和迭代
    • 4.7 遵循良好的编码实践
  • 官方参考文档

1. 代码补全使用

1.1 基础中的基础

最简单的使用,就是当你写一部分代码以后,Github Copilot 会提示你他的补全代码,按 tab 键则接受他的补全。如果是已有代码,就把光标移过去按空格就可以触发补全。(即补全是收每次键盘动作触发的)

补全的场景包括:

  • 代码补全
    • 根据文件名补全
    • 根据函数名补全
    • 根据注释补全
    • 他们的综合
  • 注释补全
  • xml、sql 等等等补全(例如 mybatis 的 xml 文件也可以补全)

相信我,在我写这篇文章之前我只知道这一个用法 😫😫😫

1.2 补全切换

Github Copilot 会生成多种补全方案,用如下快捷键切换

OS下一个补全前一个补全
macOSOption+]Option+[
Windows or LinuxAlt+]Alt+[

1.3 新窗口中打开所有补全候选

如果您不想使用 GitHub Copilot 提供的任何初始建议,您可以在新选项卡中显示多个建议。

在提示的时候使用快捷键

OS新窗口打开全部提示
macOSCommand+Shift+A
Windows or LinuxCtrl+Enter

在这里插入图片描述

1.4 接受补全中的一部分(一个单词或者一行)

你可以只接受一行或者一个单词,在实际中这很有用。我之前不知道,都是先全部接受,再删除不需要的部分,非常的蠢!

OS接受下一个词接受下一行
macOSCommand+→Command+Control+→
Windows or LinuxControl+→Control+Alt+→

🌟🌟🌟 !!!重要:如何修改 Copilot 的快捷键!!! 🌟🌟🌟

需改配置这个很重要,因为我一开始有一个功能就怎么试都不能成功,最后发现是配置的原因。

在这里插入图片描述
之前介绍的所有配置都在这里,有的时候可能会有快捷键冲突或者未配置,修改这里即可。
在这里插入图片描述

2. Copilot Chat 使用

你可以让 Copilot Chat 提供代码建议、解释代码、生成单元测试并建议代码修复。

  1. 通过单击JetBrains IDE窗口右侧的Copilot Chat图标打开Copilot Chat窗口。
  2. 在提示框中输入提示。
  3. 评估 Copilot Chat 的答复,在需要时进一步提交新的提示词。
    返回通常包括 交互式元素。例如,响应可能包括复制或插入代码块的按钮。
    要查看 Copilot Chat 生成响应的用到的文件,请选择响应下方的引用下拉列表
  4. 如何在输入中换行Shift + Enter

2.1 在提示中使用命令(/ + 关键词

使用斜杠命令避免为常见场景编写复杂的提示。要使用斜杠命令,请在聊天提示框中键入/,然后键入命令。
(键入 / 后,IDE 会提示你可用的命令有哪些)

斜杠命令包括:

  • /tests:为选定的代码生成单元测试
  • /fix:对所选代码中的问题提出修复建议
  • /explain:解释所选代码
  • /help:了解有关使用Copilot Chat的更多信息

比如在我的对话框中,可以使用如下命令

在这里插入图片描述

2.2 引用参考代码文件

默认情况下,Copilot Chat 将引用打开的文件或选择的代码。

还可以通过将文件拖到聊天提示框中来告诉 Copilot Chat 要引用哪些文件。

或者,您可以右键单击文件,选择 GitHub Copilot,然后在 Chat 中选择参考文件。

3. Copilot Chat 使用案例

可以向 Copilot Chat 询问有关项目的特定问题一般软件问题
还可以让 Copilot Chat 编写代码、修复错误、编写测试和增加注释。

3.1 提问通用的软件问题

可以向 Copilot Chat 提出通用的软件问题。例如:

告诉我 nodejs 服务端常用的框架选型
如何构建一个 express 服务
如何更新一个 npm 软件包

3.2 问有关项目的问题

可以向 Copilot Chat 询问有关项目的问题。请尝试以下策略以给 Copilot 提供正确的上下文:

  • 光标选中高亮相关的代码行。
  • 在 IDE 中打开相关文件。
  • 添加文件作为参考。(上一节介绍了,可以看一下)

你的提问可以例如:

这个函数使用了什么排序算法
这些文件是如何关联在一起的(需要引用所有文件)

3.3 写代码

可以让 Copilot 为您编写代码。例如:

写一个将列表中所有数字加在一起的函数
给这个函数增加一个错误处理逻辑

当 Copilot 返回代码块时,响应包括可交互的选项,用来复制代码或在光标处插入代码。

在这里插入图片描述

3.4 修复、改进和重构代码

如果打开的文件包含错误,请使用 /fix 斜杠命令要求Copilot修复错误。

还可以提出要求来改进或重构代码,例如:

如何改进这个代码
使用 C# 重写改代码
给这个代码添加错误处理逻辑

3.5 编写测试代码

使用 /tests 斜杠命令要求 Copilot 为打开的文件或选定代码编写测试。例如:

/tests
/tests 使用 Jest 框架
/tests 确保这个函数不接受任何空列表

/tests 斜杠命令为现有代码编写测试。如果想在编写代码之前编写测试(测试驱动开发),去掉 /tests 命令。例如:

给一个对列表元素进行求和的 JavaScript 函数编写测试代码

在这里插入图片描述

4. Github Copilot 的提示工程

4.1 从通用到具体

在为 Copilot 编写提示时,首先给 Copilot 一个目标或场景的广泛描述。然后列出任何具体要求。

例如:

写一个判断是否为质数的函数
该函数应该接受一个整数,如果整数是质数,则返回true
如果输入不是合法正整数,函数应该告知调用方错误

在这里插入图片描述

4.2 提供示例(注意:这个示例我没有尝试成功,无法生成良好的代码)

使用示例帮助 Copilot 了解您想要什么。您可以提供示例输入数据、示例输出和示例实现。例如:

编写一个函数,查找字符串中的所有日期并将它们返回到数组中。日期的格式可以如下所示:

  • 05/02/24
  • 05/02/2024
  • 5/2/24
  • 5/2/2024
  • 05-02-24
  • 05-02-2024
  • 5-2-24
  • 5-2-2024

使用示例:
findDates(“我在11/14/2023预约了牙医,12-1-23要去参加读书俱乐部”)
返回:[“11/14/2023”,“12-1-23”]

单元测试也可以作为示例。在编写函数之前,您可以使用 Copilot 为函数编写单元测试。
然后,您可以要求 Copilot 编写一个由这些单元测试描述的函数。

4.3 将复杂的任务分解为简单的任务(所有的提示工程中,这一条都很适用)

如果您希望 Copilot 完成复杂或大型任务,请将任务分解为多个简单的小型任务。

例如,不要让 Copilot 生成单词搜索拼图,而是将过程分解为更小的任务,并让 Copilot 一个接一个地完成它们:

  1. 编写一个函数来生成一个10 x 10的字母网格。
  2. 编写一个函数来查找字母网格中的所有单词,给定一个有效单词列表。
  3. 编写一个函数,使用前面的函数生成一个10 x 10的字母网格,其中至少包含10个单词。
  4. 更新之前的功能以打印字母网格和网格中的10个随机单词。

4.4 避免模糊不清的语句

避免模棱两可的术语。例如,当你问 “这是干什么的” 的时候,“这” 既可以指代当前文件,也可以指代上一个 Copilot 的回答,或者又可以指代一段特定的代码块。你应该这么问:

  • createUser 函数有什么作用?
  • 上一个回复中的代码有什么作用?

歧义也适用于引入的第三方库:

  • 如果您使用的是不常见的库,请描述该库的作用。
  • 如果你想要使用特定库,请在文件顶部使用 import 语句导入,或指定要使用的库。(这样 Copilot 才能感知到你的意图)

4.5 明示相关代码

如果您在 IDE 中使用 Copilot,请打开相关文件,并关闭不相关的文件。Copilot将使用打开的文件来理解您的请求。

如果您在 IDE 中使用 Copilot Chat,请 打开该文件或高亮你希望 Copilot 引用的代码。还可以在 Copilot Chat 中指定应引用哪些文件。

4.6 尝试和迭代

如果没有得到想要的补全或者生成结果,迭代提示次并反复尝试

如果在编码时使用 Copilot 获取建议,您可以完全删除补全代码并重新开始;或者可以保留建议并要求进行修改。

如果使用的是 Copilot Chat,可以在下一个提示词中引用之前的回答结果。或者,可以删除之前的回答并整体重新开始。

4.7 遵循良好的编码实践

如果您在向 Copilot 询问代码库中的建议或解释时没有得到您想要的回复,请确保现有的代码遵循最佳实践并且易于阅读。例如:

  • 使用一致的代码风格和模式
  • 为变量和函数使用描述性名称
  • 代码被组织成合理的模块、组件或者域

官方参考文档

  • 快速入门:https://docs.github.com/en/copilot/quickstart
  • IDE 中使用 Copilot 技巧:https://docs.github.com/en/copilot/using-github-copilot/getting-code-suggestions-in-your-ide-with-github-copilot
  • IDE 中使用 Copilot Chat:https://docs.github.com/en/copilot/using-github-copilot/asking-github-copilot-questions-in-your-ide
  • Copilot Chat 的使用示例:https://docs.github.com/en/copilot/using-github-copilot/example-use-cases/example-prompts-for-copilot-chat
  • 提示工程:https://docs.github.com/en/copilot/using-github-copilot/prompt-engineering-for-github-copilot

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 连锁店收银系统源码
  • 介绍springmvc-水文
  • uni-app开发微信小程序注意事项,不要用element-ui
  • 【大模型理论篇】GPT系列预训练模型原理讲解
  • WebDeveloper靶机复现
  • Github 2024-08-13 开源项目日报 Top10
  • C#图片批量下载Demo
  • 在 CMakeLists.txt 中,我需要设置哪些参数来确保我的程序能够正确地链接到 ARM 架构的库?
  • RPP:多智能体强化学习 + 长期个性化推荐
  • AI Edge Torch - PyTorch 模型转换为 TensorFlow Lite 模型 (.tflite)
  • 让一切发生皆有利于我,在人生的长河中,我们常常面临诸多的不确定性和变化
  • AI模型常见的压缩技术分类
  • Prometheus+Grafana保姆笔记(1)——Prometheus+Grafana的安装
  • 【STM32系统】基于STM32设计的按键PWM控制舵机窗帘柜子门禁家居等控制系统——文末资料下载
  • docker上传镜像至阿里云
  • 【399天】跃迁之路——程序员高效学习方法论探索系列(实验阶段156-2018.03.11)...
  • 2017年终总结、随想
  • Android Volley源码解析
  • HomeBrew常规使用教程
  • JavaScript/HTML5图表开发工具JavaScript Charts v3.19.6发布【附下载】
  • JS创建对象模式及其对象原型链探究(一):Object模式
  • opencv python Meanshift 和 Camshift
  • overflow: hidden IE7无效
  • PermissionScope Swift4 兼容问题
  • React的组件模式
  • Redis中的lru算法实现
  • springboot_database项目介绍
  • text-decoration与color属性
  • Travix是如何部署应用程序到Kubernetes上的
  • 阿里云ubuntu14.04 Nginx反向代理Nodejs
  • 阿里云购买磁盘后挂载
  • 分享一个自己写的基于canvas的原生js图片爆炸插件
  • 工作中总结前端开发流程--vue项目
  • 构建二叉树进行数值数组的去重及优化
  • 记一次删除Git记录中的大文件的过程
  • 开发基于以太坊智能合约的DApp
  • 力扣(LeetCode)56
  • 使用Swoole加速Laravel(正式环境中)
  • 在 Chrome DevTools 中调试 JavaScript 入门
  • ​猴子吃桃问题:每天都吃了前一天剩下的一半多一个。
  • #Js篇:单线程模式同步任务异步任务任务队列事件循环setTimeout() setInterval()
  • #LLM入门|Prompt#2.3_对查询任务进行分类|意图分析_Classification
  • (003)SlickEdit Unity的补全
  • (13)Hive调优——动态分区导致的小文件问题
  • (Charles)如何抓取手机http的报文
  • (Redis使用系列) SpirngBoot中关于Redis的值的各种方式的存储与取出 三
  • (webRTC、RecordRTC):navigator.mediaDevices undefined
  • (十六)Flask之蓝图
  • (一)eclipse Dynamic web project 工程目录以及文件路径问题
  • (自适应手机端)响应式服装服饰外贸企业网站模板
  • .NET Core WebAPI中封装Swagger配置
  • .net framework profiles /.net framework 配置
  • .NET NPOI导出Excel详解
  • .Net 路由处理厉害了
  • .net使用excel的cells对象没有value方法——学习.net的Excel工作表问题