ARTICLE DETAIL

资讯详情

深耕商务建站与企业官网运营的一线实战洞察。

nvim-lspconfig cmd 自定义完全指南:LSP 命令配置与启动失败排查清单

nvim-lspconfig cmd 自定义完全指南:LSP 命令配置与启动失败排查清单 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字段上。这篇指南按读默认配置 → 按序排查 → 覆盖 cmd → 防复发的动线走一遍覆盖 bash-language-server 配置、vim.lsp.config cmd 覆盖、LSP root_dir 排查这类高频问题带你把一个起不来的语言服务器重新拉起来。你打开deploy.sh状态栏闪过Error: bash-language-server: server did not start:checkhealth lspconfig里写着executable bash-language-server not found。两个现象的链路相同cmd决定服务以什么命令启动路径、参数或环境有一项对不上服务当场死掉。下面按排查顺序走。先读默认配置cmd 数组如何拼成启动命令动手改之前先弄清库默认要执行什么命令。全部语言服务器的默认配置都列在 doc/configs.md也可以直接看源文件。以 bash-language-server 为例它在 lsp/bashls.lua 中return { cmd { bash-language-server, start }, filetypes { bash, sh }, root_markers { .git }, }你应该能看到cmd是字符串数组元素按顺序拼成最终命令bash-language-server start。第一个元素是可执行文件名由系统按 PATH 查找其余是位置参数。第一个元素不在 PATH 里服务就起不来——绝大多数command not found都源于此。启动失败按这个顺序查filetype、root_dir 与 cmd服务启动链是三段filetype 匹配 → root_dir 识别 → 执行 cmd。按顺序查跳过前一段再调 cmd 基本是白费功夫。第 1 步 查 filetype。在当前缓冲区执行:set filetype?预期输出filetypebash。若是空值、或不在该服务的 filetypes 列表里服务根本不会挂上。补一条识别规则即可vim.filetype.add({ pattern { [.*/*.sh] bash } })预期重新打开文件后上面那条命令输出filetypebash。第 2 步 查 root_dir。不少服务没有工作区根目录就拒绝启动。先确认当前识别到的根目录:lua print(vim.inspect(vim.lsp.buf.list_workspace_folders()))预期返回项目里.git所在目录。若为空或指错位置手动指定vim.lsp.config(bashls, { root_dir function() return vim.fn.getcwd() end, })预期再次执行list_workspace_folders()返回当前工作目录。第 3 步 查 cmd 本身。前两步都通过、服务仍起不来时把 cmd 第一个元素直接丢进终端执行。报command not found问题在可执行文件路径提示参数文件不存在问题在参数内容命令挂起无输出通常是正常的——服务在等 stdin。用 vim.lsp.config 把 cmd 改成你要的样子定位到具体位置后常用改法有四种由浅入深后者覆盖前者。手动指定 bash-language-server 完整路径服务装在 PATH 之外的位置比如某个包管理器的本地 bin 目录时把 cmd 第一个元素换成绝对路径vim.lsp.config(bashls, { cmd { /opt/homebrew/bin/bash-language-server, start }, })预期重启 Neovim 后浮窗不再提示server did not start:checkhealth lspconfig不再报 executable 缺失。改用项目本地安装的版本项目把服务装在node_modules里时优先用本地版本避免全局版本漂移vim.lsp.config(angularls, { cmd { vim.fn.getcwd() .. /node_modules/.bin/ngserver, --stdio, --tsProbeLocations, vim.fn.getcwd() .. /node_modules, }, })预期服务以项目自带版本启动日志里能看到node_modules/.bin/ngserver路径。从项目文件动态生成参数硬件相关服务如 arduino_language_server的参数常写在项目配置文件中local 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, }, })预期服务自动读取项目sketch.yaml里的硬件型号换项目不用改配置。按项目条件追加参数只有部分项目需要额外参数时用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, })预期含该文件的项目多出--config参数其他项目行为不变。验证与防复发日志、版本兼容与环境变量改完不要只凭能用了收工把下面几件事做掉。开日志留证据。记录完整启动过程vim.lsp.set_log_level(DEBUG) require(vim.lsp.log).set_filename(vim.fn.stdpath(cache) .. /lsp.log)预期日志里出现含cmd的行实际执行的命令和参数拼装一目了然默认日志位置是~/.local/state/nvim/lsp.log可tail -f观察。版本兼容写法。系统里同时存在新旧两个二进制时按可用性选择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 })预期:checkhealth lspconfig报出实际使用的二进制换机器不翻车。敏感配置走环境变量。token、用户路径这类内容不要明文写进 cmd用vim.env传cmd { bash-language-server, start, --log-level, vim.env.LSP_LOG_LEVEL or info, }预期级别从环境变量读取未设置时回落到info。 模块化组织。把每个服务的覆盖配置拆到独立 lua 文件里require加载改 cmd 只动一处也不容易和默认配置混淆。下一步每次改完 cmd跑一遍:checkhealth lspconfig确认 executable、filetype、root_markers 全部通过把它当成改完配置的固定动作。把本文的覆盖配置整理成独立文件按项目放不同目录用 autocmd 在项目打开时加载。想理解配置合并与on_new_config的触发时机读 lua/lspconfig.lua 中on_new_config的调用处。想看动态拼装 cmd 的完整写法参考 lsp/angularls.lua。【免费下载链接】nvim-lspconfigQuickstart configs for Nvim LSP项目地址: https://gitcode.com/GitHub_Trending/nv/nvim-lspconfig创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表
PREV
查看更多资讯
NEXT
返回资讯列表