feat: use nvim-lsp-setup to configure language servers
This commit is contained in:
parent
ae4c29d906
commit
5f032adc7a
@ -2,4 +2,4 @@
|
||||
|
||||
mkdir --parents ~/.config/nvim
|
||||
ln -svrf init.lua ~/.config/nvim/init.lua
|
||||
ln -svrf lua ~/.config/nvim/lua
|
||||
ln -svrf lua ~/.config/nvim/
|
||||
|
@ -104,81 +104,24 @@ return require('packer').startup(function(use)
|
||||
"davidsierradz/cmp-conventionalcommits", "hrsh7th/cmp-nvim-lua",
|
||||
"hrsh7th/cmp-calc"
|
||||
},
|
||||
config = function()
|
||||
local has_words_before = function()
|
||||
local line, col = unpack(vim.api.nvim_win_get_cursor(0))
|
||||
return col ~= 0 and
|
||||
vim.api.nvim_buf_get_lines(0, line - 1, line, true)[1]:sub(
|
||||
col, col):match("%s") == nil
|
||||
end
|
||||
|
||||
local cmp = require('cmp')
|
||||
local luasnip = require("luasnip")
|
||||
|
||||
cmp.setup({
|
||||
snippet = {
|
||||
expand = function(args)
|
||||
require("luasnip").lsp_expand(args.body)
|
||||
end
|
||||
},
|
||||
sources = require("cmp").config.sources({
|
||||
{name = "nvim_lsp"}, {name = "luasnip"}, {name = "path"},
|
||||
{name = "buffer"}, {name = "git"},
|
||||
{name = 'nvim_lsp_signature_help'},
|
||||
{name = "conventionalcommits"}, {name = "nvim-lua"},
|
||||
{name = "calc"}
|
||||
}),
|
||||
mapping = {
|
||||
['<C-Space>'] = cmp.mapping(cmp.mapping.complete(),
|
||||
{'i', 'c'}),
|
||||
['<CR>'] = cmp.mapping.confirm({select = true}),
|
||||
["<Tab>"] = cmp.mapping(function(fallback)
|
||||
if cmp.visible() then
|
||||
cmp.select_next_item()
|
||||
elseif luasnip.expand_or_jumpable() then
|
||||
luasnip.expand_or_jump()
|
||||
elseif has_words_before() then
|
||||
cmp.complete()
|
||||
else
|
||||
fallback()
|
||||
end
|
||||
end, {"i", "s"}),
|
||||
|
||||
["<S-Tab>"] = cmp.mapping(function(fallback)
|
||||
if cmp.visible() then
|
||||
cmp.select_prev_item()
|
||||
elseif luasnip.jumpable(-1) then
|
||||
luasnip.jump(-1)
|
||||
else
|
||||
fallback()
|
||||
end
|
||||
end, {"i", "s"})
|
||||
},
|
||||
experimental = {ghost_text = true}
|
||||
config = function() require('plugins.nvim-cmp') end,
|
||||
})
|
||||
|
||||
-- `/` cmdline setup.
|
||||
cmp.setup.cmdline('/', {sources = {{name = 'buffer'}}})
|
||||
|
||||
-- `:` cmdline setup.
|
||||
cmp.setup.cmdline(':', {
|
||||
sources = cmp.config
|
||||
.sources({{name = 'path'}}, {{name = 'cmdline'}})
|
||||
})
|
||||
|
||||
end
|
||||
})
|
||||
|
||||
-- highlight current symbol
|
||||
use({"RRethy/vim-illuminate"})
|
||||
|
||||
-- language server
|
||||
use({
|
||||
"neovim/nvim-lspconfig",
|
||||
config = function() require("plugins.lspconfig") end
|
||||
})
|
||||
use {
|
||||
'junnplus/nvim-lsp-setup',
|
||||
requires = {
|
||||
'neovim/nvim-lspconfig',
|
||||
'williamboman/nvim-lsp-installer',
|
||||
|
||||
use('williamboman/nvim-lsp-installer')
|
||||
-- additional rust tools
|
||||
"simrat39/rust-tools.nvim",
|
||||
|
||||
-- highlight current symbol
|
||||
"RRethy/vim-illuminate",
|
||||
},
|
||||
config = function() require('plugins.nvim-lsp-setup') end,
|
||||
}
|
||||
|
||||
-- treesitter
|
||||
use({
|
||||
@ -198,9 +141,6 @@ return require('packer').startup(function(use)
|
||||
-- automatic pairs
|
||||
use({ "Raimondi/delimitMate" })
|
||||
|
||||
-- rust tools
|
||||
use({"simrat39/rust-tools.nvim", requires = {{"neovim/nvim-lspconfig"}}})
|
||||
|
||||
-- markdown preview
|
||||
use({ 'iamcco/markdown-preview.nvim' })
|
||||
|
||||
|
@ -1,154 +0,0 @@
|
||||
local lsp_installer = require("nvim-lsp-installer")
|
||||
|
||||
local nvim_runtime_path = vim.split(package.path, ';')
|
||||
table.insert(nvim_runtime_path, "lua/?.lua")
|
||||
table.insert(nvim_runtime_path, "lua/?/init.lua")
|
||||
|
||||
local language_servers = {
|
||||
"ansiblels", "bashls", "clangd", "dockerls", "efm", "eslint", "html",
|
||||
"jsonls", "pyright", "rust_analyzer", "sumneko_lua", "svelte", "taplo",
|
||||
"terraformls", "tflint", "tsserver", "volar"
|
||||
}
|
||||
|
||||
for _, server_name in pairs(language_servers) do
|
||||
local server_found, server = lsp_installer.get_server(server_name)
|
||||
if server_found and not server:is_installed() then
|
||||
print("Installing " .. server_name)
|
||||
server:install()
|
||||
end
|
||||
end
|
||||
|
||||
local extra_server_opts = {
|
||||
["efm"] = function(opts)
|
||||
opts.filetypes = {
|
||||
"lua", "html", "javascript", "markdown", "typescript",
|
||||
"typescriptreact"
|
||||
}
|
||||
opts.init_options = {documentFormatting = true}
|
||||
opts.settings = {
|
||||
rootMarkers = {".git/"},
|
||||
languages = {
|
||||
lua = {{formatCommand = "lua-format -i", formatStdin = true}},
|
||||
html = {
|
||||
{
|
||||
formatCommand = "yarn run --silent prettier --stdin-filepath ${INPUT} --parser html",
|
||||
formatStdin = true
|
||||
}
|
||||
},
|
||||
javascript = {
|
||||
{
|
||||
formatCommand = "prettier --stdin-filepath ${INPUT}",
|
||||
formatStdin = true
|
||||
}
|
||||
},
|
||||
typescript = {
|
||||
{
|
||||
formatCommand = "yarn run --silent prettier --stdin-filepath ${INPUT} --parser typescript",
|
||||
formatStdin = true
|
||||
}
|
||||
},
|
||||
typescriptreact = {
|
||||
{
|
||||
formatCommand = "yarn run --silent prettier --stdin-filepath ${INPUT} --parser typescript",
|
||||
formatStdin = true
|
||||
}
|
||||
},
|
||||
markdown = {
|
||||
{
|
||||
formatCommand = "yarn run --silent prettier --stdin-filepath ${INPUT} --parser markdown",
|
||||
formatStdin = true
|
||||
}
|
||||
}
|
||||
}
|
||||
-- prettier-parser
|
||||
-- flow|babel|babel-flow|babel-ts|typescript|espree|meriyah|css|
|
||||
-- less|scss|json|json5|json-stringify|graphql|markdown|mdx|vue|yaml|glimmer|html|angular|lwc
|
||||
}
|
||||
end,
|
||||
["rust_analyzer"] = function(opts)
|
||||
opts.settings = {
|
||||
["rust-analyzer"] = {checkOnSave = {command = "clippy"}}
|
||||
}
|
||||
end,
|
||||
["sumneko_lua"] = function(opts)
|
||||
opts.settings = {
|
||||
Lua = {
|
||||
runtime = {version = 'LuaJIT', path = nvim_runtime_path},
|
||||
diagnostics = {globals = {'vim'}},
|
||||
workspace = {library = vim.api.nvim_get_runtime_file("", true)},
|
||||
telemetry = {enable = false}
|
||||
}
|
||||
}
|
||||
end
|
||||
}
|
||||
|
||||
local function custom_on_attach(client, buffer_nr)
|
||||
-- onmifunc
|
||||
vim.api.nvim_buf_set_option(buffer_nr, "omnifunc", "v:lua.vim.lsp.omnifunc")
|
||||
|
||||
-- Helper function
|
||||
local opts = {noremap = true, silent = true}
|
||||
local function bufnnoremap(key, action)
|
||||
vim.api.nvim_buf_set_keymap(buffer_nr, 'n', key, action, opts)
|
||||
end
|
||||
|
||||
-- Inspect function
|
||||
bufnnoremap("K", "<Cmd>lua vim.lsp.buf.hover()<CR>")
|
||||
bufnnoremap("<C-k>", "<Cmd>lua vim.lsp.buf.signature_help()<CR>")
|
||||
|
||||
-- Navigation
|
||||
bufnnoremap("gd", "<Cmd>lua vim.lsp.buf.definition()<CR>")
|
||||
bufnnoremap("gD", "<Cmd>lua vim.lsp.buf.declaration()<CR>")
|
||||
bufnnoremap("gi", "<Cmd>lua vim.lsp.buf.implementation()<CR>")
|
||||
bufnnoremap("gr", "<Cmd>lua vim.lsp.buf.references()<CR>")
|
||||
bufnnoremap("ga", "<Cmd>Telescope lsp_code_actions theme=cursor<CR>")
|
||||
|
||||
-- Rename all references of symbol
|
||||
bufnnoremap("<leader>r", "<Cmd>lua vim.lsp.buf.rename()<CR>")
|
||||
|
||||
-- Format buffer
|
||||
bufnnoremap("<leader>F", "<Cmd>lua vim.lsp.buf.formatting_sync()<CR>")
|
||||
|
||||
-- Navigate diagnostics
|
||||
bufnnoremap("<C-n>", "<Cmd>lua vim.diagnostic.goto_next()<CR>")
|
||||
bufnnoremap("<C-p>", "<Cmd>lua vim.diagnostic.goto_prev()<CR>")
|
||||
|
||||
-- Open diagnostics
|
||||
bufnnoremap("<leader>d", "<Cmd>Telescope diagnostics<CR>")
|
||||
|
||||
-- disable conflicting formatters
|
||||
if client.name == "tsserver" or client.name == "html" then
|
||||
client.resolved_capabilities.document_formatting = false
|
||||
end
|
||||
|
||||
if client.resolved_capabilities.document_formatting then
|
||||
vim.cmd("autocmd BufWritePre <buffer> lua vim.lsp.buf.formatting_sync()")
|
||||
end
|
||||
|
||||
-- vim-illuminate
|
||||
require("illuminate").on_attach(client)
|
||||
end
|
||||
|
||||
lsp_installer.on_server_ready(function(server)
|
||||
local cmp = require("cmp_nvim_lsp")
|
||||
|
||||
local opts = {
|
||||
on_attach = custom_on_attach,
|
||||
capabilities = cmp.update_capabilities(vim.lsp.protocol
|
||||
.make_client_capabilities())
|
||||
}
|
||||
|
||||
if extra_server_opts[server.name] then
|
||||
extra_server_opts[server.name](opts)
|
||||
end
|
||||
|
||||
if server.name == "rust_analyzer" then
|
||||
require("rust-tools").setup({
|
||||
server = vim.tbl_deep_extend("force", server:get_default_options(),
|
||||
opts)
|
||||
})
|
||||
server:attach_buffers()
|
||||
else
|
||||
server:setup(opts)
|
||||
end
|
||||
end)
|
60
nvim/lua/plugins/nvim-cmp.lua
Normal file
60
nvim/lua/plugins/nvim-cmp.lua
Normal file
@ -0,0 +1,60 @@
|
||||
local has_words_before = function()
|
||||
local line, col = unpack(vim.api.nvim_win_get_cursor(0))
|
||||
return col ~= 0 and
|
||||
vim.api.nvim_buf_get_lines(0, line - 1, line, true)[1]:sub(
|
||||
col, col):match("%s") == nil
|
||||
end
|
||||
|
||||
local cmp = require('cmp')
|
||||
local luasnip = require("luasnip")
|
||||
|
||||
cmp.setup({
|
||||
snippet = {
|
||||
expand = function(args)
|
||||
require("luasnip").lsp_expand(args.body)
|
||||
end
|
||||
},
|
||||
sources = require("cmp").config.sources({
|
||||
{ name = "nvim_lsp" }, { name = "luasnip" }, { name = "path" },
|
||||
{ name = "buffer" }, { name = "git" },
|
||||
{ name = 'nvim_lsp_signature_help' },
|
||||
{ name = "conventionalcommits" }, { name = "nvim-lua" },
|
||||
{ name = "calc" }
|
||||
}),
|
||||
mapping = {
|
||||
['<C-Space>'] = cmp.mapping(cmp.mapping.complete(),
|
||||
{ 'i', 'c' }),
|
||||
['<CR>'] = cmp.mapping.confirm({ select = true }),
|
||||
["<Tab>"] = cmp.mapping(function(fallback)
|
||||
if cmp.visible() then
|
||||
cmp.select_next_item()
|
||||
elseif luasnip.expand_or_jumpable() then
|
||||
luasnip.expand_or_jump()
|
||||
elseif has_words_before() then
|
||||
cmp.complete()
|
||||
else
|
||||
fallback()
|
||||
end
|
||||
end, { "i", "s" }),
|
||||
|
||||
["<S-Tab>"] = cmp.mapping(function(fallback)
|
||||
if cmp.visible() then
|
||||
cmp.select_prev_item()
|
||||
elseif luasnip.jumpable(-1) then
|
||||
luasnip.jump(-1)
|
||||
else
|
||||
fallback()
|
||||
end
|
||||
end, { "i", "s" })
|
||||
},
|
||||
experimental = { ghost_text = true }
|
||||
})
|
||||
|
||||
-- `/` cmdline setup.
|
||||
cmp.setup.cmdline('/', { sources = { { name = 'buffer' } } })
|
||||
|
||||
-- `:` cmdline setup.
|
||||
cmp.setup.cmdline(':', {
|
||||
sources = cmp.config
|
||||
.sources({ { name = 'path' } }, { { name = 'cmdline' } })
|
||||
})
|
64
nvim/lua/plugins/nvim-lsp-setup.lua
Normal file
64
nvim/lua/plugins/nvim-lsp-setup.lua
Normal file
@ -0,0 +1,64 @@
|
||||
local utils = require("nvim-lsp-setup.utils")
|
||||
|
||||
local nvim_runtime_path = vim.split(package.path, ";")
|
||||
table.insert(nvim_runtime_path, "lua/?.lua")
|
||||
table.insert(nvim_runtime_path, "lua/?/init.lua")
|
||||
|
||||
require("nvim-lsp-setup").setup({
|
||||
default_mappings = false,
|
||||
mappings = {
|
||||
gD = "lua vim.lsp.buf.declaration()",
|
||||
gd = "Telescope lsp_definitions",
|
||||
gt = "Telescope lsp_type_definitions",
|
||||
gi = "Telescope lsp_implementations",
|
||||
gr = "Telescope lsp_references",
|
||||
K = "lua vim.lsp.buf.hover()",
|
||||
["<C-k>"] = "lua vim.lsp.buf.signature_help()",
|
||||
["<leader>rn"] = "lua vim.lsp.buf.rename()",
|
||||
["<leader>ca"] = "Telescope lsp_code_actions theme=cursor",
|
||||
["<leader>f"] = "lua vim.lsp.buf.formatting()",
|
||||
["<leader>e"] = "lua vim.lsp.diagnostic.show_line_diagnostics()",
|
||||
["<leader>d"] = "Telescope diagnostics",
|
||||
["<C-p>"] = "lua vim.diagnostic.goto_prev()",
|
||||
["<C-n>"] = "lua vim.diagnostic.goto_next()",
|
||||
},
|
||||
on_attach = function(client)
|
||||
utils.format_on_save(client)
|
||||
require("illuminate").on_attach(client)
|
||||
end,
|
||||
servers = {
|
||||
ansiblels = {},
|
||||
bashls = {},
|
||||
dockerls = {},
|
||||
eslint = {},
|
||||
jsonls = {},
|
||||
pylsp = {},
|
||||
rust_analyzer = require("nvim-lsp-setup.rust-tools").setup({
|
||||
server = {
|
||||
settings = {
|
||||
["rust-analyzer"] = {
|
||||
cargo = {
|
||||
loadOutDirsFromCheck = true,
|
||||
},
|
||||
checkOnSave = { command = "clippy" },
|
||||
procMacro = {
|
||||
enable = true,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}),
|
||||
sumneko_lua = {
|
||||
settings = {
|
||||
Lua = {
|
||||
runtime = { version = "LuaJIT", path = nvim_runtime_path },
|
||||
diagnostics = { globals = { "vim" } },
|
||||
workspace = { library = vim.api.nvim_get_runtime_file("", true) },
|
||||
telemetry = { enable = false }
|
||||
}
|
||||
}
|
||||
},
|
||||
terraformls = {},
|
||||
volar = {},
|
||||
},
|
||||
})
|
Reference in New Issue
Block a user