|
|
@ -1,249 +1,256 @@ |
|
|
|
return { |
|
|
|
"neovim/nvim-lspconfig", |
|
|
|
event = { "BufReadPre", "BufNewFile" }, |
|
|
|
dependencies = { |
|
|
|
"hrsh7th/cmp-nvim-lsp", |
|
|
|
{ "antosha417/nvim-lsp-file-operations", config = true }, |
|
|
|
}, |
|
|
|
config = function() |
|
|
|
-- import lspconfig plugin |
|
|
|
local lspconfig = require("lspconfig") |
|
|
|
local util = require("lspconfig.util") |
|
|
|
"neovim/nvim-lspconfig", |
|
|
|
event = { "BufReadPre", "BufNewFile" }, |
|
|
|
dependencies = { |
|
|
|
"hrsh7th/cmp-nvim-lsp", |
|
|
|
{ "antosha417/nvim-lsp-file-operations", config = true }, |
|
|
|
}, |
|
|
|
config = function() |
|
|
|
-- import lspconfig plugin |
|
|
|
local lspconfig = require("lspconfig") |
|
|
|
local util = require("lspconfig.util") |
|
|
|
|
|
|
|
-- import cmp-nvim-lsp plugin |
|
|
|
local cmp_nvim_lsp = require("cmp_nvim_lsp") |
|
|
|
|
|
|
|
local keymap = vim.keymap |
|
|
|
|
|
|
|
local opts = { noremap = true, silent = true } |
|
|
|
local on_attach = function(_, bufnr) |
|
|
|
opts.buffer = bufnr |
|
|
|
|
|
|
|
-- set keybinds |
|
|
|
opts.desc = "Show LSP references" |
|
|
|
keymap.set("n", "gr", "<cmd>Telescope lsp_references<CR>", opts) -- show definition, references |
|
|
|
|
|
|
|
opts.desc = "Go to declaration" |
|
|
|
keymap.set("n", "gD", vim.lsp.buf.declaration, opts) -- go to declaration |
|
|
|
|
|
|
|
opts.desc = "Show LSP definitions" |
|
|
|
keymap.set("n", "gd", "<cmd>Telescope lsp_definitions<CR>", opts) -- show lsp definitions |
|
|
|
|
|
|
|
opts.desc = "Show LSP implementations" |
|
|
|
keymap.set("n", "gi", "<cmd>Telescope lsp_implementations<CR>", opts) -- show lsp implementations |
|
|
|
|
|
|
|
opts.desc = "Show LSP type definitions" |
|
|
|
keymap.set("n", "gt", "<cmd>Telescope lsp_type_definitions<CR>", opts) -- show lsp type definitions |
|
|
|
|
|
|
|
opts.desc = "See available code actions" |
|
|
|
keymap.set({ "n", "v" }, "<leader>ca", vim.lsp.buf.code_action, opts) -- see available code actions, in visual mode will apply to selection |
|
|
|
|
|
|
|
opts.desc = "Smart rename" |
|
|
|
keymap.set("n", "<leader>rn", vim.lsp.buf.rename, opts) -- smart rename |
|
|
|
|
|
|
|
opts.desc = "Show buffer diagnostics" |
|
|
|
keymap.set("n", "<leader>D", "<cmd>Telescope diagnostics bufnr=0<CR>", opts) -- show diagnostics for file |
|
|
|
|
|
|
|
opts.desc = "Show line diagnostics" |
|
|
|
keymap.set("n", "<leader>d", vim.diagnostic.open_float, opts) -- show diagnostics for line |
|
|
|
|
|
|
|
opts.desc = "Go to previous diagnostic" |
|
|
|
keymap.set("n", "[d", vim.diagnostic.goto_prev, opts) -- jump to previous diagnostic in buffer |
|
|
|
|
|
|
|
opts.desc = "Go to previous diagnostic" |
|
|
|
keymap.set("n", "<leader>pd", vim.diagnostic.goto_prev, opts) -- jump to previous diagnostic in buffer |
|
|
|
|
|
|
|
opts.desc = "Go to next diagnostic" |
|
|
|
keymap.set("n", "]d", vim.diagnostic.goto_next, opts) -- jump to next diagnostic in buffer |
|
|
|
|
|
|
|
opts.desc = "Go to next diagnostic" |
|
|
|
keymap.set("n", "<leader>nd", vim.diagnostic.goto_next, opts) -- jump to next diagnostic in buffer |
|
|
|
|
|
|
|
opts.desc = "Go to previous diagnostic (error only)" |
|
|
|
keymap.set("n", "[e", function() |
|
|
|
vim.diagnostic.goto_prev({ severity = vim.diagnostic.severity.ERROR }) |
|
|
|
end, opts) |
|
|
|
|
|
|
|
opts.desc = "Go to previous diagnostic (error only)" |
|
|
|
keymap.set("n", "<leader>pe", function() |
|
|
|
vim.diagnostic.goto_prev({ severity = vim.diagnostic.severity.ERROR }) |
|
|
|
end, opts) |
|
|
|
|
|
|
|
opts.desc = "Go to next diagnostic (error only)" |
|
|
|
keymap.set("n", "]e", function() |
|
|
|
vim.diagnostic.goto_next({ severity = vim.diagnostic.severity.ERROR }) |
|
|
|
end, opts) |
|
|
|
|
|
|
|
opts.desc = "Go to next diagnostic (error only)" |
|
|
|
keymap.set("n", "<leader>ne", function() |
|
|
|
vim.diagnostic.goto_next({ severity = vim.diagnostic.severity.ERROR }) |
|
|
|
end, opts) |
|
|
|
|
|
|
|
opts.desc = "Show documentation for what is under cursor" |
|
|
|
keymap.set("n", "<leader>ld", vim.diagnostic.setqflist, opts) -- show documentation for what is under cursor |
|
|
|
|
|
|
|
opts.desc = "Show documentation for what is under cursor" |
|
|
|
keymap.set("n", "K", vim.lsp.buf.hover, opts) -- show documentation for what is under cursor |
|
|
|
end |
|
|
|
|
|
|
|
-- override default floating window border if not set |
|
|
|
local orig_util_open_floating_preview = vim.lsp.util.open_floating_preview |
|
|
|
---@diagnostic disable-next-line: duplicate-set-field |
|
|
|
function vim.lsp.util.open_floating_preview(contents, syntax, options, ...) |
|
|
|
options = options or {} |
|
|
|
options.border = options.border or "rounded" |
|
|
|
return orig_util_open_floating_preview(contents, syntax, options, ...) |
|
|
|
end |
|
|
|
|
|
|
|
-- used to enable autocompletion (assign to every lsp server config) |
|
|
|
local capabilities = cmp_nvim_lsp.default_capabilities() |
|
|
|
|
|
|
|
-- Change the Diagnostic symbols in the sign column (gutter) |
|
|
|
local signs = { Error = " ", Warn = " ", Hint = " ", Info = " " } |
|
|
|
for type, icon in pairs(signs) do |
|
|
|
local hl = "DiagnosticSign" .. type |
|
|
|
vim.fn.sign_define(hl, { text = icon, texthl = hl, numhl = "" }) |
|
|
|
end |
|
|
|
|
|
|
|
lspconfig.html.setup({ |
|
|
|
capabilities = capabilities, |
|
|
|
on_attach = on_attach, |
|
|
|
}) |
|
|
|
|
|
|
|
-- Function to detect the operating system |
|
|
|
local function get_os() |
|
|
|
local handle = io.popen("uname") |
|
|
|
if not handle then |
|
|
|
return error("Failed to detect operating system") |
|
|
|
end |
|
|
|
local result = handle:read("*a") |
|
|
|
handle:close() |
|
|
|
return result:lower():gsub("%s+", "") |
|
|
|
end |
|
|
|
|
|
|
|
-- Set the base path based on the operating system |
|
|
|
local os = get_os() |
|
|
|
local base_path = "" |
|
|
|
|
|
|
|
if os == "darwin" then |
|
|
|
base_path = "/opt/homebrew/lib/node_modules" |
|
|
|
elseif os == "linux" then |
|
|
|
base_path = "/usr/local/lib/node_modules" |
|
|
|
end |
|
|
|
|
|
|
|
lspconfig.tsserver.setup({ |
|
|
|
init_options = { |
|
|
|
plugins = { |
|
|
|
{ |
|
|
|
name = "@vue/typescript-plugin", |
|
|
|
location = base_path .. "/@vue/typescript-plugin", |
|
|
|
languages = { "javascript", "typescript", "vue" }, |
|
|
|
}, |
|
|
|
}, |
|
|
|
}, |
|
|
|
filetypes = { |
|
|
|
"javascript", |
|
|
|
"typescript", |
|
|
|
"vue", |
|
|
|
}, |
|
|
|
capabilities = capabilities, |
|
|
|
}) |
|
|
|
|
|
|
|
local function get_typescript_server_path(root_dir) |
|
|
|
local global_ts = base_path .. "/typescript/lib" |
|
|
|
local found_ts = "" |
|
|
|
local function check_dir(path) |
|
|
|
found_ts = util.path.join(path, "node_modules", "typescript", "lib") |
|
|
|
if util.path.exists(found_ts) then |
|
|
|
return path |
|
|
|
end |
|
|
|
end |
|
|
|
if util.search_ancestors(root_dir, check_dir) then |
|
|
|
return found_ts |
|
|
|
else |
|
|
|
return global_ts |
|
|
|
end |
|
|
|
end |
|
|
|
|
|
|
|
lspconfig.volar.setup({ |
|
|
|
capabilities = capabilities, |
|
|
|
on_attach = on_attach, |
|
|
|
filetypes = { |
|
|
|
"javascript", |
|
|
|
"typescript", |
|
|
|
"vue", |
|
|
|
}, |
|
|
|
on_new_config = function(new_config, new_root_dir) |
|
|
|
new_config.init_options.typescript.tsdk = get_typescript_server_path(new_root_dir) |
|
|
|
end, |
|
|
|
}) |
|
|
|
|
|
|
|
-- configure css server |
|
|
|
lspconfig["cssls"].setup({ |
|
|
|
capabilities = capabilities, |
|
|
|
on_attach = on_attach, |
|
|
|
}) |
|
|
|
|
|
|
|
-- configure php server |
|
|
|
lspconfig["intelephense"].setup({ |
|
|
|
root_dir = function(pattern) |
|
|
|
---@diagnostic disable-next-line: undefined-field |
|
|
|
local cwd = vim.loop.cwd() |
|
|
|
local root = util.root_pattern("composer.json")(pattern) |
|
|
|
|
|
|
|
-- prefer cwd if root is a descendant |
|
|
|
return util.path.is_descendant(cwd, root) and cwd or root |
|
|
|
end, |
|
|
|
capabilities = capabilities, |
|
|
|
on_attach = on_attach, |
|
|
|
init_options = { |
|
|
|
licenceKey = vim.fn.expand("$HOME/.local/share/nvim/intelephense-licence.txt"), |
|
|
|
}, |
|
|
|
settings = {}, |
|
|
|
}) |
|
|
|
|
|
|
|
lspconfig.gopls.setup({ |
|
|
|
on_attach = on_attach, |
|
|
|
capabilities = capabilities, |
|
|
|
cmd = { "gopls" }, |
|
|
|
filetypes = { "go", "gomod", "gowork", "gotmpl" }, |
|
|
|
root_dir = util.root_pattern("go.work", "go.mod", ".git"), |
|
|
|
settings = { |
|
|
|
gopls = { |
|
|
|
completeUnimported = true, |
|
|
|
usePlaceholders = true, |
|
|
|
analyses = { |
|
|
|
unusedparams = true, |
|
|
|
}, |
|
|
|
}, |
|
|
|
}, |
|
|
|
}) |
|
|
|
|
|
|
|
-- configure lua server (with special settings) |
|
|
|
lspconfig["lua_ls"].setup({ |
|
|
|
capabilities = capabilities, |
|
|
|
on_attach = on_attach, |
|
|
|
settings = { -- custom settings for lua |
|
|
|
Lua = { |
|
|
|
-- make the language server recognize "vim" global |
|
|
|
diagnostics = { |
|
|
|
globals = { "vim" }, |
|
|
|
}, |
|
|
|
workspace = { |
|
|
|
-- make language server aware of runtime files |
|
|
|
library = { |
|
|
|
[vim.fn.expand("$VIMRUNTIME/lua")] = true, |
|
|
|
[vim.fn.stdpath("config") .. "/lua"] = true, |
|
|
|
}, |
|
|
|
}, |
|
|
|
}, |
|
|
|
}, |
|
|
|
}) |
|
|
|
|
|
|
|
-- configure python server |
|
|
|
lspconfig["dartls"].setup({ |
|
|
|
capabilities = capabilities, |
|
|
|
on_attach = on_attach, |
|
|
|
}) |
|
|
|
end, |
|
|
|
-- import cmp-nvim-lsp plugin |
|
|
|
local cmp_nvim_lsp = require("cmp_nvim_lsp") |
|
|
|
|
|
|
|
local keymap = vim.keymap |
|
|
|
|
|
|
|
local opts = { noremap = true, silent = true } |
|
|
|
local on_attach = function(_, bufnr) |
|
|
|
opts.buffer = bufnr |
|
|
|
|
|
|
|
-- set keybinds |
|
|
|
opts.desc = "Show LSP references" |
|
|
|
keymap.set("n", "gr", "<cmd>Telescope lsp_references<CR>", opts) -- show definition, references |
|
|
|
|
|
|
|
opts.desc = "Go to declaration" |
|
|
|
keymap.set("n", "gD", vim.lsp.buf.declaration, opts) -- go to declaration |
|
|
|
|
|
|
|
opts.desc = "Show LSP definitions" |
|
|
|
keymap.set("n", "gd", "<cmd>Telescope lsp_definitions<CR>", opts) -- show lsp definitions |
|
|
|
|
|
|
|
opts.desc = "Show LSP implementations" |
|
|
|
keymap.set("n", "gi", "<cmd>Telescope lsp_implementations<CR>", opts) -- show lsp implementations |
|
|
|
|
|
|
|
opts.desc = "Show LSP type definitions" |
|
|
|
keymap.set("n", "gt", "<cmd>Telescope lsp_type_definitions<CR>", opts) -- show lsp type definitions |
|
|
|
|
|
|
|
opts.desc = "See available code actions" |
|
|
|
keymap.set({ "n", "v" }, "<leader>ca", vim.lsp.buf.code_action, opts) -- see available code actions, in visual mode will apply to selection |
|
|
|
|
|
|
|
opts.desc = "Smart rename" |
|
|
|
keymap.set("n", "<leader>rn", vim.lsp.buf.rename, opts) -- smart rename |
|
|
|
|
|
|
|
opts.desc = "Show buffer diagnostics" |
|
|
|
keymap.set("n", "<leader>D", "<cmd>Telescope diagnostics bufnr=0<CR>", opts) -- show diagnostics for file |
|
|
|
|
|
|
|
opts.desc = "Show line diagnostics" |
|
|
|
keymap.set("n", "<leader>d", vim.diagnostic.open_float, opts) -- show diagnostics for line |
|
|
|
|
|
|
|
opts.desc = "Go to previous diagnostic" |
|
|
|
keymap.set("n", "[d", vim.diagnostic.goto_prev, opts) -- jump to previous diagnostic in buffer |
|
|
|
|
|
|
|
opts.desc = "Go to previous diagnostic" |
|
|
|
keymap.set("n", "<leader>pd", vim.diagnostic.goto_prev, opts) -- jump to previous diagnostic in buffer |
|
|
|
|
|
|
|
opts.desc = "Go to next diagnostic" |
|
|
|
keymap.set("n", "]d", vim.diagnostic.goto_next, opts) -- jump to next diagnostic in buffer |
|
|
|
|
|
|
|
opts.desc = "Go to next diagnostic" |
|
|
|
keymap.set("n", "<leader>nd", vim.diagnostic.goto_next, opts) -- jump to next diagnostic in buffer |
|
|
|
|
|
|
|
opts.desc = "Go to previous diagnostic (error only)" |
|
|
|
keymap.set("n", "[e", function() |
|
|
|
vim.diagnostic.goto_prev({ severity = vim.diagnostic.severity.ERROR }) |
|
|
|
end, opts) |
|
|
|
|
|
|
|
opts.desc = "Go to previous diagnostic (error only)" |
|
|
|
keymap.set("n", "<leader>pe", function() |
|
|
|
vim.diagnostic.goto_prev({ severity = vim.diagnostic.severity.ERROR }) |
|
|
|
end, opts) |
|
|
|
|
|
|
|
opts.desc = "Go to next diagnostic (error only)" |
|
|
|
keymap.set("n", "]e", function() |
|
|
|
vim.diagnostic.goto_next({ severity = vim.diagnostic.severity.ERROR }) |
|
|
|
end, opts) |
|
|
|
|
|
|
|
opts.desc = "Go to next diagnostic (error only)" |
|
|
|
keymap.set("n", "<leader>ne", function() |
|
|
|
vim.diagnostic.goto_next({ severity = vim.diagnostic.severity.ERROR }) |
|
|
|
end, opts) |
|
|
|
|
|
|
|
opts.desc = "Show documentation for what is under cursor" |
|
|
|
keymap.set("n", "<leader>ld", vim.diagnostic.setqflist, opts) -- show documentation for what is under cursor |
|
|
|
|
|
|
|
opts.desc = "Show documentation for what is under cursor" |
|
|
|
keymap.set("n", "K", vim.lsp.buf.hover, opts) -- show documentation for what is under cursor |
|
|
|
end |
|
|
|
|
|
|
|
-- override default floating window border if not set |
|
|
|
local orig_util_open_floating_preview = vim.lsp.util.open_floating_preview |
|
|
|
---@diagnostic disable-next-line: duplicate-set-field |
|
|
|
function vim.lsp.util.open_floating_preview(contents, syntax, options, ...) |
|
|
|
options = options or {} |
|
|
|
options.border = options.border or "rounded" |
|
|
|
return orig_util_open_floating_preview(contents, syntax, options, ...) |
|
|
|
end |
|
|
|
|
|
|
|
-- used to enable autocompletion (assign to every lsp server config) |
|
|
|
local capabilities = cmp_nvim_lsp.default_capabilities() |
|
|
|
|
|
|
|
-- Change the Diagnostic symbols in the sign column (gutter) |
|
|
|
local signs = { Error = " ", Warn = " ", Hint = " ", Info = " " } |
|
|
|
for type, icon in pairs(signs) do |
|
|
|
local hl = "DiagnosticSign" .. type |
|
|
|
vim.fn.sign_define(hl, { text = icon, texthl = hl, numhl = "" }) |
|
|
|
end |
|
|
|
|
|
|
|
lspconfig.html.setup({ |
|
|
|
capabilities = capabilities, |
|
|
|
on_attach = on_attach, |
|
|
|
}) |
|
|
|
|
|
|
|
-- Function to detect the operating system |
|
|
|
local function get_os() |
|
|
|
local handle = io.popen("uname") |
|
|
|
if not handle then |
|
|
|
return error("Failed to detect operating system") |
|
|
|
end |
|
|
|
local result = handle:read("*a") |
|
|
|
handle:close() |
|
|
|
return result:lower():gsub("%s+", "") |
|
|
|
end |
|
|
|
|
|
|
|
-- Set the base path based on the operating system |
|
|
|
local os = get_os() |
|
|
|
local base_path = "" |
|
|
|
|
|
|
|
if os == "darwin" then |
|
|
|
base_path = "/opt/homebrew/lib/node_modules" |
|
|
|
elseif os == "linux" then |
|
|
|
base_path = "/usr/local/lib/node_modules" |
|
|
|
end |
|
|
|
|
|
|
|
lspconfig.tsserver.setup({ |
|
|
|
init_options = { |
|
|
|
plugins = { |
|
|
|
{ |
|
|
|
name = "@vue/typescript-plugin", |
|
|
|
location = base_path .. "/@vue/typescript-plugin", |
|
|
|
languages = { "javascript", "typescript", "vue" }, |
|
|
|
}, |
|
|
|
}, |
|
|
|
}, |
|
|
|
filetypes = { |
|
|
|
"javascript", |
|
|
|
"typescript", |
|
|
|
"vue", |
|
|
|
}, |
|
|
|
capabilities = capabilities, |
|
|
|
}) |
|
|
|
|
|
|
|
local function get_typescript_server_path(root_dir) |
|
|
|
local global_ts = base_path .. "/typescript/lib" |
|
|
|
local found_ts = "" |
|
|
|
local function check_dir(path) |
|
|
|
found_ts = util.path.join(path, "node_modules", "typescript", "lib") |
|
|
|
if util.path.exists(found_ts) then |
|
|
|
return path |
|
|
|
end |
|
|
|
end |
|
|
|
if util.search_ancestors(root_dir, check_dir) then |
|
|
|
return found_ts |
|
|
|
else |
|
|
|
return global_ts |
|
|
|
end |
|
|
|
end |
|
|
|
|
|
|
|
lspconfig.volar.setup({ |
|
|
|
capabilities = capabilities, |
|
|
|
on_attach = on_attach, |
|
|
|
filetypes = { |
|
|
|
"javascript", |
|
|
|
"typescript", |
|
|
|
"vue", |
|
|
|
}, |
|
|
|
on_new_config = function(new_config, new_root_dir) |
|
|
|
new_config.init_options.typescript.tsdk = get_typescript_server_path(new_root_dir) |
|
|
|
end, |
|
|
|
}) |
|
|
|
|
|
|
|
-- configure css server |
|
|
|
lspconfig["cssls"].setup({ |
|
|
|
capabilities = capabilities, |
|
|
|
on_attach = on_attach, |
|
|
|
}) |
|
|
|
|
|
|
|
-- configure php server |
|
|
|
lspconfig.intelephense.setup({ |
|
|
|
root_dir = function(pattern) |
|
|
|
---@diagnostic disable-next-line: undefined-field |
|
|
|
local cwd = vim.loop.cwd() |
|
|
|
local root = util.root_pattern("composer.json")(pattern) |
|
|
|
|
|
|
|
-- prefer cwd if root is a descendant |
|
|
|
return util.path.is_descendant(cwd, root) and cwd or root |
|
|
|
end, |
|
|
|
capabilities = capabilities, |
|
|
|
on_attach = on_attach, |
|
|
|
init_options = { |
|
|
|
licenceKey = vim.fn.expand("$HOME/.local/share/nvim/intelephense-licence.txt"), |
|
|
|
}, |
|
|
|
settings = { |
|
|
|
intelephense = { |
|
|
|
format = { |
|
|
|
enable = true, |
|
|
|
sortUseStatements = false, |
|
|
|
} |
|
|
|
}, |
|
|
|
}, |
|
|
|
}) |
|
|
|
|
|
|
|
lspconfig.gopls.setup({ |
|
|
|
on_attach = on_attach, |
|
|
|
capabilities = capabilities, |
|
|
|
cmd = { "gopls" }, |
|
|
|
filetypes = { "go", "gomod", "gowork", "gotmpl" }, |
|
|
|
root_dir = util.root_pattern("go.work", "go.mod", ".git"), |
|
|
|
settings = { |
|
|
|
gopls = { |
|
|
|
completeUnimported = true, |
|
|
|
usePlaceholders = true, |
|
|
|
analyses = { |
|
|
|
unusedparams = true, |
|
|
|
}, |
|
|
|
}, |
|
|
|
}, |
|
|
|
}) |
|
|
|
|
|
|
|
-- configure lua server (with special settings) |
|
|
|
lspconfig["lua_ls"].setup({ |
|
|
|
capabilities = capabilities, |
|
|
|
on_attach = on_attach, |
|
|
|
settings = { -- custom settings for lua |
|
|
|
Lua = { |
|
|
|
-- make the language server recognize "vim" global |
|
|
|
diagnostics = { |
|
|
|
globals = { "vim" }, |
|
|
|
}, |
|
|
|
workspace = { |
|
|
|
-- make language server aware of runtime files |
|
|
|
library = { |
|
|
|
[vim.fn.expand("$VIMRUNTIME/lua")] = true, |
|
|
|
[vim.fn.stdpath("config") .. "/lua"] = true, |
|
|
|
}, |
|
|
|
}, |
|
|
|
}, |
|
|
|
}, |
|
|
|
}) |
|
|
|
|
|
|
|
-- configure python server |
|
|
|
lspconfig["dartls"].setup({ |
|
|
|
capabilities = capabilities, |
|
|
|
on_attach = on_attach, |
|
|
|
}) |
|
|
|
end, |
|
|
|
} |