Github Copilot 备忘清单

这是开始使用 Github Copilot 的快速参考指南

一、准备工作

1、账号注册

需要先拥有一个Github账号,并订阅Copilot。

事项说明
Github 账号注册地址
订阅 Github Copilot订阅地址

2、安装Vscode插件

在扩展商店中搜索安装下面插件

插件名称功能
GitHub Copilot编辑器中进行代码补全提示
GitHub Copilot Chat插件栏可以与copilot对话

3、Vscode 中登陆 Github 账号

  • 安装后,点击右下角的 GitHub Copilot 插件图标,然后点击 Sign in to GitHub 登陆。
  • 或者,点击工具栏中的 Accounts 图标,然后点击 使用 Github 登陆以使用Github Copilot 进行登陆。

4、Copilot 订阅方案

方案价格特性
Copilot Individual10美元/人/月
(学生, 教师, 开源项目贡献者 免费)
代码补全, 聊天机器人
Copilot Business19美元/人/月代码补全, 聊天机器人, 命令行工具, 安全漏洞筛查, 代码参考, 公共代码筛查, 知识产权, 企业安全与隐私保障
Copilot Enterprise39美元/人/月Business 特性 + 私有代码库的个性化聊天 + 文档搜索总结 + Git Pull Request 摘要 + 代码审查 + 模型微调

5、Copilot 使用入口

名称描述
Inline Suggestions在编辑器中紧邻光标所在位置显示建议
Completions Panel在编辑器中展示完整的建议列表
Inline Chat在编辑器中紧邻光标所在位置发起对话
Editor Chat在编辑器中打开完整的对话界面
Silde Chat在编辑器的侧边栏打开对话界面
Quick Chat在顶部唤起对话界面

二、提示技巧

提示之禅

你与 copilot 之间的关系,就是作家和插画师的关系。
你只有尽可能的全面、干练、清晰的描述你的故事(即 上下文)。
copilot 才能根据你的故事画出精美的插画 (即 代码 )。

提示技巧

  • 1⃣️ 提供上下文信息
  • 2⃣️ 上下文可被预测

上下文信息的种类

类型说明
文件Copilot会查看编辑器中当前和紧邻打开的文件。
注释Copilot会根据紧邻的注释,为你的代码提供帮助和建议。如 docstring, 块注释, 行注释之类。
命名良好的命名能帮助Copilot更好地理解你的代码,如函数名, 变量名, 文件名等
代码Copilot会查看你的代码和它附近的代码,以生成帮助你的建议。

上下文:文件

Copilot会查看编辑器中当前和紧邻打开的文件,以分析上下文并提供适当的建议。


  • 1、避免打开过多的文件,以便Copilot能够更好地理解你的代码。
  • 2、打开的文件尽量相关且有共性。
  • 3、如果是新项目,可以打开一些模版代码、数据文件以及参考文档等相关示例文件。以便Copilot能够更好地理解你的期望。等已经开发了一些代码后,这些示例文件就可以删除了。

上下文: 注释: 顶部注释

创建一个新文件时,在文件顶部添加注释,描述你的需求。这对 Copilot 很有帮助。

* 下面说明将使用...表示copilot开始生成的位置

# Download file from an URL and analyze its content
# Details: 
# * Download the file from an URL
# * Save the downloaded files into `./download` folder
# * Use `filetype` of the file to specify how to parse
# * Filetype can be `.pdf`, `.html`, `.epub`, `.md` and `.txt`
# * Use NLP or OCR to get the file content
# * Tokenize the file content and get the statistics result

import  ...

上下文: 注释: 行内注释

在每个函数上面或重要代码块的上面添加注释,以帮助 Copilot 了解你代码中的一些意图或问题。

* 下面说明将使用...表示copilot开始生成的位置

函数上方添加注释说明

# parse the JSON string into User object
def ...

代码添加注释说明

# ...
api_sever = FastApi(...)

# starting the API Sever, enable ssl, bind to 8443 port
...

上下文: 注释: Docstring

有时候当你已经拥有详细设计文档,但未编写功能代码时,可以直接使用 docstring 中的描述来让 copilot 生成代码。

def send_email(to_address: Email, subject: str, content: HTML): -> StatusCode:
    """
    Send email to specified address

    Parameters
    ----------
    to_address : Email
        The email address to send to
    subject : str
        The email subject
    content : HTML
        The email content

    Returns
    -------
    StatusCode
        The sending result
    """

    ...

上下文: 注释: 提问

如果你不想切换到 copilot chat 时,注释也可以用于提问。

# Q: What is the difference between `os.path.join` and `pathlib.PurePath`?
# A: ...

上下文: 注释: Todo

你也可以让 copilot 为你生成 todo 列表来评估工作量。

# Parse the json file into a Talks object
# TODO:
# -[ ] 1. ...

上下文: 命名

你的命名应该足够明确以便于 Copilot 理解你的意图

bad case

a = 60

def send(dict):
    ...

class data:
    ...

good case

timeout = 60

def send_email(to_address: Email, subject: str, content: HTML): -> StatusCode:
    ...

class Email:
    ...

上下文: 代码: 代码示例

提供片段代码示例,以帮助 Copilot 更好地开始新的开发任务。

  • 使用的框架与库
  • 代码风格
  • 算法逻辑
from typing import List
from typing import Optional
from sqlalchemy import ForeignKey
from sqlalchemy import String
from sqlalchemy.orm import DeclarativeBase
from sqlalchemy.orm import Mapped
from sqlalchemy.orm import mapped_column
from sqlalchemy.orm import relationship

class Base(DeclarativeBase):
    pass

class User(Base):
    __tablename__ = "user_account"
    id: Mapped[int] = mapped_column(primary_key=True)
    name: Mapped[str] = mapped_column(String(30))
    fullname: Mapped[Optional[str]]
    addresses: Mapped[List["Address"]] = relationship(
        back_populates="user", cascade="all, delete-orphan"
    )
    def __repr__(self) -> str:
        return f"User(id={self.id!r}, name={self.name!r}, fullname={self.fullname!r})"

# Email Address
...

上下文: 代码: 数据示例

提供片段数据示例,以帮助 Copilot 更好地开始新的开发任务。

  • 数据结构与类型
  • 命名
  • 值处理逻辑

dailogs = [
    {
        "timestamp": "May 1, 2023 11:00:00",
        "text": "Hello, World!",
        "speaker": "Jack",
    },
    {
        "timestamp": "May 1, 2023 11:01:00",
        "text": "Hello, Copilot!",
        "speaker": "Copilot",
    },
]

# Parse the json object into `Dialog` object
...

三、快捷键

对于mac用户建议修改alt相关的快捷键,因为mac上的alt+字母键有可能被输入法使用了。若有自定义过输入法keylayout,则忽略这句话。

另外没有快捷键的命令,可以唤起命令面板后输入查询关键字筛选后执行。

Github Copilot

Copilot 中 Inline Suggestions 相关命令

命令说明快捷键Mac 快捷键
editor.action.inlineSuggest.trigger触发内联建议alt+\alt+\
editor.action.inlineSuggest.showPrevious显示上一个内联建议alt+[alt+[
editor.action.inlineSuggest.showNext显示下一个内联建议alt+]alt+]
editor.action.inlineSuggest.acceptNextWord接受内联建议的下一个字ctl+rightcmd+right
editor.action.inlineSuggest.commit接受内联建议TabTab
editor.action.inlineSuggest.hide隐藏内联建议EscEsc
editor.action.inlineSuggest.acceptNextLine接受内联建议的下一行--

Copilot 中 Completions Panel 相关命令

命令说明快捷键Mac 快捷键
github.copilot.generate打开 Completions Panelctrl+enterctrl+enter
github.copilot.acceptCursorPanelSolution接受Completions Panel光标所在的建议ctrl+/ctrl+/
github.copilot.previousPanelSolution查看上一个建议alt+[alt+[
github.copilot.nextPanelSolution查看下一个建议alt+]alt+]

Copilot 中 其他命令

命令说明快捷键Mac 快捷键
github.copilot.toggleCopilot启用/禁用 Copilot 补全提示--
github.copilot.collectDiagnostics收集诊断信息--
github.copilot.openLogs打开日志窗口--
github.copilot.sendFeedback打开社区网站--
github.copilot.signIn登陆--

Github Copilot Chat

Copilot Chat 中 Chat 相关命令

命令说明快捷键Mac 快捷键
github.copilot.interactiveEditor.explain进行解释(选中内容或光标所在的文件)--
github.copilot.terminal.explainTerminalSelection对此进行解释(需要在终端中使用)--
github.copilot.terminal.explainTerminalSelectionContextMenuCopilot: 对此进行解释(需要在终端中使用)鼠标右键菜单鼠标右键菜单
github.copilot.terminal.explainTerminalLastCommand对终端中最后一个命令进行解释(需要在终端中使用)--

Copilot Chat 中 Inline Chat 相关命令

命令说明快捷键Mac 快捷键
inlineChat.start代码内聊天--
github.copilot.interactiveEditor.generate在此生成(在光标所在位置唤起inline chat的/generate功能)--
github.copilot.interactiveEditor.generateDocs生成文档--
github.copilot.interactiveEditor.generateTests生成测试--
github.copilot.interactiveEditor.fix修复此--

Copilot Chat 中 Quick Chat 相关命令

命令说明快捷键Mac 快捷键
workbench.action.quickchat.toggle开启/关闭 Quick Chatshift+cmd+ishift+cmd+i
github.copilot.terminal.suggestCommand建议终端命令ctrl+i(仅在终端起作用)cmd+i

Copilot Chat 中 Editor Chat 相关命令

命令说明快捷键Mac 快捷键
workbench.action.openChat.copilot打开编辑器聊天--

Copilot Chat 其他命令

命令说明快捷键Mac 快捷键
github.copilot.interactiveSession.feedback打开github Issues--
github.copilot.debug.workbenchState日志工作台状态--
github.copilot.ghpr.applySuggestion为Github Pull Request提供代码建议--

四、Copilot Chat 的 Slash Commands 使用技巧

在聊天对话框中可以通过/开头的命令来与Copilot Chat进行交互。

Slash Commands 示例

Slash Commands 由四部分构成

元素说明
- Agent指定Agent, 符号为 @, 可选
- Commands指定命令, 符号为 /, 可选
- 变量引用内容, 符号为 #, 可选
- 用户输入的指令可选

例子

/explain def helloworld():...

@vscode /api 请解释 inlineChat.start 的作用

@workspace /explain def helloworld():...

在每一行代码末尾添加注释进行解释

Agent

Agent说明
@vscodevscode命令与插件的问题
@workspace项目workspace相关的问题

Inline Chat 的 Slash Commands


通过命令 inlineChat.start 触发 inline chat 后使用

命令说明
/doc在此添加文档注释
/explain对选中的代码进行解释
/fix修复此选中的代码
/tests为选中的代码生成单元测试

通过命令 github.copilot.interactiveEditor.generate 触发

命令说明
/generate在此生成, 该命令无法由用户输入

当然也可以直接选中区域,然后在inline chat中输入指令执行 copilot会对选中区域进行指令操作

常用指令
在每一行代码末尾添加注释进行解释
使代码满足PEP484要求

Silde Chat 的 Slash Commands

通过命令 workbench.action.chat.openInSidebar 触发 chat 后使用
或点击侧边栏上的Copilot聊天按钮
在Chat输入框中还允许指定Agent(即环境)

Slash Commands

命令说明
/api回答vscode扩展插件开发的问题
/explain对选中的代码进行解释
/fix修复此选中的代码
/new创建新项目workspace
/newNotebook创建新的Jupyter Notebook
/terminal解释命令行里的命令
/tests为选中的代码生成单元测试
/help帮助说明
/clear清除会话

/terminal特有的变量, 以#号开头

仅在/terminal命令中可用

变量说明
#terminalLastCommand最后一次执行的终端命令
#terminalSelection选中的终端命令

的 Slash Commands

  • Quick Chat 与 Chat 的 Slash Commands相同
  • Editor Chat 与 Chat 的 Slash Commands相同

五、参数设置

打开vscode 命令面板, 输入Preferences:Open Settings 打开配置文件,在文件模式下配置相关参数.

完整参数说明可以查看 copilotcopilot chat 两个插件目录下的 package.json 文件获知。

完整配置参考

// settings.json
{   
    // ...
    "github.copilot.chat.welcomeMessage": "always",
    "github.copilot.chat.localeOverride": "zh-CN",
    "github.copilot.editor.enableCodeActions": true,
    "github.copilot.editor.iterativeFixing": true,
    "github.copilot.editor.enableAutoCompletions": true,
    "github.copilot.enable": {
        "plaintext": false,
        "ini": false,
        "markdown": true,
        "*": true
    },
    "github.copilot.advanced": {
        "length": 4000,
        "inlineSuggestCount": 5,
        "top_p": 1,
        "temperature": "0.8",
        "listCount": 10,
        "stops": {
            "*": [
                "\n\n\n"
            ],
            "python": [
                "\ndef ",
                "\nclass ",
                "\nif ",
                "\n\n#"
            ]
        },
        "debug.showScores": true,
        "indentationMode": {
            "python": false,
            "javascript": false,
            "javascriptreact": false,
            "jsx": false,
            "typescript": false,
            "typescriptreact": false,
            "go": false,
            "ruby": false,
            "*": true
        }
    }
    // ...
}

参数说明

代理参数

设置参数值类型说明
"http.proxy"string配置网络代理地址

Copilot Chat 参数

设置参数值类型说明
"github.copilot.chat.localeOverride"string设置Copilot本地语言
"github.copilot.chat.welcomeMessage"stringCopilot Chat 是否显示欢迎语
first: 仅第一次启动时, always: 总是, never: 从不

Copilot 基本参数

设置参数值类型说明
"editor.inlineSuggest.enabled"boolean启用内联建议
"github.copilot.editor.iterativeFixing"boolean允许 Copilot 提供迭代修复建议
"github.copilot.editor.enableAutoCompletions"boolean允许 Copilot 提供自动补全
"github.copilot.editor.enableCodeActions"boolean允许 Copilot 代码操作建议,这些操作可能包括重构代码、优化代码结构、修复可错误等

设置 Copilot 生效的文件类型

设置参数值类型说明
"github.copilot.enable"json请将 "*": true 放到末尾
语言后设置 false 表示禁用copilot, 设置 true 表示启用

Copilot 高级参数

github.copilot.advanced 可以控制模型参数,最终影响到代码生成. 其值为json

设置参数值类型说明
"length"integer生成的代码字数, 默认为 500
"top_p"number控制模型候选范围,默认值为 1,值范围为0.0~1.0
"temperature"string控制模型的创造性,默认值为 "",值越大越不可预测,值范围为0.0~1.0
"inlineSuggestCount"integer内联提示的个数, 默认为3
"listCount"integer控制Completions Panel中建议个数,默认为 10
"stops"json控制模型代码生成时停止的标志,可以按语言来控制
"indentationMode"json指定语言是否采用该语言的缩近模式,由此可能会与stops冲突,比如采用\{\}缩近时,设置该参数时需要综合考虑
"debug.showScores"boolean在代码建议列表中显示每个建议的分数

END... ENJOY YOURSELF

欢迎大家添加新内容,校对、错误请指正。📮邮箱: jussker@outlook.com