! 本篇文章將會介紹 LSP servers 與 formatters,幫 AI 裝上狙擊鏡:精準打擊 :D
TL;DR: https://dev.benben.me/slides/s/ironman-09-lsp-formatters
讀完這篇你會學到:
AI 讀 code,如果只把它當「文字」看,就少了型別、定義、引用這些結構資訊。LSP(Language Server Protocol)就是補上這塊:opencode 整合語言 server 之後,diagnostics(診斷資訊)會變成給 agent 的回饋——AI 改壞了型別,語言 server 馬上告訴它,它就會自己修。
LSP 預設關閉。打開只要一行,寫在 opencode.json:
{"$schema": "https://opencode.ai/config.json", "lsp": true}
開啟後,當 opencode 開啟某個檔案,會比對副檔名、啟動對應的語言 server(需求滿足的話,很多還會自動安裝)。
內建清單涵蓋 30+ 語言,挑常見的給你看:TypeScript、gopls(Go)、rust-analyzer、pyright(Python)、eslint、Vue、Svelte、Astro、clangd(C/C++)、Java、Ruby、Elixir……族繁不及備載。
要關掉特定語言或自訂,用物件寫法:
{
"lsp": {
"typescript": {"disabled": true}, // 只關 TS 的 LSP
"custom-lsp": {
// 自訂 server
"command": ["custom-lsp-server", "--stdio"],
"extensions": [".custom"]
}
}
}
formatter 處理另一件事:AI 寫完 / 改完檔案,自動跑對應的 formatter 排版,產出直接符合專案格式,不用你再手動 prettier --write。
同樣預設關閉,一行打開:
{"$schema": "https://opencode.ai/config.json", "formatter": true}
內建支援 prettier、biome、gofmt、rustfmt、ruff(Python)、shfmt 等。聰明的地方在於它會看專案現有設定:例如 package.json 裡有 prettier,就自動用 prettier 處理對應檔案。
自訂 formatter 也不難,$FILE 佔位符會被換成目標檔案:
{
"formatter": {
"custom-markdown-formatter": {
"command": ["deno", "fmt", "$FILE"],
"extensions": [".md"]
}
}
}
想想你的 IDE 開大專案時的樣子……
答案官方文件寫得很白:語言 server 會吃記憶體、版本各異、可能跟專案狀態脫鉤、拖慢 agent 流程。很多專案更好的做法是——讓 agent 直接跑 lint / typecheck 的 CLI 指令,把這些指令寫進 AGENTS.md,錯誤一樣會回饋給 AI,而且沒有 LSP 的那些副作用。
所以口訣是:
go 指令、pyright 要裝在專案裡)。也可檢查是不是被 disabled 或被 "lsp": false 蓋掉。OPENCODE_DISABLE_LSP_DOWNLOAD=true。"lsp": true / "formatter": true 一行開啟Day 10:/share 分享對話,加上新手篇十天總複習——用一個 30 分鐘小專案驗收你學到的一切!
參考資料:
有任何疑問但沒有 iT 邦幫忙帳號,或是想匿名提問?
歡迎到 https://dev.benben.me/q/P3C5U6 提問或加油打氣,沒意外的話會在完賽之後一起回答 :D