diff --git a/.config/nvim/lua/tovi/plugins/lsp/lspconfig.lua b/.config/nvim/lua/tovi/plugins/lsp/lspconfig.lua index a6917ca..8e53b87 100644 --- a/.config/nvim/lua/tovi/plugins/lsp/lspconfig.lua +++ b/.config/nvim/lua/tovi/plugins/lsp/lspconfig.lua @@ -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", "Telescope lsp_references", 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", "Telescope lsp_definitions", opts) -- show lsp definitions - - opts.desc = "Show LSP implementations" - keymap.set("n", "gi", "Telescope lsp_implementations", opts) -- show lsp implementations - - opts.desc = "Show LSP type definitions" - keymap.set("n", "gt", "Telescope lsp_type_definitions", opts) -- show lsp type definitions - - opts.desc = "See available code actions" - keymap.set({ "n", "v" }, "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", "rn", vim.lsp.buf.rename, opts) -- smart rename - - opts.desc = "Show buffer diagnostics" - keymap.set("n", "D", "Telescope diagnostics bufnr=0", opts) -- show diagnostics for file - - opts.desc = "Show line diagnostics" - keymap.set("n", "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", "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", "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", "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", "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", "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", "Telescope lsp_references", 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", "Telescope lsp_definitions", opts) -- show lsp definitions + + opts.desc = "Show LSP implementations" + keymap.set("n", "gi", "Telescope lsp_implementations", opts) -- show lsp implementations + + opts.desc = "Show LSP type definitions" + keymap.set("n", "gt", "Telescope lsp_type_definitions", opts) -- show lsp type definitions + + opts.desc = "See available code actions" + keymap.set({ "n", "v" }, "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", "rn", vim.lsp.buf.rename, opts) -- smart rename + + opts.desc = "Show buffer diagnostics" + keymap.set("n", "D", "Telescope diagnostics bufnr=0", opts) -- show diagnostics for file + + opts.desc = "Show line diagnostics" + keymap.set("n", "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", "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", "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", "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", "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", "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, } diff --git a/.config/nvim/lua/tovi/plugins/php-use-sort.lua b/.config/nvim/lua/tovi/plugins/php-use-sort.lua new file mode 100644 index 0000000..5e2ea6b --- /dev/null +++ b/.config/nvim/lua/tovi/plugins/php-use-sort.lua @@ -0,0 +1,20 @@ +return { + "ricardoramirezr/php-use-sort.nvim", + dependencies = { + "nvim-treesitter/nvim-treesitter", + }, + ft = "php", + opts = { + order_by = "length", + order = "asc", + autocmd = true, + rm_unused = true, + }, + config = function(opts) + require("php-use-sort").setup(opts) + vim.keymap.set("n", "su", ":PhpUseSort", { + desc = "Sort PHP use lines by length", + silent = true, + }) + end, +}