简体   繁体   中英

Neovim LSP capabilities not exported in Mason

I am new to Neovim and lua as programming language. I am trying to setup a Neovim as a full complete IDE. My issue deals with Mason and LSP capabilities. It seems that my LSP server is executing but my configuration is not correctly setup properly. My point is that the keymapping from my attach table are not applied My file setup is the following:

~/.config/nvim/init.lua

~/.config/nvim/lua/jpv/ {init.lua, ...., mason.lua, lsp}

~/.config/nvim/lua/jpv/lsp/ {init.lua, handlers.lua}

I have a file mason.lua

require("mason").setup({
        ui = {
            icons = {
                package_installed = "✓",
                package_pending = "➜",
                package_uninstalled = "✗"
            }
        }
    })

require("mason-lspconfig").setup_handlers({
  function(server)
    local opts = {
      on_attach = require("jpv.lsp.handlers").on_attach,
      capabilities = require("jpv.lsp.handlers").capabilities,
    }

    if server == "sumneko_lua" then
        print("Inside" .. server)
        local sumneko_opts = require("jpv.lsp.settings.sumneko_lua")
        opts = vim.tbl_deep_extend("force", sumneko_opts, opts)
    end
    if server == "kotlin_language_server" then
      print("Inside" .. server)
      local kotlin_ls = require("jpv.lsp.settings.kotlin_ls")
      opts = vim.tbl_deep_extend("force", kotlin_ls, opts)
    end
    -- print("For server " .. server) 
    -- for key, value in pairs(opts) do
    --   print("Has key ".. key)
    -- end
    require("lspconfig")[server].setup{opts}
  end
  })

On the other side I have a lsp folder with an init.lua

local status_ok, nvm_lsp = pcall(require, "lspconfig")
if not status_ok then
  return
end

require("jpv.lsp.handlers").setup()
require("jpv.mason")

Last, my handlers.lua is

local M = {}

-- TODO: backfill this to template
M.setup = function()
    local signs = {
        { name = "DiagnosticSignError", text = "" },
        { name = "DiagnosticSignWarn", text = "" },
        { name = "DiagnosticSignHint", text = "" },
        { name = "DiagnosticSignInfo", text = "" },
    }

    for _, sign in ipairs(signs) do
        vim.fn.sign_define(sign.name, { texthl = sign.name, text = sign.text, numhl = "" })
    end

    local config = {
        -- disable virtual text
        virtual_text = false,
        -- show signs
        signs = {
            active = signs,
        },
        update_in_insert = true,
        underline = true,
        severity_sort = true,
        float = {
            focusable = false,
            style = "minimal",
            border = "rounded",
            source = "always",
            header = "",
            prefix = "",
        },
    }

    vim.diagnostic.config(config)

    vim.lsp.handlers["textDocument/hover"] = vim.lsp.with(vim.lsp.handlers.hover, {
        border = "rounded",
        width = 60,
    })

    vim.lsp.handlers["textDocument/signatureHelp"] = vim.lsp.with(vim.lsp.handlers.signature_help, {
        border = "rounded",
        width = 60,
    })
end

local function lsp_highlight_document(client)
    -- Set autocommands conditional on server_capabilities
    local status_ok, illuminate = pcall(require, "illuminate")
    if not status_ok then
    print("RETURNING")
        return
    end
  print("NOT returning")
    illuminate.on_attach(client)
    -- end
end

local function lsp_keymaps(bufnr)
    local opts = { noremap = true, silent = true }
    vim.api.nvim_buf_set_keymap(bufnr, "n", "gD", "<cmd>lua vim.lsp.buf.declaration()<CR>", opts)
    vim.api.nvim_buf_set_keymap(bufnr, "n", "gd", "<cmd>lua vim.lsp.buf.definition()<CR>", opts)
    vim.api.nvim_buf_set_keymap(bufnr, "n", "K", "<cmd>lua vim.lsp.buf.hover()<CR>", opts)
    vim.api.nvim_buf_set_keymap(bufnr, "n", "gi", "<cmd>lua vim.lsp.buf.implementation()<CR>", opts)
    vim.api.nvim_buf_set_keymap(bufnr, "n", "<C-k>", "<cmd>lua vim.lsp.buf.signature_help()<CR>", opts)
    -- vim.api.nvim_buf_set_keymap(bufnr, "n", "<leader>rn", "<cmd>lua vim.lsp.buf.rename()<CR>", opts)
    vim.api.nvim_buf_set_keymap(bufnr, "n", "gr", "<cmd>lua vim.lsp.buf.references()<CR>", opts)
    -- vim.api.nvim_buf_set_keymap(bufnr, "n", "<leader>ca", "<cmd>lua vim.lsp.buf.code_action()<CR>", opts)
    -- vim.api.nvim_buf_set_keymap(bufnr, "n", "<leader>f", "<cmd>lua vim.diagnostic.open_float()<CR>", opts)
    vim.api.nvim_buf_set_keymap(bufnr, "n", "[d", '<cmd>lua vim.diagnostic.goto_prev({ border = "rounded" })<CR>', opts)
    vim.api.nvim_buf_set_keymap(
        bufnr,
        "n",
        "gl",
        '<cmd>lua vim.diagnostic.open_float({ border = "rounded" })<CR>',
        opts
    )
    vim.api.nvim_buf_set_keymap(bufnr, "n", "]d", '<cmd>lua vim.diagnostic.goto_next({ border = "rounded" })<CR>', opts)
    vim.api.nvim_buf_set_keymap(bufnr, "n", "<leader>q", "<cmd>lua vim.diagnostic.setloclist()<CR>", opts)
    vim.cmd([[ command! Format execute 'lua vim.lsp.buf.format{async=true}' ]])
  print("Inside keymaps iiiiiiiiiiiiiiiiiiiiiii")
end

M.on_attach = function(client, bufnr)
    -- vim.notify(client.name .. " starting...")
    -- TODO: refactor this into a method that checks if string in list
  print("Client is " .. client)
    if client.name == "tsserver" then
        client.resolved_capabilities.document_formatting = false
    end
  print("Assigning keymaps")
    lsp_keymaps(bufnr)
  print("Illuminating document")
    lsp_highlight_document(client)
end

local capabilities = vim.lsp.protocol.make_client_capabilities()

local status_ok, cmp_nvim_lsp = pcall(require, "cmp_nvim_lsp")
if not status_ok then
    return
end

print("LOOOAADIN")
M.capabilities = cmp_nvim_lsp.update_capabilities(capabilities)

return M

Replace setup_handlers with this on your mason.lua file:

require("mason-lspconfig").setup_handlers({
 function(server)
      local opts = {
           on_attach = require("jpv.lsp.handlers").on_attach,
           capabilities = require("jpv.lsp.handlers").capabilities,
      }

      require("lspconfig")[server].setup(opts)

      if server == "sumneko_lua" then
           local sumneko_opts = require("jpv.lsp.settings.sumneko_lua")
           -- assuming sumneko_opts return a table
           sumneko_opts["on_attach"] = opts.on_attach
           sumneko_opts["capabilities"] = opts.capabilities
           require("lspconfig")[server].setup(sumneko_opts)
      end
      
 end})

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM