AI News HubLIVE
站内改写3 分鐘閱讀

使用語言伺服器為 GitHub Copilot CLI 提供真正的程式碼智慧

GitHub Copilot CLI 現在可以透過 LSP 設定技能來安裝和配置語言伺服器,從而獲得精確的程式碼語義理解,不再依賴暴力 grep 或反編譯。本文介紹了該技能的工作原理、配置格式以及 14 種支援的語言。

來源GitHub AI & ML作者: Natalie Guevara

您是否曾見過 GitHub Copilot CLI 將 JAR 檔案解壓到臨時目錄,透過 grep 搜尋 .class 檔案,然後從原始位元組碼中拼湊出 API 簽名?代理雖然足智多謀,但沒有語言伺服器,這是它最好的表現。

語言伺服器協議(LSP)是驅動 VS Code 等編輯器中“轉到定義”、“查詢引用”和型別解析的標準。它在終端中同樣適用。LSP 設定技能可自動安裝和配置 Copilot CLI 的 LSP 伺服器,使代理能夠獲得關於程式碼的精確、結構化答案,而不是依賴文本搜尋啟發式方法。

在本文中,您將瞭解該技能的內部工作原理、它生成的配置格式,併為其目前支援的 14 種語言中的任何一種進行設定。

問題:啟發式程式碼理解

在沒有 LSP 伺服器的情況下,GitHub Copilot CLI 中的代理透過文本搜尋和二進位制提取逆向工程 API 資訊。對於 Java 專案,這可能看起來像:

查詢依賴 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 支援的語言。這一步驅動所有後續步驟。

  1. 作業系統檢測

代理執行 uname -s(或在 Windows 上檢查 $env:OS / %OS%)來確定目標平臺。安裝命令因作業系統而異。例如,在 macOS 上使用 brew install jdtls,在 Linux 上則從 eclipse.org 下載。

  1. LSP 伺服器查詢

該技能包含一個參考檔案(references/lsp-servers.md),其中包含 14 種語言的精選資料:每個作業系統的安裝命令、二進位制名稱和現成的配置片段。代理讀取該檔案並選擇匹配的條目。

  1. 配置範圍

代理詢問配置應應用於:

使用者級別:~/.copilot/lsp-config.json — 應用於所有倉庫

倉庫級別:倉庫根目錄下的 lsp.json 或 .github/lsp.json — 限定於單個專案

如果兩者都存在,倉庫級別的配置優先。

  1. 安裝

代理執行相應的安裝命令。例如:

任何作業系統上的 TypeScript

npm install -g typescript typescript-language-server

macOS 上的 Java

brew install jdtls

任何作業系統上的 Rust

rustup component add rust-analyzer

  1. 配置

代理將條目寫入或合併到所選配置檔案。格式使用 lspServers 物件,其中每個鍵是伺服器識別符號:

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

該技能強制執行的關鍵規則:

command 必須在 $PATH 上或是絕對路徑

args 通常包含 "--stdio" 用於標準 I/O 傳輸(某些伺服器如 jdtls 內部處理此操作)

fileExtensions 將每個副檔名(帶前導點)對映到語言識別符號

配置檔案中的現有條目將被保留 — 代理進行合併,從不覆蓋

  1. 驗證

代理執行 which(或在 Windows 上執行 where.exe)以確認伺服器可訪問,然後驗證配置檔案是否為格式正確的 JSON。

支援的語言

該技能為多種程式語言預定義了一組語言伺服器。如果編碼代理遇到尚未對映的語言,它將搜尋合適的伺服器並引導您進行手動配置。

設定後的變化

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

跨依賴項解析型別 — 不再需要 grep 搜尋 JAR 檔案或 node_modules

跳轉到第三方庫中的定義,即使原始碼未檢入倉庫

在整個專案中查詢對某個符號的所有引用

讀取任何函式、類或型別的懸停文件

這意味著代理在工具呼叫上花費的時間更少,並在第一次透過時產生更準確的程式碼。對您來說,這意味著更少的時間等待代理解壓縮 JAR 檔案或 grep 搜尋 node_modules 來回答您的 IDE 已經知道的問題,更少基於錯誤簽名的錯誤轉向。代理以與您的編輯器中“轉到定義”相同的結構化理解來推理您的程式碼,因此您可以交給它更大、更棘手的任務並信任結果。

開始使用

下載技能:訪問 Awesome Copilot LSP 設定技能頁面,點選下載按鈕獲取 ZIP 檔案。

將 ZIP 解壓到 ~/.copilot/skills/:執行

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

重啟 GitHub Copilot CLI:如果 Copilot CLI 已在執行,先輸入 /exit。然後重新啟動 copilot,以便它拾取新技能。

要求代理設定語言伺服器:例如,“為 Java 設定 LSP”或“啟用 Python 的程式碼智慧”。

驗證:技能安裝並配置 LSP 伺服器後,再重啟一次 Copilot CLI(/exit,然後重新啟動),執行 /lsp 檢查伺服器狀態,然後嘗試在其中一個依賴項中的符號上使用轉到定義。

該技能是 Awesome Copilot 專案的一部分。它是開源的,因此歡迎貢獻和反饋!