如何连接至已运行(指定PID)的LSP服务器?
连接已运行的LSP服务器并使用
vim.lsp.buf_request测试 要连接已运行的指定PID的LSP服务器,核心是跳过Neovim自动启动新进程的逻辑,直接连接到LSP服务器的通信端点(Unix域套接字或TCP端口),具体步骤如下:
1. 定位LSP服务器的通信端点
已运行的LSP必须通过套接字(而非stdio)监听连接,你需要先找到它的通信地址:
- 执行
lsof -p <目标PID>查看进程的文件描述符,查找类型为unix的套接字路径,或IPv4/IPv6对应的端口号。 - 也可以查看LSP进程的启动命令行参数,多数LSP支持
--socket、--port这类参数指定监听端点。
2. 在Neovim中配置客户端连接
使用vim.lsp.start()配置客户端,禁用自动启动进程,改为直接连接到已有的端点:
连接Unix域套接字示例
-- 替换为你的LSP实际套接字路径 local socket_path = "/tmp/lsp-server.sock" local client = vim.lsp.start({ name = "existing-lsp", cmd = false, -- 关键:不启动新进程 root_dir = vim.fn.getcwd(), -- 项目根目录,按需调整 init_options = {}, -- 与LSP启动时的初始化参数一致 connect = function() local pipe = vim.loop.new_pipe(false) local ok, err = pipe:connect(socket_path) if not ok then vim.notify("LSP连接失败: " .. err, vim.log.levels.ERROR) return nil end return pipe end, })
连接TCP端口示例
-- 替换为你的LSP监听的IP和端口 local lsp_host = "127.0.0.1" local lsp_port = 1234 local client = vim.lsp.start({ name = "existing-lsp", cmd = false, root_dir = vim.fn.getcwd(), init_options = {}, connect = function() local tcp = vim.loop.new_tcp() tcp:connect(lsp_host, lsp_port, function(err) if err then vim.notify("LSP连接失败: " .. err, vim.log.levels.ERROR) end end) return tcp end, })
3. 关联缓冲区并发送测试请求
连接成功后,将当前缓冲区绑定到LSP客户端,再用vim.lsp.buf_request测试:
-- 将当前缓冲区(编号0)关联到已连接的客户端 if client then vim.lsp.buf_attach_client(0, client.id) end -- 发送textDocument/hover请求测试(可替换为其他LSP方法) vim.lsp.buf_request(0, "textDocument/hover", { textDocument = vim.lsp.util.make_text_document_params(0), position = { line = 5, character = 10 }, -- 替换为你要测试的代码位置 }, function(err, result) if err then print("请求错误:", vim.inspect(err)) else print("请求结果:", vim.inspect(result)) end end)
注意事项
- 如果原LSP是通过stdio与其他进程绑定的,无法直接连接,需重启LSP并指定套接字/端口模式运行。
root_dir需与LSP服务器的项目根目录匹配,否则可能导致服务异常。init_options要和LSP正常启动时的配置保持一致,否则初始化可能失败。
内容的提问来源于stack exchange,提问作者Trung Do
相关产品推荐
相关产品推荐

