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

GitHub Blog·2026-06-11 00:00·75天前·Natalie Guevara
AI 导读

GitHub Copilot CLI 现在可以通过安装和配置 LSP(Language Server Protocol)服务器来替代原始的暴力 grep 或反编译方式,从而获得真正的代码智能。

GitHub Blog
精选
68AI 编辑部评分,满分 100

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

2026-06-11 00:00· 75天前· Natalie Guevara
AI 导读

GitHub Copilot CLI 现在可以通过安装和配置 LSP(Language Server Protocol)服务器来替代原始的暴力 grep 或反编译方式,从而获得真正的代码智能。

推荐理由

虽然只是 Copilot CLI 的一个功能指南,但用 LSP 替代 grep 带来的代码理解提升是实打实的,搞 CLI 开发的可以直接抄作业。

正文 · AI 翻译

你是否曾见过 GitHub Copilot CLI 将一个 JAR 文件解压到临时目录,然后通过 grep 搜索 .class 文件,再从原始字节码中拼凑出 API 签名?这个智能体虽然足智多谋,但在没有语言服务器的情况下,这已经是它能做到的最好程度了。

语言服务器协议(LSP)是支撑 VS Code 等编辑器中“转到定义”、“查找引用”和“类型解析”功能的标准协议。它在终端中同样适用。LSP 配置技能能够为 Copilot CLI 自动安装和配置 LSP 服务器,从而使智能体能够获得关于你代码的精确、结构化的答案,而不是依赖文本搜索的启发式方法。

在这篇文章中,你将了解该技能在底层是如何工作的,看到它生成的配置格式,并为你当前支持的 14 种语言中的任意一种进行配置。

问题:启发式的代码理解

在没有 LSP 服务器的情况下,GitHub Copilot CLI 中的智能体通过文本搜索和二进制提取来反向工程 API 信息。对于一个 Java 项目,这可能会像这样:

# Find the dependency JAR 
find ~/.m2/repository -name "*httpclient*.jar" 
 
# Extract it to a temp directory 
mkdir /tmp/httpclient && cd /tmp/httpclient 
jar xf ~/.m2/repository/org/apache/httpcomponents/httpclient/4.5.14/httpclient-4.5.14.jar 
 
# Search extracted class files for a method 
grep -r "execute" --include="*.class" .

对于 Python,智能体可能会读取 site-packages 目录下的文件。对于 TypeScript,它会遍历 node_modules 目录。这些基于文本的方法在简单情况下有效,但它们是在对原始文本进行模式匹配,而非真正的语义分析,因此会遗漏泛型、重载和传递类型,并且完全无法查看编译后的字节码。这正是语言服务器所能弥补的差距。

LSP 服务器从结构上解决了这个问题。当智能体发送一个针对某个符号的 textDocument/definition 请求时,语言服务器会返回精确的源代码位置、完全解析后的类型以及签名。

什么是智能体技能?

智能体技能是一组可复用的指令集,用于扩展 AI 编码智能体的能力。技能以带有 YAML 前置元数据的 Markdown 文件定义,并遵循标准结构:触发描述、分步工作流程、参考数据和行为约束。

LSP 配置技能利用此结构引导智能体完成一个多步骤的安装过程,包括检测操作系统、选择合适的包管理器、编写有效的配置以及验证结果。

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`——适用于所有仓库
  • 仓库级:仓库根目录下的 `lsp.json` 或 `.github/lsp.json`——限定于单个项目

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

5. 安装

智能体运行相应的安装命令。例如:

# TypeScript on any OS 
npm install -g typescript typescript-language-server 
 
# Java on macOS 
brew install jdtls 
 
# Rust on any OS 
rustup component add rust-analyzer

6. 配置

智能体将条目写入或合并到所选配置文件中。格式使用一个 `lspServers` 对象,其中每个键是一个服务器标识符:

{ 
  "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` 中手动搜索
  • 跳转到第三方库中的定义,即使源代码未检入仓库。
  • 查找项目中某个符号的所有引用。
  • 查看任何函数、类或类型的悬停文档。

这意味着智能体在工具调用上花费的时间更少,首次就能生成更准确的代码。对你而言,这意味着无需再等待智能体解压 JAR 文件或在 node_modules 中搜索你的 IDE 已经知道答案的问题,也减少了因误读签名而导致的错误方向。智能体以你在编辑器中“转到定义”时获得的相同结构化理解来推理你的代码,因此你可以交给它更大、更棘手的任务,并信任其结果。

  1. 下载技能:访问 Awesome Copilot LSP Setup 技能页面,点击下载按钮获取 ZIP 文件。
  2. 通过运行以下命令将 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 项目的一部分。它是开源的,欢迎贡献和反馈!

来源:GitHub Blog· github.blog