askfiy / nvim

An excellent Neovim configuration, which is as powerful as Vscode, is lightning fast ⚡
Mozilla Public License 2.0
223 stars 21 forks source link

自己新增了一个lsp客户端不能自动启动 #3

Closed tinywaferShark closed 2 years ago

tinywaferShark commented 2 years ago

我在nvim-lsp-installer中新增了一个这样的lsp客户端,这是一个verilog的语言服务器。 图片

打开了一个verilog文件之后,并不能启动。 图片 在输入了lspstart veridian之后就可以启动这个服务器 图片

askfiy commented 2 years ago

你可以把配置文件贴上来吗?我注意到 verible 可能需要一些额外的东西。

tinywaferShark commented 2 years ago

指的是veridian的配置吗

require'lspconfig'.veridian.setup{}
return {
  cmd ={"veridian"},
  filetypes = { "verilog","systemverilog" },
  single_filesupport = true,
  root_dir = function()
      return vim.fn.getcwd()
      end,
}
askfiy commented 2 years ago

第一行的 setup 是不需要的。 另外 cmd 命令好像也有问题。

点这里

askfiy commented 2 years ago

你可以只保留 root_dir 进行尝试,setup 和其它的代码都可以删除。

tinywaferShark commented 2 years ago

第一行的 setup 是不需要的。 另外 cmd 命令好像也有问题。

点这里

我这里使用的是veridian这个lsp客户端,不是veribleverible在检查上不是很完善。 我为了使用veridian,先在~/.local/share/nvim/site/pack/packer/opt/nvim-lspconfig/lua/lspconfig/server_configurations创建了一个veridian.lua的文件,然后在~/.config/nvim进行了配置,配置是上面的配置。

askfiy commented 2 years ago

veridian.lua 可以上传吗

tinywaferShark commented 2 years ago

~/.local/share/nvim/site/pack/packer/opt/nvim-lspconfig/lua/lspconfig/server_configurations/veridian.lua文件内容

return {
    default_config = {
        cmd = {"veridian"};
        filetypes = {"systemverilog", "verilog"};
        single_filesupport = true,
        root_dir = function()
            return vim.fn.getcwd()
            end,
        settings = {};
      },
  docs = {
    description = [[
    test
    ]],
    default_config = {
      root_dir = [[util.find_git_ancestor]],
    },
  },
}

我发现对于我这种自己添加这种不存在在lsp-installer里的客户端,是不能在/configure/plugins/nvim-lsp-installer.lua最后一行直接加,否则那些attach的按键映射实现不了,用不了gh [g这些按键。只能将这部分内容重新写在lspconfig里面,可能我后续得去看看如何在lspinstaller里面定制新加的客户端

--这样是不行的
local servers = {
    vimls = require("configure.lsp.vimls"),
    sumneko_lua = require("configure.lsp.sumneko_lua"),
    pyright = require("configure.lsp.pyright"),
    clangd = require("configure.lsp.clangd"),
    -- tsserver = require("configure.lsp.tsserver"),
    -- html = require("configure.lsp.html"),
    -- cssls = require("configure.lsp.cssls"),
    jsonls = require("configure.lsp.jsonls"),
   veridian = require("configure.lsp.veridian"),

}

  require'lspconfig'.veridian.setup{
    cmd ={"veridian"},
    on_attach = attach,
    filetypes = { "verilog","systemverilog" },
    single_filesupport = true,
    root_dir = function()
        return vim.fn.getcwd()
        end,
  }

最后,非常感谢你的知乎内容和看到我的问题。

askfiy commented 2 years ago

很抱歉,我不能具体的帮助到你。

或许你可以为 veridian 的文件设置一个 autocmd,当打开这类文件后自动 setup LSP 服务。

你也可以不使用 autocmd,而是将它放在 ftplugin 中。

关于这个问题这里不再详细探究了。


另外对于某些服务端的 attach 的键绑定,你可以看看下面的代码,首先到 configure/lsp/xxx.lua 中这样返回:


return {
    hooks = {
        ---@diagnostic disable-next-line: unused-local
        attach = function(client, bufnr)
            -- 重新绑定键
            vim.keymap.set("n", "<leader>t", ":command<cr>", {silent = true})
            client.resolved_capabilities.document_formatting = false
        end,
    },
    options = {
        root_dir = function()
            return vim.fn.getcwd()
        end,
    },
}

然后在使用 lsp-installer.lua 自动启动 LSP 时:

        for server_name, server_settings in pairs(M.language_servers_config) do
                -- 具体的启动配置
        local server_options = server_settings.options
                -- 拿到每个 LSP 服务配置中的 hook
        local server_hooks = server_settings.hooks
        local server_available, server = M.nvim_lsp_installer_servers.get_server(server_name)
        if server_available then
                        -- 如果没有安装,就安装
            if not server:is_installed() then
                vim.notify("Install Language Server: " .. server_name, "info", { title = "Language Server" })
                ---@diagnostic disable-next-line: undefined-field
                server:install()
                        -- 安装完成,准备启动
            else
                server_options.handlers = M.lsp_handlers
                server_options.capabilities = M.capabilities
                                -- 重点(attach 的键位绑定)
                server_options.on_attach = function(client, bufnr)
                                        -- 先执行公用的回调函数
                    M.attach_callbackfn(client, bufnr)
                                        -- 再执行私有的回调函数(如果公用回调中已经设置了的话,这里会覆盖上面的)
                    server_hooks.attach(client, bufnr)
                end
                server_options.flags = { debounce_text_changes = 150 }
                ---@diagnostic disable-next-line: undefined-field
                server:setup(server_options)
            end
        end
    end
tinywaferShark commented 2 years ago

感谢你的帮助