nvim启动打开.lua文件时lua_ls未附着,切换文件后恢复正常
Lua-Language-Server 启动异常问题排查与解决
问题现象
- 执行
nvim a.lua启动并打开Lua文件时,lua-language-server未启动,:LspInfo显示0 client(s) attached to this buffer - 切换到其他Lua文件(如
:e b.lua)时,lua_ls可正常工作 - 仅lua_ls存在此问题,gopls、jsonls、bashls、pylsp等其他LSP服务器运行正常
- 使用环境:lazy.nvim + mason
我的LSP配置文件(lua/plugins/lsp.lua)
return { { 'neovim/nvim-lspconfig', dependencies = { "williamboman/mason.nvim", "williamboman/mason-lspconfig.nvim", 'hrsh7th/cmp-nvim-lsp', }, priority = 900, config = function() require("mason").setup() require("mason-lspconfig").setup({ ensure_installed = { "gopls", "lua_ls", "html", "jsonls", "yamlls", "pylsp", "bashls", "clangd", "ts_ls", "volar", } }) -- Set up lspconfig. -- Enable each lsp servers. local capabilities = require('cmp_nvim_lsp').default_capabilities() -- go require('lspconfig')['gopls'].setup({ capabilities = capabilities }) -- lua require('lspconfig')['lua_ls'].setup({ capabilities = capabilities }) -- html require('lspconfig')['html'].setup({ capabilities = capabilities }) -- json require('lspconfig')['jsonls'].setup({ capabilities = capabilities }) -- yaml require('lspconfig')['yamlls'].setup({ capabilities = capabilities }) -- python require('lspconfig')['pylsp'].setup({ capabilities = capabilities, settings = { pylsp = { plugins = { pycodestyle = { ignore = { 'E501' }, } } } } }) -- bash require('lspconfig')['bashls'].setup({ capabilities = capabilities }) -- clang require('lspconfig')['clangd'].setup({ capabilities = capabilities, filetypes = { 'c', 'cpp', 'objc', 'objcpp', 'cuda' }, }) -- typescript require('lspconfig')['ts_ls'].setup({ capabilities = capabilities, init_options = { plugins = { { name = "@vue/typescript-plugin", location = "/opt/homebrew/lib/node_modules/@vue/typescript-plugin", languages = { "javascript", "typescript", "vue" }, }, }, }, filetypes = { "javascript", "typescript", "vue", }, }) -- volar (for vue) require('lspconfig')['volar'].setup({ capabilities = capabilities }) -- Keymap for lsp local vim = vim local keyset = vim.keymap.set keyset("n", "<leader>rn", "<cmd>lua vim.lsp.buf.rename()<CR>", { silent = true }) keyset("n", "<leader>f", "<cmd>lua vim.lsp.buf.format()<CR>", { silent = true }) -- Auto format for golang. vim.api.nvim_create_autocmd('BufWritePre', { pattern = '*.go', callback = function() vim.api.nvim_command('lua vim.lsp.buf.format()') end, desc = 'format on save for Go files', }) end } }
:LspInfo 输出
lspconfig: require("lspconfig.health").check() LSP configs active in this session (globally) ~ - Configured servers: clangd, bashls, volar, yamlls, jsonls, lua_ls, gopls, pylsp, html, ts_ls - OK Deprecated servers: (none) LSP configs active in this buffer (bufnr: 1) ~ - Language client log: ~/.local/state/nvim/lsp.log - Detected filetype: `lua` - 0 client(s) attached to this buffer - Other clients that match the "lua" filetype: - Config: lua_ls filetypes: lua cmd: ~/.local/share/nvim/mason/bin/lua-language-server version: `3.13.6` executable: true autostart: true root directory: ~/.config/nvim/
解决方案
1. 调整lua_ls的根目录检测逻辑
lua_ls默认通过寻找.luarc.json、.lua-format或.git等标识文件识别项目根目录,如果当前文件所在目录无法被正确识别,会导致LSP不启动。可以手动指定更宽松的检测规则:
require('lspconfig')['lua_ls'].setup({ capabilities = capabilities, root_dir = function(fname) -- 优先寻找标准配置文件,找不到则使用当前工作目录 return require('lspconfig.util').root_pattern('.luarc.json', '.luarc.jsonc', '.lua-format', '.git')(fname) or vim.fn.getcwd() end })
2. 调整LSP插件的加载时机
lazy.nvim可能在打开第一个文件时还未完成nvim-lspconfig的初始化,导致lua_ls未触发启动。可以在插件配置中指定文件类型,让插件提前加载:
{ 'neovim/nvim-lspconfig', dependencies = { "williamboman/mason.nvim", "williamboman/mason-lspconfig.nvim", 'hrsh7th/cmp-nvim-lsp', }, priority = 900, ft = { "lua", "go", "python", "bash", "json", "yaml", "html", "typescript", "vue", "c", "cpp" }, -- 列出所有支持的文件类型 config = function() -- 原配置内容不变 end }
3. 添加自动命令强制启动lua_ls
通过FileType自动命令,在打开Lua文件时手动触发lua_ls启动:
-- 在nvim-lspconfig的config函数末尾添加 vim.api.nvim_create_autocmd('FileType', { pattern = 'lua', callback = function() -- 检查是否已有客户端连接,没有则启动 local clients = vim.lsp.get_active_clients({ name = 'lua_ls' }) if #clients == 0 then require('lspconfig').lua_ls.launch() end end })
4. 查看LSP日志定位具体错误
打开~/.local/state/nvim/lsp.log,搜索lua_ls相关条目,查看是否有启动失败、路径错误或权限问题等日志信息,根据日志进一步排查。
内容的提问来源于stack exchange,提问作者Alfred Zhong
相关产品推荐
相关产品推荐

