The GitHub Blog

Give GitHub Copilot CLI real code intelligence with language servers

8.5内容质量
Give GitHub Copilot CLI real code intelligence with language servers

TL;DR · AI 摘要

GitHub Copilot CLI 现在通过语言服务器协议(LSP)实现更精准的代码理解,提升代码补全和分析能力。

核心要点

  • LSP 提供了比文本搜索更精确的语义分析能力,如类型解析和定义跳转。
  • LSP Setup 技能支持 14 种语言,自动安装和配置 LSP 服务器。
  • LSP 可以解析编译后的字节码,而文本搜索方法无法做到。

结构提纲

按章节快速跳转。

  1. GitHub Copilot CLI 通过语言服务器协议实现更精准的代码理解。

  2. 没有 LSP 时,GitHub Copilot CLI 依赖文本搜索和字节码提取来反向工程 API 信息。

  3. LSP 提供了语义分析能力,如类型解析和定义跳转,而文本搜索方法无法做到。

  4. LSP Setup 技能通过七步工作流程自动安装和配置 LSP 服务器。

  5. LSP Setup 技能通过用户选择确定需要 LSP 支持的语言。

  6. LSP Setup 技能允许用户选择配置范围,如用户级别或仓库级别。

思维导图

用一张图看清主题之间的关系。

查看大纲文本(无障碍 / 无 JS 友好)
  • GitHub Copilot CLI 与 LSP
    • 问题:启发式代码理解
      • 文本搜索方法的局限性
      • 无法解析编译后的字节码
    • LSP 的优势
      • 语义分析能力
      • 类型解析和定义跳转
    • LSP Setup 技能
      • 支持 14 种语言
      • 自动安装和配置 LSP 服务器

金句 / Highlights

值得收藏与分享的关键句。

#GitHub Copilot#LSP#代码智能#AI 编程
打开原文

标题:通过语言服务器为 GitHub Copilot CLI 提供真正的代码智能

URL 源:https://github.blog/ai-and-ml/github-copilot/give-github-copilot-cli-real-code-intelligence-with-language-servers/

发布时间:2026-06-10T09:00:00-07:00

Markdown 内容: 你是否曾经看过 GitHub Copilot CLI 将一个 JAR 文件提取到临时目录,搜索 .class 文件,并从原始字节码中拼凑出一个 API 签名?这个代理虽然很能干,但没有语言服务器,它能做到的也就这么多了。

语言服务器协议(LSP)是像 VS Code 这样的编辑器中实现“跳转到定义”、“查找引用”和“类型解析”的标准。它在终端中同样有效。LSP 设置技能会自动安装和配置 Copilot CLI 的 LSP 服务器,这样代理就能得到关于你代码的精确、结构化的答案,而不是依赖文本搜索启发式方法。

在本文中,你将了解这个技能是如何在内部工作的,看到它生成的配置格式,并为它目前支持的 14 种语言之一进行设置。

问题:启发式的代码理解

没有 LSP 服务器时,GitHub Copilot CLI 中的代理通过文本搜索和二进制提取来逆向工程 API 信息。对于 Java 项目,这可能看起来像:

code
# 查找依赖 JAR
find ~/.m2/repository -name "*httpclient*.jar" 

# 将其提取到临时目录
mkdir /tmp/httpclient && cd /tmp/httpclient 
jar xf ~/.m2/repository/org/apache/httpcomponents/httpclient/4.5.14/httpclient-4.5.14.jar 

# 在提取的类文件中搜索方法
grep -r "execute" --include="*.class" .

对于 Python,代理可能会 cat 文件在 site-packages 中。对于 TypeScript,它会遍历 node_modules。这些基于文本的方法在简单情况下有效,但它们只是在原始文本上进行模式匹配,而不是真正的语义分析,因此会遗漏泛型、重载和传递类型,甚至无法看到编译后的字节码。这正是语言服务器可以弥补的空白。

LSP 服务器从结构上解决了这个问题。当代理发送 textDocument/definition 请求以获取某个符号的定义时,语言服务器会返回确切的源代码位置、完全解析的类型和签名。

LSP 设置技能的工作原理

当被触发时,该技能执行一个七步工作流程:

1. 语言选择

代理使用 ask_user 和一组选项来确定用户需要哪种语言的 LSP 支持。这将驱动所有后续步骤。

2. 操作系统检测

代理运行 uname -s(或在 Windows 上检查 $env:OS / %OS%)以确定目标平台。安装命令因操作系统而异。例如,在 macOS 上使用 brew install jdtls,而在 Linux 上则从 eclipse.org 下载。

3. LSP 服务器查找

该技能包含一个参考文件(references/lsp-servers.md),其中包含 14 种语言的精选数据:每种操作系统的安装命令、二进制名称和即用型配置代码片段。代理读取此文件并选择匹配项。

4. 配置范围

代理询问配置应为:

  • 用户级别~/.copilot/lsp-config.json—适用于所有仓库
  • 仓库级别:仓库根目录或 .github/lsp.json 中的 lsp.json—仅适用于单个项目

当两者都存在时,仓库级别配置优先。

5. 安装

代理运行适当的安装命令。例如:

code
# 在任何操作系统上安装 TypeScript 
npm install -g typescript typescript-language-server 
 
# 在 macOS 上安装 Java 
brew install jdtls 
 
# 在任何操作系统上安装 Rust 
rustup component add rust-analyzer

6. 配置

代理会将条目写入或合并到选定的配置文件中。格式使用一个 lspServers 对象,其中每个键都是一个服务器标识符:

code
{ 
  "lspServers": { 
    "java": { 
      "command": "jdtls", 
      "args": [], 
      "fileExtensions": { 
        ".java": "java" 
      } 
    } 
  } 
}

关键规则:

  • command 必须在 $PATH 上或为绝对路径
  • args 通常包括 "--stdio" 用于标准 I/O 传输(某些服务器如 jdtls 会内部处理)
  • fileExtensions 将每个扩展名(以点开头)映射到语言标识符
  • 配置文件中已有的条目会被保留 —— 代理会进行合并,从不覆盖

7. 验证

代理运行 which <binary>(在 Windows 上为 where.exe)以确认服务器是否可访问,然后验证配置文件是否为有效的 JSON。

支持的语言

该技能包含一组预定义的语言服务器,适用于多种编程语言。如果编码代理遇到尚未映射的语言,它将搜索合适的服务器,并引导你完成手动配置。

设置后的变化

一旦配置了 LSP 服务器,CLI 代理可以:

  • 跨依赖项解析类型 —— 不再需要通过 JAR 文件或 node_modules 进行 grep
  • 跳转到第三方库中的定义,即使源代码未提交到仓库中
  • 查找项目中所有对某个符号的引用
  • 阅读任意函数、类或类型的悬停文档

这意味着代理在工具调用上花费的时间更少,并且在第一次尝试中生成的代码更准确。对你来说,这意味着在代理反编译 JAR 文件或通过 node_modules 进行 grep 以回答 IDE 已知的问题时,等待的时间更少,而且基于误读的签名而产生的错误路径也更少。代理以与你在编辑器中通过“转到定义”获得的结构化理解相同的方式推理你的代码,因此你可以将更复杂、更棘手的任务交给它,并信任结果。

入门

  1. 下载技能:访问 Awesome Copilot LSP Setup 技能页面,点击 下载 按钮以获取 ZIP 文件。
  2. 解压 ZIP:运行以下命令将 ZIP 解压到 ~/.copilot/skills/

unzip lsp-setup.zip -d ~/.copilot/skills/

  1. 重启 GitHub Copilot CLI:如果 Copilot CLI 已经运行,首先输入 /exit。然后重新启动 copilot 以加载新技能。
  2. 请求代理设置语言服务器:例如,_“设置 Java 的 LSP”_ 或 _“启用 Python 的代码智能”_。
  3. 验证:在技能安装并配置 LSP 服务器后,再次重启 Copilot CLI(/exit,然后重新启动),运行 /lsp 检查服务器状态,并尝试在依赖项中的某个符号上进行“转到定义”。

该技能是 Awesome Copilot 项目的一部分。它是开源的,因此欢迎贡献和反馈!

作者

Image 1: Bruno Borges
Image 1: Bruno Borges

首席产品经理

在 GitHub 上探索更多内容

Image 2: Docs
Image 2: Docs

文档(Docs)

在一处掌握 GitHub 所有内容,应有尽有。

前往文档

Image 3: GitHub
Image 3: GitHub

GitHub

在 GitHub 上构建未来,这里是任何人都可以构建任何东西的地方。

立即开始构建

Image 4: Customer stories
Image 4: Customer stories

客户案例

了解使用 GitHub 构建产品的公司和工程团队。

了解更多

Image 5: The GitHub Podcast
Image 5: The GitHub Podcast

GitHub 播客

收听 GitHub 播客,这是一档专注于 GitHub 开源开发者社区中和周围话题、趋势、故事和文化的节目。

立即收听