微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

默认情况下如何使用 elixirls 格式化 elixir 文件?

如何解决默认情况下如何使用 elixirls 格式化 elixir 文件?

我使用 elixirls lsp-client 和 efm-server(主要用于信条)在 Neovim 中处理长生不老药文件。 我想使用 lsp-config 来格式化 elixir 文件,并希望将其设为 vim.lsp.buf.formatting() 命令的认 lsp-client。

目前,每次我尝试保存文件时,它都会要求我选择语言服务器,如下图所示。

enter image description here

如何使 elixirls 成为 vim.lsp.buf.formatting()vim.lsp.buf.formatting_sync(nil,100) 命令的认语言服务器?

我的相关 init.lua 文件如下:

-----------------------------------------------------------------------------------------------
---  LSP
-----------------------------------------------------------------------------------------------
local nvim_lsp = require("lspconfig")

-- Use an on_attach function to only map the following keys
-- after the language server attaches to the current buffer
local custom_attach = function(client,bufnr)
    local function buf_set_keymap(...)
        vim.api.nvim_buf_set_keymap(bufnr,...)
    end
    local function buf_set_option(...)
        vim.api.nvim_buf_set_option(bufnr,...)
    end

    -- Enable completion triggered by <c-x><c-o>
    buf_set_option("omnifunc","v:lua.vim.lsp.omnifunc")

    -- Mappings.
    local opts = {noremap = true,silent = true}

    -- See `:help vim.lsp.*` for documentation on any of the below functions
    buf_set_keymap("n","gD","<Cmd>lua vim.lsp.buf.declaration()<CR>",opts)
    buf_set_keymap("n","gd","<Cmd>lua vim.lsp.buf.deFinition()<CR>","K","<Cmd>lua vim.lsp.buf.hover()<CR>","gi","<cmd>lua vim.lsp.buf.implementation()<CR>","<C-k>","<cmd>lua vim.lsp.buf.signature_help()<CR>","<space>wa","<cmd>lua vim.lsp.buf.add_workspace_folder()<CR>","<space>wr","<cmd>lua vim.lsp.buf.remove_workspace_folder()<CR>","<space>wl","<cmd>lua print(vim.inspect(vim.lsp.buf.list_workspace_folders()))<CR>","<space>D","<cmd>lua vim.lsp.buf.type_deFinition()<CR>","<space>rn","<cmd>lua vim.lsp.buf.rename()<CR>","<space>ca","<cmd>lua vim.lsp.buf.code_action()<CR>","gr","<cmd>lua vim.lsp.buf.references()<CR>","<space>e","<cmd>lua vim.lsp.diagnostic.show_line_diagnostics()<CR>","[d","<cmd>lua vim.lsp.diagnostic.goto_prev()<CR>","]d","<cmd>lua vim.lsp.diagnostic.goto_next()<CR>","<space>q","<cmd>lua vim.lsp.diagnostic.set_loclist()<CR>","<space>f","<cmd>lua vim.lsp.buf.formatting_sync(nil,100)<CR>",opts)

    -- vim.api.nvim_command("au BufWritePost <buffer> lua vim.lsp.buf.formatting()")
    -- vim.api.nvim_command("au BufWritePost <buffer> lua vim.lsp.buf.formatting_sync(nil,100)")
    -- autocmd BufWritePre *.lua lua vim.lsp.buf.formatting_sync(nil,100)
end

USER = vim.fn.expand("$USER")
local sumneko_binary = "/Users/" .. USER .. "/language-servers/lua-language-server/bin/macOS/lua-language-server"
local sumneko_root_path = "/Users/" .. USER .. "/language-servers/lua-language-server"
nvim_lsp.sumneko_lua.setup {
    cmd = {sumneko_binary,"-E",sumneko_root_path .. "/main.lua"},on_attach = custom_attach,settings = {
        Lua = {
            runtime = {
                -- Tell the language server which version of Lua you're using (most likely LuaJIT in the case of Neovim)
                version = "LuaJIT",-- Setup your lua path
                path = vim.split(package.path,";")
            },diagnostics = {
                -- Get the language server to recognize the `vim` global
                globals = {"vim"}
            },workspace = {
                -- Make the server aware of Neovim runtime files
                library = {[vim.fn.expand("$VIMRUNTIME/lua")] = true,[vim.fn.expand("$VIMRUNTIME/lua/vim/lsp")] = true}
            }
        }
    }
}

vim.api.nvim_command("au BufWritePost *.lua lua vim.lsp.buf.formatting()")
vim.api.nvim_command("au BufWritePost *.ex lua vim.lsp.buf.formatting()")
-- vim.api.nvim_command("au BufWritePost *.exs lua vim.lsp.buf.formatting()")

require"lspconfig".efm.setup {
    init_options = {documentFormatting = true},filetypes = {"lua","elixir"},settings = {
        rootMarkers = {".git/"},languages = {
            lua = {
                {
                    formatCommand = "lua-format -i --no-keep-simple-function-one-line --no-break-after-operator --column-limit=150 --break-after-table-lb",formatStdin = true
                }
            }
        }
    }
}

local path_to_elixirls = vim.fn.expand("/Users/" .. USER .. "/language-servers/elixir-ls/rel/language_server.sh")
nvim_lsp.elixirls.setup({
    cmd = {path_to_elixirls},settings = {
        elixirLS = {
            -- I choose to disable dialyzer for personal reasons,but
            -- I would suggest you also disable it unless you are well
            -- aquainted with dialzyer and kNow how to use it.
            dialyzerEnabled = false,-- I also choose to turn off the auto dep fetching feature.
            -- It often get's into a weird state that requires deleting
            -- the .elixir_ls directory and restarting your editor.
            fetchDeps = false
        }
    }
})

解决方法

使用 vim.lsp.buf.formatting_seq_sync() 而不是 vim.lsp.buf.formatting() 可以解决问题。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。