
nvim-lspconfig cmd 自定義完全指南LSP 命令配置與啟動失敗排查清單【免費下載鏈接】nvim-lspconfigQuickstart configs for Nvim LSP項目地址: https://gitcode.com/GitHub_Trending/nv/nvim-lspconfig在 Neovim 里打開 .sh 文件LSP 浮窗彈出server did not start問題多半出在 nvim-lspconfig 的cmd字段上。這篇指南按讀默認(rèn)配置 → 按序排查 → 覆蓋 cmd → 防復(fù)發(fā)的動線走一遍覆蓋 bash-language-server 配置、vim.lsp.config cmd 覆蓋、LSP root_dir 排查這類高頻問題帶你把一個起不來的語言服務(wù)器重新拉起來。你打開deploy.sh狀態(tài)欄閃過Error: bash-language-server: server did not start:checkhealth lspconfig里寫著executable bash-language-server not found。兩個現(xiàn)象的鏈路相同cmd決定服務(wù)以什么命令啟動路徑、參數(shù)或環(huán)境有一項對不上服務(wù)當(dāng)場死掉。下面按排查順序走。先讀默認(rèn)配置cmd 數(shù)組如何拼成啟動命令動手改之前先弄清庫默認(rèn)要執(zhí)行什么命令。全部語言服務(wù)器的默認(rèn)配置都列在 doc/configs.md也可以直接看源文件。以 bash-language-server 為例它在 lsp/bashls.lua 中return { cmd { bash-language-server, start }, filetypes { bash, sh }, root_markers { .git }, }你應(yīng)該能看到cmd是字符串?dāng)?shù)組元素按順序拼成最終命令bash-language-server start。第一個元素是可執(zhí)行文件名由系統(tǒng)按 PATH 查找其余是位置參數(shù)。第一個元素不在 PATH 里服務(wù)就起不來——絕大多數(shù)command not found都源于此。啟動失敗按這個順序查filetype、root_dir 與 cmd服務(wù)啟動鏈?zhǔn)侨蝔iletype 匹配 → root_dir 識別 → 執(zhí)行 cmd。按順序查跳過前一段再調(diào) cmd 基本是白費功夫。第 1 步 查 filetype。在當(dāng)前緩沖區(qū)執(zhí)行:set filetype?預(yù)期輸出filetypebash。若是空值、或不在該服務(wù)的 filetypes 列表里服務(wù)根本不會掛上。補(bǔ)一條識別規(guī)則即可vim.filetype.add({ pattern { [.*/*.sh] bash } })預(yù)期重新打開文件后上面那條命令輸出filetypebash。第 2 步 查 root_dir。不少服務(wù)沒有工作區(qū)根目錄就拒絕啟動。先確認(rèn)當(dāng)前識別到的根目錄:lua print(vim.inspect(vim.lsp.buf.list_workspace_folders()))預(yù)期返回項目里.git所在目錄。若為空或指錯位置手動指定vim.lsp.config(bashls, { root_dir function() return vim.fn.getcwd() end, })預(yù)期再次執(zhí)行l(wèi)ist_workspace_folders()返回當(dāng)前工作目錄。第 3 步 查 cmd 本身。前兩步都通過、服務(wù)仍起不來時把 cmd 第一個元素直接丟進(jìn)終端執(zhí)行。報command not found問題在可執(zhí)行文件路徑提示參數(shù)文件不存在問題在參數(shù)內(nèi)容命令掛起無輸出通常是正常的——服務(wù)在等 stdin。用 vim.lsp.config 把 cmd 改成你要的樣子定位到具體位置后常用改法有四種由淺入深后者覆蓋前者。手動指定 bash-language-server 完整路徑服務(wù)裝在 PATH 之外的位置比如某個包管理器的本地 bin 目錄時把 cmd 第一個元素?fù)Q成絕對路徑vim.lsp.config(bashls, { cmd { /opt/homebrew/bin/bash-language-server, start }, })預(yù)期重啟 Neovim 后浮窗不再提示server did not start:checkhealth lspconfig不再報 executable 缺失。改用項目本地安裝的版本項目把服務(wù)裝在node_modules里時優(yōu)先用本地版本避免全局版本漂移vim.lsp.config(angularls, { cmd { vim.fn.getcwd() .. /node_modules/.bin/ngserver, --stdio, --tsProbeLocations, vim.fn.getcwd() .. /node_modules, }, })預(yù)期服務(wù)以項目自帶版本啟動日志里能看到node_modules/.bin/ngserver路徑。從項目文件動態(tài)生成參數(shù)硬件相關(guān)服務(wù)如 arduino_language_server的參數(shù)常寫在項目配置文件中l(wèi)ocal sketch_yaml require(yaml).loadfile(sketch.yaml) vim.lsp.config(arduino_language_server, { cmd { arduino-language-server, -cli-config, vim.fn.expand(~/.arduino15/arduino-cli.yaml), -fqbn, sketch_yaml.default_fqbn, -cli, arduino-cli, }, })預(yù)期服務(wù)自動讀取項目sketch.yaml里的硬件型號換項目不用改配置。按項目條件追加參數(shù)只有部分項目需要額外參數(shù)時用on_new_config鉤子。它收到合并后的配置和 root_dir可以直接改 cmdvim.lsp.config(pyright, { on_new_config function(config, root_dir) if vim.fn.filereadable(root_dir .. /pyright-monorepo.json) 1 then config.cmd config.cmd or {} table.insert(config.cmd, --config) table.insert(config.cmd, root_dir .. /pyright-monorepo.json) end end, })預(yù)期含該文件的項目多出--config參數(shù)其他項目行為不變。驗證與防復(fù)發(fā)日志、版本兼容與環(huán)境變量改完不要只憑能用了收工把下面幾件事做掉。開日志留證據(jù)。記錄完整啟動過程vim.lsp.set_log_level(DEBUG) require(vim.lsp.log).set_filename(vim.fn.stdpath(cache) .. /lsp.log)預(yù)期日志里出現(xiàn)含cmd的行實際執(zhí)行的命令和參數(shù)拼裝一目了然默認(rèn)日志位置是~/.local/state/nvim/lsp.log可tail -f觀察。版本兼容寫法。系統(tǒng)里同時存在新舊兩個二進(jìn)制時按可用性選擇local cmd vim.fn.executable(bash-language-server-v2) 1 and { bash-language-server-v2, start } or { bash-language-server, start } vim.lsp.config(bashls, { cmd cmd })預(yù)期:checkhealth lspconfig報出實際使用的二進(jìn)制換機(jī)器不翻車。敏感配置走環(huán)境變量。token、用戶路徑這類內(nèi)容不要明文寫進(jìn) cmd用vim.env傳cmd { bash-language-server, start, --log-level, vim.env.LSP_LOG_LEVEL or info, }預(yù)期級別從環(huán)境變量讀取未設(shè)置時回落到info。 模塊化組織。把每個服務(wù)的覆蓋配置拆到獨立 lua 文件里require加載改 cmd 只動一處也不容易和默認(rèn)配置混淆。下一步每次改完 cmd跑一遍:checkhealth lspconfig確認(rèn) executable、filetype、root_markers 全部通過把它當(dāng)成改完配置的固定動作。把本文的覆蓋配置整理成獨立文件按項目放不同目錄用 autocmd 在項目打開時加載。想理解配置合并與on_new_config的觸發(fā)時機(jī)讀 lua/lspconfig.lua 中on_new_config的調(diào)用處。想看動態(tài)拼裝 cmd 的完整寫法參考 lsp/angularls.lua。【免費下載鏈接】nvim-lspconfigQuickstart configs for Nvim LSP項目地址: https://gitcode.com/GitHub_Trending/nv/nvim-lspconfig創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考