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

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

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

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

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

2026-06-11 00:00· 104天前· 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 Setup 技能可为 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,智能体可能会 cat 位于 site-packages 中的文件。对于 TypeScript,它会遍历 node_modules。这些基于文本的方法在简单场景下可行,但它们是在对原始文本做模式匹配,而非真正的语义分析,因此会遗漏泛型、重载和传递类型,而且完全看不到编译后的字节码。这恰恰是语言服务器所能弥补的空白。

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

什么是智能体技能?

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

LSP Setup 技能利用这一结构来引导智能体完成多步骤的安装流程:检测操作系统、选择合适的包管理器、编写有效的配置,并验证结果。

LSP Setup 技能的工作原理

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

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(PATH)中,或为绝对路径
  • args 通常包含标准 I/O 传输方式所需的 "--stdio"(某些服务器如 jdtls 会在内部处理此操作)
  • fileExtensions 将每个扩展名(含前导点)映射到一个 语言标识符
  • 配置文件中已有的条目会被保留——智能体只做合并,绝不覆盖

7. 验证

智能体会运行 which <binary>(Windows 上为 where.exe)以确认服务器可访问,然后验证配置文件是否为格式良好的 JSON。

支持的语言

该技能自带一套 预定义的语言服务器,覆盖多种编程语言。如果编程智能体遇到尚未映射的语言,它会搜索合适的服务器,并引导你完成手动配置。

设置完成后会有什么变化

配置好 LSP 服务器后,CLI 智能体可以:

  • 解析依赖项中的类型 —— 不再需要在 JAR 文件中 grep,也不必 node_modules
  • 跳转到第三方库中的定义,即使源代码没有检入仓库
  • 查找某个符号在整个项目中的所有引用
  • 查看任意函数、类或类型的悬停文档

这意味着智能体花在工具调用上的时间更少,并且首次生成的代码更准确。对你来说,这意味着更少的时间浪费在等待智能体反编译 JAR 文件或翻查 node_modules 来回答一个你的 IDE 早已知道答案的问题上,也减少了因误读函数签名而走上的弯路。智能体在理解你的代码时,拥有与你编辑器中 go-to-definition 相同的结构化理解能力,因此你可以把更大、更棘手的任务交给它,并信任其结果。

  1. 下载技能:访问 Awesome Copilot LSP Setup 技能页面,点击 Download 按钮获取 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