如何在 neovim 中使用带有自动完成功能的 nvim-lspconfig 设置 elixir-ls?
How do I setup elixir-ls using nvim-lspconfig with autocompletion in neovim?
我想使用内置语言服务器客户端和 nvim-lspconfig 在 Neovim 中设置 Elixir 语言服务器。
这方面的文档似乎散布在多个地方:
- nvim-lspconfig README
- nvim-lspconfig wiki about autocomplete
- nvim-lspconfig elixir-ls server configuration documentation
- elixir-ls installation instructions
我有点不知所措,曾多次尝试这样做,但总是没有成功而放弃。我还找到了一个看起来很有用的指南:How to Set Up Neovim for Elixir Development,但它做了很多假设,似乎错误地做了两次配置,并且还在中途切换了配置格式,所以对我来说不是一个可用的总结(在跟随之后说明、文档弹出窗口不起作用,我无法在自动完成弹出窗口中滚动 - 我还有很多 copy/pasted 配置我不明白)。
到目前为止,我了解所需的步骤是:
- 安装 neovim
- 手动安装 elixir-ls (由于无法询问 elixir-ls 的版本,目前似乎无法通过 asdf 安装)
- 安装所需的 neovim 插件:
nvim-lspconfig
+ 自动完成所需的一切
- 为 nvim-lspconfig 和自动完成设置必要的配置。
我已经完成了第 3 步的部分工作,但尚未成功计算出自动完成所需的依赖项和配置。
我需要做什么才能在 neovim 中使用 nvim-lspconfig 和 neovim 的内置语言服务器客户端设置一个有效的 elixir-ls,自动完成?
我设法通过结合一些插件在 neovim 中完成所有工作。他们是:
- hrsh7th/nvim-cmp - 自动补全插件
- hrsh7th/cmp-nvim-lsp - nvim-cmp 与 neovim 的 LSP
的整合
- L3MON4D3/LuaSnip - 片段插件
- saadparwaiz1/cmp_luasnip - nvim-cmp
的片段来源
这与 neovim's Wiki 的 nvim-cmp
推荐的插件列表相同。
我正在使用 packer 来管理插件。我还在配置插件之前安装插件。
这是安装行:
use 'neovim/nvim-lspconfig'
use 'nvim-treesitter/completion-treesitter' -- Only if you are using TS
use 'hrsh7th/nvim-cmp' -- Autocompletion plugin
use 'hrsh7th/cmp-nvim-lsp' -- LSP source for nvim-cmp
use 'saadparwaiz1/cmp_luasnip' -- Snippets source for nvim-cmp
use 'L3MON4D3/LuaSnip' -- Snippets plugin
然后是配置部分:
-- Add additional capabilities supported by nvim-cmp
local capabilities = vim.lsp.protocol.make_client_capabilities()
capabilities = require('cmp_nvim_lsp').update_capabilities(capabilities)
-- Configure ElixirLS as the LSP server for Elixir.
require'lspconfig'.elixirls.setup{
cmd = { "/home/my-user/path-to/elixir-ls/release/language_server.sh" },
-- on_attach = custom_attach, -- this may be required for extended functionalities of the LSP
capabilities = capabilities,
flags = {
debounce_text_changes = 150,
},
elixirLS = {
dialyzerEnabled = false,
fetchDeps = false,
};
}
local luasnip = require 'luasnip'
-- nvim-cmp
local cmp = require 'cmp'
cmp.setup {
snippet = {
expand = function(args)
require('luasnip').lsp_expand(args.body)
end,
},
mapping = {
['<C-p>'] = cmp.mapping.select_prev_item(),
['<C-n>'] = cmp.mapping.select_next_item(),
['<C-d>'] = cmp.mapping.scroll_docs(-4),
['<C-f>'] = cmp.mapping.scroll_docs(4),
['<C-Space>'] = cmp.mapping.complete(),
['<C-e>'] = cmp.mapping.close(),
['<CR>'] = cmp.mapping.confirm {
behavior = cmp.ConfirmBehavior.Replace,
select = true,
},
['<Tab>'] = function(fallback)
if cmp.visible() then
cmp.select_next_item()
elseif luasnip.expand_or_jumpable() then
luasnip.expand_or_jump()
else
fallback()
end
end,
['<S-Tab>'] = function(fallback)
if cmp.visible() then
cmp.select_prev_item()
elseif luasnip.jumpable(-1) then
luasnip.jump(-1)
else
fallback()
end
end,
},
sources = {
{ name = 'nvim_lsp' },
{ name = 'luasnip' },
},
}
你可以在我的 dotfiles 仓库中找到我所有的 neovim 配置:https://github.com/philss/dotfiles
作为参考,这是我使用的 nvim 版本(从源安装):
NVIM v0.7.0-dev+864-g2818de8b7
Build type: RelWithDebInfo
LuaJIT 2.1.0-beta3
Features: +acl +iconv +tui
我想使用内置语言服务器客户端和 nvim-lspconfig 在 Neovim 中设置 Elixir 语言服务器。
这方面的文档似乎散布在多个地方:
- nvim-lspconfig README
- nvim-lspconfig wiki about autocomplete
- nvim-lspconfig elixir-ls server configuration documentation
- elixir-ls installation instructions
我有点不知所措,曾多次尝试这样做,但总是没有成功而放弃。我还找到了一个看起来很有用的指南:How to Set Up Neovim for Elixir Development,但它做了很多假设,似乎错误地做了两次配置,并且还在中途切换了配置格式,所以对我来说不是一个可用的总结(在跟随之后说明、文档弹出窗口不起作用,我无法在自动完成弹出窗口中滚动 - 我还有很多 copy/pasted 配置我不明白)。
到目前为止,我了解所需的步骤是:
- 安装 neovim
- 手动安装 elixir-ls (由于无法询问 elixir-ls 的版本,目前似乎无法通过 asdf 安装)
- 安装所需的 neovim 插件:
nvim-lspconfig
+ 自动完成所需的一切 - 为 nvim-lspconfig 和自动完成设置必要的配置。
我已经完成了第 3 步的部分工作,但尚未成功计算出自动完成所需的依赖项和配置。
我需要做什么才能在 neovim 中使用 nvim-lspconfig 和 neovim 的内置语言服务器客户端设置一个有效的 elixir-ls,自动完成?
我设法通过结合一些插件在 neovim 中完成所有工作。他们是:
- hrsh7th/nvim-cmp - 自动补全插件
- hrsh7th/cmp-nvim-lsp - nvim-cmp 与 neovim 的 LSP 的整合
- L3MON4D3/LuaSnip - 片段插件
- saadparwaiz1/cmp_luasnip - nvim-cmp 的片段来源
这与 neovim's Wiki 的 nvim-cmp
推荐的插件列表相同。
我正在使用 packer 来管理插件。我还在配置插件之前安装插件。 这是安装行:
use 'neovim/nvim-lspconfig'
use 'nvim-treesitter/completion-treesitter' -- Only if you are using TS
use 'hrsh7th/nvim-cmp' -- Autocompletion plugin
use 'hrsh7th/cmp-nvim-lsp' -- LSP source for nvim-cmp
use 'saadparwaiz1/cmp_luasnip' -- Snippets source for nvim-cmp
use 'L3MON4D3/LuaSnip' -- Snippets plugin
然后是配置部分:
-- Add additional capabilities supported by nvim-cmp
local capabilities = vim.lsp.protocol.make_client_capabilities()
capabilities = require('cmp_nvim_lsp').update_capabilities(capabilities)
-- Configure ElixirLS as the LSP server for Elixir.
require'lspconfig'.elixirls.setup{
cmd = { "/home/my-user/path-to/elixir-ls/release/language_server.sh" },
-- on_attach = custom_attach, -- this may be required for extended functionalities of the LSP
capabilities = capabilities,
flags = {
debounce_text_changes = 150,
},
elixirLS = {
dialyzerEnabled = false,
fetchDeps = false,
};
}
local luasnip = require 'luasnip'
-- nvim-cmp
local cmp = require 'cmp'
cmp.setup {
snippet = {
expand = function(args)
require('luasnip').lsp_expand(args.body)
end,
},
mapping = {
['<C-p>'] = cmp.mapping.select_prev_item(),
['<C-n>'] = cmp.mapping.select_next_item(),
['<C-d>'] = cmp.mapping.scroll_docs(-4),
['<C-f>'] = cmp.mapping.scroll_docs(4),
['<C-Space>'] = cmp.mapping.complete(),
['<C-e>'] = cmp.mapping.close(),
['<CR>'] = cmp.mapping.confirm {
behavior = cmp.ConfirmBehavior.Replace,
select = true,
},
['<Tab>'] = function(fallback)
if cmp.visible() then
cmp.select_next_item()
elseif luasnip.expand_or_jumpable() then
luasnip.expand_or_jump()
else
fallback()
end
end,
['<S-Tab>'] = function(fallback)
if cmp.visible() then
cmp.select_prev_item()
elseif luasnip.jumpable(-1) then
luasnip.jump(-1)
else
fallback()
end
end,
},
sources = {
{ name = 'nvim_lsp' },
{ name = 'luasnip' },
},
}
你可以在我的 dotfiles 仓库中找到我所有的 neovim 配置:https://github.com/philss/dotfiles
作为参考,这是我使用的 nvim 版本(从源安装):
NVIM v0.7.0-dev+864-g2818de8b7
Build type: RelWithDebInfo
LuaJIT 2.1.0-beta3
Features: +acl +iconv +tui