You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 23:29:57