如何在Neovim LSP中获取所有接口?请求返回空结果求排查
问题排查与解决步骤
确认LSP服务是否附加到当前缓冲区
先执行:LspInfo查看当前缓冲区对应的LSP是否运行正常、无报错。若LSP未启动或未附加,documentSymbol请求必然返回空。也可通过Lua代码验证:local clients = vim.lsp.get_active_clients({ bufnr = vim.api.nvim_get_current_buf() }) print(vim.inspect(clients))若输出为空,需检查LSP配置:对应语言服务器是否安装、
nvim-lspconfig的setup调用是否正确。检查语言服务器是否支持
textDocument/documentSymbol请求
并非所有LSP都实现了该接口,部分小众语言服务器可能仅支持基础功能。可通过以下代码查看服务器能力:local bufnr = vim.api.nvim_get_current_buf() local init_result = vim.lsp.buf_request_sync(bufnr, "initialize", { rootUri = vim.uri_from_fname(vim.fn.getcwd()), capabilities = vim.lsp.protocol.make_client_capabilities() }, 2000) print(vim.inspect(init_result[1].result.capabilities.documentSymbolProvider))若返回
false或字段不存在,说明该LSP不支持此请求,需改用tree-sitter解析等其他方式获取接口。验证缓冲区内容与文件类型
部分LSP要求文件保存后才能解析符号,或文件需无语法错误。先执行:w保存文件,再重新运行你的代码。同时检查文件类型是否正确(:set filetype?),若类型错误,LSP不会处理当前缓冲区。手动构造请求参数
尝试跳过vim.lsp.util.make_text_document_params(),手动构造参数:local bufnr = vim.api.nvim_get_current_buf() local params = { textDocument = { uri = vim.uri_from_bufnr(bufnr) } } local result = vim.lsp.buf_request_sync(bufnr, "textDocument/documentSymbol", params, 2000) print(vim.inspect(result))部分环境下自动生成的参数可能存在异常,手动构造更可靠。
改用异步请求
同步请求可能因超时或LSP处理延迟导致结果异常,换成异步请求尝试:local bufnr = vim.api.nvim_get_current_buf() local params = vim.lsp.util.make_text_document_params() vim.lsp.buf_request(bufnr, "textDocument/documentSymbol", params, function(err, result) if err then print(vim.inspect(err)) else print(vim.inspect(result)) end end)
内容的提问来源于stack exchange,提问作者Tomasz Gałkowski
相关产品推荐
相关产品推荐

