diff --git a/bootstrap/config_dirs/nvim/init.lua b/bootstrap/config_dirs/nvim/init.lua index e5b9c1f..a4e4857 100644 --- a/bootstrap/config_dirs/nvim/init.lua +++ b/bootstrap/config_dirs/nvim/init.lua @@ -1,2 +1,2 @@ -require("user.core") -require("user.lazy") +require("core") +require("plugins") \ No newline at end of file diff --git a/bootstrap/config_dirs/nvim/lazy-lock.json b/bootstrap/config_dirs/nvim/lazy-lock.json index 829aeef..9188b13 100644 --- a/bootstrap/config_dirs/nvim/lazy-lock.json +++ b/bootstrap/config_dirs/nvim/lazy-lock.json @@ -8,7 +8,7 @@ "cmp-nvim-lsp": { "branch": "main", "commit": "bd5a7d6db125d4654b50eeae9f5217f24bb22fd3" }, "cmp-path": { "branch": "main", "commit": "c642487086dbd9a93160e1679a1327be111cbc25" }, "cmp_luasnip": { "branch": "master", "commit": "98d9cb5c2c38532bd9bdb481067b20fea8f32e90" }, - "conform.nvim": { "branch": "master", "commit": "b4aab989db276993ea5dcb78872be494ce546521" }, + "conform.nvim": { "branch": "master", "commit": "3bad87250ed85246fe8c5bc10005ab5a6289ae4c" }, "dashboard-nvim": { "branch": "master", "commit": "0775e567b6c0be96d01a61795f7b64c1758262f6" }, "diffview.nvim": { "branch": "main", "commit": "4516612fe98ff56ae0415a259ff6361a89419b0a" }, "dressing.nvim": { "branch": "master", "commit": "2d7c2db2507fa3c4956142ee607431ddb2828639" }, @@ -22,17 +22,14 @@ "lspkind.nvim": { "branch": "master", "commit": "3ddd1b4edefa425fda5a9f95a4f25578727c0bb3" }, "lspsaga.nvim": { "branch": "main", "commit": "8efe00d6aed9db6449969f889170f1a7e43101a1" }, "lualine.nvim": { "branch": "master", "commit": "b8c23159c0161f4b89196f74ee3a6d02cdc3a955" }, - "mason-lspconfig.nvim": { "branch": "main", "commit": "a1067cf84b4ff81b66d2bf4d01f4cbdb5de40bd0" }, "mason-tool-installer.nvim": { "branch": "main", "commit": "517ef5994ef9d6b738322664d5fdd948f0fdeb46" }, - "mason.nvim": { "branch": "main", "commit": "7dc4facca9702f95353d5a1f87daf23d78e31c2a" }, - "neodev.nvim": { "branch": "main", "commit": "46aa467dca16cf3dfe27098042402066d2ae242d" }, + "mason.nvim": { "branch": "main", "commit": "b3689a41dd77e5294498dba9757fb22cc80cbebd" }, "neogit": { "branch": "master", "commit": "add70101fab5913cad33ab2f84f1a6ee092e7220" }, "nerdy.nvim": { "branch": "main", "commit": "a8e3f70dc0232e956adfb12c647b7e9e2b2e6c89" }, "noice.nvim": { "branch": "main", "commit": "df448c649ef6bc5a6a633a44f2ad0ed8d4442499" }, "nvim-autopairs": { "branch": "master", "commit": "23320e75953ac82e559c610bec5a90d9c6dfa743" }, "nvim-cmp": { "branch": "main", "commit": "b5311ab3ed9c846b585c0c15b7559be131ec4be9" }, "nvim-lint": { "branch": "master", "commit": "335a6044be16d7701001059cba9baa36fbeef422" }, - "nvim-lsp-file-operations": { "branch": "master", "commit": "9744b738183a5adca0f916527922078a965515ed" }, "nvim-lspconfig": { "branch": "master", "commit": "336b388c272555d2ae94627a50df4c2f89a5e257" }, "nvim-notify": { "branch": "master", "commit": "8701bece920b38ea289b457f902e2ad184131a5d" }, "nvim-surround": { "branch": "main", "commit": "a868c256c861044beb9794b4dd126480dcdfbdad" }, diff --git a/bootstrap/config_dirs/nvim/lsp/bashls.lua b/bootstrap/config_dirs/nvim/lsp/bashls.lua new file mode 100644 index 0000000..fc1d9e4 --- /dev/null +++ b/bootstrap/config_dirs/nvim/lsp/bashls.lua @@ -0,0 +1,4 @@ +return { + cmd = { "bash-language-server", "start" }, + filetypes = { "bash", "sh", "zsh", "dotenv" }, +} diff --git a/bootstrap/config_dirs/nvim/lsp/gopls.lua b/bootstrap/config_dirs/nvim/lsp/gopls.lua new file mode 100644 index 0000000..d9af0bb --- /dev/null +++ b/bootstrap/config_dirs/nvim/lsp/gopls.lua @@ -0,0 +1,110 @@ +return { + cmd = { "gopls" }, + filetypes = { "go", "gomod", "gowork", "gotmpl", "gosum" }, + root_markers = { "go.mod", "go.work", ".git" }, + settings = { + gopls = { + gofumpt = true, + codelenses = { + gc_details = false, + generate = true, + regenerate_cgo = true, + run_govulncheck = true, + test = true, + tidy = true, + upgrade_dependency = true, + vendor = true, + }, + hints = { + assignVariableTypes = false, + compositeLiteralFields = false, + compositeLiteralTypes = false, + constantValues = false, + functionTypeParameters = false, + parameterNames = false, + rangeVariableTypes = false, + }, + analyses = { + -- NOTE: To temporarily enable disabled analyzers for specific debugging: + -- :lua vim.lsp.stop_client(vim.lsp.get_clients({name = "gopls"})) + -- Then edit this file and save, LSP will restart with new settings + + -- Essential analyzers for catching common issues + nilness = true, -- Check for nil pointer dereferences + unusedparams = true, -- Find unused function parameters + unusedwrite = true, -- Find unused writes to variables + useany = true, -- Suggest using 'any' instead of 'interface{}' + unreachable = true, -- Find unreachable code + unusedresult = true, -- Check for unused results of calls to certain functions + + -- Helpful but not critical (enable as needed) + simplifyslice = true, -- Simplify slice expressions + simplifyrange = true, -- Simplify range loops + simplifycompositelit = true, -- Simplify composite literals + + -- Performance-intensive analyzers (disabled for better performance) + shadow = false, -- Check for shadowed variables (can be slow) + printf = false, -- Check printf-style functions (can be slow) + structtag = false, -- Check struct tags (can be slow) + -- fieldalignment = false, -- Check struct field alignment (very slow) + -- unusedvariable = false, -- Can be slow on large codebases + + -- Less commonly needed analyzers (disabled) + modernize = false, + stylecheck = false, + appends = false, + asmdecl = false, + assign = false, + atomic = false, + atomicalign = false, + bools = false, + buildtag = false, + cgocall = false, + composite = false, + composites = false, + contextcheck = false, + copylocks = false, + deba = false, + deepequalerrors = false, + defers = false, + deprecated = false, + directive = false, + embed = false, + errorsas = false, + fillreturns = false, + framepointer = false, + gofix = false, + hostport = false, + httpresponse = false, + ifaceassert = false, + infertypeargs = false, + loopclosure = false, + lostcancel = false, + nilfunc = false, + nonewvars = false, + noresultvalues = false, + shift = false, + sigchanyzer = false, + slog = false, + sortslice = false, + stdmethods = false, + stdversion = false, + stringintconv = false, + testinggoroutine = false, + tests = false, + timeformat = false, + unmarshal = false, + unsafeptr = false, + unusedfunc = false, + unusedvariable = false, + waitgroup = false, + yield = false, + }, + usePlaceholders = true, + completeUnimported = true, + staticcheck = true, + directoryFilters = { "-.git", "-.vscode", "-.idea", "-.vscode-test", "-node_modules" }, + semanticTokens = false, + }, + }, +} diff --git a/bootstrap/config_dirs/nvim/lsp/lua-ls.lua b/bootstrap/config_dirs/nvim/lsp/lua-ls.lua new file mode 100644 index 0000000..646bb6f --- /dev/null +++ b/bootstrap/config_dirs/nvim/lsp/lua-ls.lua @@ -0,0 +1,45 @@ +return { + cmd = { "lua-language-server" }, + filetypes = { "lua" }, + root_markers = { + ".luarc.json", + ".luarc.jsonc", + ".luacheckrc", + ".stylua.toml", + "stylua.toml", + "selene.toml", + "selene.yml", + ".git", + }, + settings = { + Lua = { + diagnostics = { + disable = { "missing-fields" }, + globals = { + "vim", + "Snacks", + }, + }, + hint = { + enable = true, + setType = false, + paramType = true, + paramName = "Disable", + semicolon = "Disable", + arrayIndex = "Disable", + }, + }, + }, + -- capabilities = vim.tbl_deep_extend( + -- "force", + -- {}, + -- vim.lsp.protocol.make_client_capabilities(), + -- blink.get_lsp_capabilities(), + -- { + -- fileOperations = { + -- didRename = true, + -- willRename = true, + -- }, + -- } + -- ), +} diff --git a/bootstrap/config_dirs/nvim/lua/core/autocmds.lua b/bootstrap/config_dirs/nvim/lua/core/autocmds.lua new file mode 100644 index 0000000..b931e29 --- /dev/null +++ b/bootstrap/config_dirs/nvim/lua/core/autocmds.lua @@ -0,0 +1,46 @@ +vim.api.nvim_create_autocmd("LspAttach", { + callback = function(event) + local map = function(keys, func, desc) + vim.keymap.set("n", keys, func, { buffer = event.buf, desc = "LSP: " .. desc }) + end + + map("gl", vim.diagnostic.open_float, "Open Diagnostic Float") + map("K", vim.lsp.buf.hover, "Hover Documentation") + map("gs", vim.lsp.buf.signature_help, "Signature Documentation") + map("gD", vim.lsp.buf.declaration, "Goto Declaration") + + map("v", "vsplit | lua vim.lsp.buf.definition()", "Goto Definition in Vertical Split") + + local wk = require("which-key") + wk.add({ + { "la", vim.lsp.buf.code_action, desc = "Code Action" }, + { "lA", vim.lsp.buf.range_code_action, desc = "Range Code Actions" }, + { "ls", vim.lsp.buf.signature_help, desc = "Display Signature Information" }, + { "lr", vim.lsp.buf.rename, desc = "Rename all references" }, + { "lf", vim.lsp.buf.format, desc = "Format" }, + { + "lc", + require("core.utils").copyFilePathAndLineNumber, + desc = "Copy File Path and Line Number", + }, + { "Wa", vim.lsp.buf.add_workspace_folder, desc = "Workspace Add Folder" }, + { "Wr", vim.lsp.buf.remove_workspace_folder, desc = "Workspace Remove Folder" }, + { + "Wl", + function() + print(vim.inspect(vim.lsp.buf.list_workspace_folders())) + end, + desc = "Workspace List Folders", + }, + }) + + local client = vim.lsp.get_client_by_id(event.data.client_id) + if client:supports_method(client, "textDocument/completion", event.bufbuf) then + vim.opt.completeopt = { "menu", "menuone", "noinsert", "fuzzy", "popup" } + vim.lsp.completion.enable(true, client.id, event.buf, { autotrigger = true }) + vim.keymap.set("i", "", function() + vim.lsp.completion.get() + end) + end + end, +}) diff --git a/bootstrap/config_dirs/nvim/lua/user/core/filetypes.lua b/bootstrap/config_dirs/nvim/lua/core/filetypes.lua similarity index 100% rename from bootstrap/config_dirs/nvim/lua/user/core/filetypes.lua rename to bootstrap/config_dirs/nvim/lua/core/filetypes.lua diff --git a/bootstrap/config_dirs/nvim/lua/core/init.lua b/bootstrap/config_dirs/nvim/lua/core/init.lua new file mode 100644 index 0000000..1e8c815 --- /dev/null +++ b/bootstrap/config_dirs/nvim/lua/core/init.lua @@ -0,0 +1,6 @@ +require("core.options") +require("core.keymaps") +require("core.filetypes") +require("core.lazy") +require("core.lsp") +require("core.autocmds") diff --git a/bootstrap/config_dirs/nvim/lua/user/core/keymaps.lua b/bootstrap/config_dirs/nvim/lua/core/keymaps.lua similarity index 100% rename from bootstrap/config_dirs/nvim/lua/user/core/keymaps.lua rename to bootstrap/config_dirs/nvim/lua/core/keymaps.lua diff --git a/bootstrap/config_dirs/nvim/lua/user/lazy.lua b/bootstrap/config_dirs/nvim/lua/core/lazy.lua similarity index 92% rename from bootstrap/config_dirs/nvim/lua/user/lazy.lua rename to bootstrap/config_dirs/nvim/lua/core/lazy.lua index 0f46153..bd2759c 100644 --- a/bootstrap/config_dirs/nvim/lua/user/lazy.lua +++ b/bootstrap/config_dirs/nvim/lua/core/lazy.lua @@ -16,8 +16,8 @@ end vim.opt.rtp:prepend(lazypath) require("lazy").setup({ - { import = "user.plugins" }, - { import = "user.plugins.lsp" }, + { import = "plugins" }, + { import = "plugins.mason" }, }, { install = { colorscheme = { "gruvbox-material" }, diff --git a/bootstrap/config_dirs/nvim/lua/core/lsp.lua b/bootstrap/config_dirs/nvim/lua/core/lsp.lua new file mode 100644 index 0000000..a41137a --- /dev/null +++ b/bootstrap/config_dirs/nvim/lua/core/lsp.lua @@ -0,0 +1,401 @@ +-- Mason PATH is handled by core.mason-path +-- Example for setting up different servers without any plugins: +-- https://github.com/adibhanna/nvim/tree/main/lsp +vim.lsp.enable({ + "bashls", + "emmet_ls", + "gopls", + "graphql", + "kotlin_language_server", + "lua-ls", + "marksman", -- we use tailwindcss + "pyright", + "rubocop", + "sourcekit", + "taplo", + "terraformls", + "texlab", + "yamlls", +}) + +-- LSP servers are automatically managed by Mason +-- Use :MasonVerify to check which tools are Mason-managed + +vim.diagnostic.config({ + -- Use the default configuration + -- virtual_lines = true, + + -- Alternatively, customize specific options + virtual_lines = { + -- Only show virtual line diagnostics for the current cursor line + current_line = true, + }, + -- virtual_text = true, + underline = true, + update_in_insert = false, + severity_sort = true, + float = { + border = "rounded", + source = true, + }, + signs = { + text = { + [vim.diagnostic.severity.ERROR] = "󰅚 ", + [vim.diagnostic.severity.WARN] = "󰀪 ", + [vim.diagnostic.severity.INFO] = "󰋽 ", + [vim.diagnostic.severity.HINT] = "󰌶 ", + }, + numhl = { + [vim.diagnostic.severity.ERROR] = "ErrorMsg", + [vim.diagnostic.severity.WARN] = "WarningMsg", + }, + }, +}) + +-- Extras + +local function restart_lsp(bufnr) + bufnr = bufnr or vim.api.nvim_get_current_buf() + local clients = vim.lsp.get_clients({ bufnr = bufnr }) + + for _, client in ipairs(clients) do + vim.lsp.stop_client(client.id) + end + + vim.defer_fn(function() + vim.cmd("edit") + end, 100) +end + +vim.api.nvim_create_user_command("LspRestart", function() + restart_lsp() +end, {}) + +local function lsp_status() + local bufnr = vim.api.nvim_get_current_buf() + local clients = vim.lsp.get_clients({ bufnr = bufnr }) + + if #clients == 0 then + print("󰅚 No LSP clients attached") + return + end + + print("󰒋 LSP Status for buffer " .. bufnr .. ":") + print("─────────────────────────────────") + + for i, client in ipairs(clients) do + print(string.format("󰌘 Client %d: %s (ID: %d)", i, client.name, client.id)) + print(" Root: " .. (client.config.root_dir or "N/A")) + print(" Filetypes: " .. table.concat(client.config.filetypes or {}, ", ")) + + -- Check capabilities + local caps = client.server_capabilities + local features = {} + if caps.completionProvider then + table.insert(features, "completion") + end + if caps.hoverProvider then + table.insert(features, "hover") + end + if caps.definitionProvider then + table.insert(features, "definition") + end + if caps.referencesProvider then + table.insert(features, "references") + end + if caps.renameProvider then + table.insert(features, "rename") + end + if caps.codeActionProvider then + table.insert(features, "code_action") + end + if caps.documentFormattingProvider then + table.insert(features, "formatting") + end + + print(" Features: " .. table.concat(features, ", ")) + print("") + end +end + +vim.api.nvim_create_user_command("LspStatus", lsp_status, { desc = "Show detailed LSP status" }) + +local function check_lsp_capabilities() + local bufnr = vim.api.nvim_get_current_buf() + local clients = vim.lsp.get_clients({ bufnr = bufnr }) + + if #clients == 0 then + print("No LSP clients attached") + return + end + + for _, client in ipairs(clients) do + print("Capabilities for " .. client.name .. ":") + local caps = client.server_capabilities + + local capability_list = { + { "Completion", caps.completionProvider }, + { "Hover", caps.hoverProvider }, + { "Signature Help", caps.signatureHelpProvider }, + { "Go to Definition", caps.definitionProvider }, + { "Go to Declaration", caps.declarationProvider }, + { "Go to Implementation", caps.implementationProvider }, + { "Go to Type Definition", caps.typeDefinitionProvider }, + { "Find References", caps.referencesProvider }, + { "Document Highlight", caps.documentHighlightProvider }, + { "Document Symbol", caps.documentSymbolProvider }, + { "Workspace Symbol", caps.workspaceSymbolProvider }, + { "Code Action", caps.codeActionProvider }, + { "Code Lens", caps.codeLensProvider }, + { "Document Formatting", caps.documentFormattingProvider }, + { "Document Range Formatting", caps.documentRangeFormattingProvider }, + { "Rename", caps.renameProvider }, + { "Folding Range", caps.foldingRangeProvider }, + { "Selection Range", caps.selectionRangeProvider }, + } + + for _, cap in ipairs(capability_list) do + local status = cap[2] and "✓" or "✗" + print(string.format(" %s %s", status, cap[1])) + end + print("") + end +end + +vim.api.nvim_create_user_command("LspCapabilities", check_lsp_capabilities, { desc = "Show LSP capabilities" }) + +local function lsp_diagnostics_info() + local bufnr = vim.api.nvim_get_current_buf() + local diagnostics = vim.diagnostic.get(bufnr) + + local counts = { ERROR = 0, WARN = 0, INFO = 0, HINT = 0 } + + for _, diagnostic in ipairs(diagnostics) do + local severity = vim.diagnostic.severity[diagnostic.severity] + counts[severity] = counts[severity] + 1 + end + + print("󰒡 Diagnostics for current buffer:") + print(" Errors: " .. counts.ERROR) + print(" Warnings: " .. counts.WARN) + print(" Info: " .. counts.INFO) + print(" Hints: " .. counts.HINT) + print(" Total: " .. #diagnostics) +end + +vim.api.nvim_create_user_command("LspDiagnostics", lsp_diagnostics_info, { desc = "Show LSP diagnostics count" }) + +local function lsp_info() + local bufnr = vim.api.nvim_get_current_buf() + local clients = vim.lsp.get_clients({ bufnr = bufnr }) + + print("═══════════════════════════════════") + print(" LSP INFORMATION ") + print("═══════════════════════════════════") + print("") + + -- Basic info + print("󰈙 Language client log: " .. vim.lsp.get_log_path()) + print("󰈔 Detected filetype: " .. vim.bo.filetype) + print("󰈮 Buffer: " .. bufnr) + print("󰈔 Root directory: " .. (vim.fn.getcwd() or "N/A")) + print("") + + if #clients == 0 then + print("󰅚 No LSP clients attached to buffer " .. bufnr) + print("") + print("Possible reasons:") + print(" • No language server installed for " .. vim.bo.filetype) + print(" • Language server not configured") + print(" • Not in a project root directory") + print(" • File type not recognized") + return + end + + print("󰒋 LSP clients attached to buffer " .. bufnr .. ":") + print("─────────────────────────────────") + + for i, client in ipairs(clients) do + print(string.format("󰌘 Client %d: %s", i, client.name)) + print(" ID: " .. client.id) + print(" Root dir: " .. (client.config.root_dir or "Not set")) + print(" Command: " .. table.concat(client.config.cmd or {}, " ")) + print(" Filetypes: " .. table.concat(client.config.filetypes or {}, ", ")) + + -- Server status + if client.is_stopped() then + print(" Status: 󰅚 Stopped") + else + print(" Status: 󰄬 Running") + end + + -- Workspace folders + if client.workspace_folders and #client.workspace_folders > 0 then + print(" Workspace folders:") + for _, folder in ipairs(client.workspace_folders) do + print(" • " .. folder.name) + end + end + + -- Attached buffers count + local attached_buffers = {} + for buf, _ in pairs(client.attached_buffers or {}) do + table.insert(attached_buffers, buf) + end + print(" Attached buffers: " .. #attached_buffers) + + -- Key capabilities + local caps = client.server_capabilities + local key_features = {} + if caps.completionProvider then + table.insert(key_features, "completion") + end + if caps.hoverProvider then + table.insert(key_features, "hover") + end + if caps.definitionProvider then + table.insert(key_features, "definition") + end + if caps.documentFormattingProvider then + table.insert(key_features, "formatting") + end + if caps.codeActionProvider then + table.insert(key_features, "code_action") + end + + if #key_features > 0 then + print(" Key features: " .. table.concat(key_features, ", ")) + end + + print("") + end + + -- Diagnostics summary + local diagnostics = vim.diagnostic.get(bufnr) + if #diagnostics > 0 then + print("󰒡 Diagnostics Summary:") + local counts = { ERROR = 0, WARN = 0, INFO = 0, HINT = 0 } + + for _, diagnostic in ipairs(diagnostics) do + local severity = vim.diagnostic.severity[diagnostic.severity] + counts[severity] = counts[severity] + 1 + end + + print(" 󰅚 Errors: " .. counts.ERROR) + print(" 󰀪 Warnings: " .. counts.WARN) + print(" 󰋽 Info: " .. counts.INFO) + print(" 󰌶 Hints: " .. counts.HINT) + print(" Total: " .. #diagnostics) + else + print("󰄬 No diagnostics") + end + + print("") + print("Use :LspLog to view detailed logs") + print("Use :LspCapabilities for full capability list") +end + +-- Create command +vim.api.nvim_create_user_command("LspInfo", lsp_info, { desc = "Show comprehensive LSP information" }) + +local function lsp_status_short() + local bufnr = vim.api.nvim_get_current_buf() + local clients = vim.lsp.get_clients({ bufnr = bufnr }) + + if #clients == 0 then + return "" -- Return empty string when no LSP + end + + local names = {} + for _, client in ipairs(clients) do + table.insert(names, client.name) + end + + return "󰒋 " .. table.concat(names, ",") +end + +local function git_branch() + local ok, handle = pcall(io.popen, "git branch --show-current 2>/dev/null") + if not ok or not handle then + return "" + end + local branch = handle:read("*a") + handle:close() + if branch and branch ~= "" then + branch = branch:gsub("\n", "") + return " 󰊢 " .. branch + end + return "" +end + +local function formatter_status() + local ok, conform = pcall(require, "conform") + if not ok then + return "" + end + + local formatters = conform.list_formatters_to_run(0) + if #formatters == 0 then + return "" + end + + local formatter_names = {} + for _, formatter in ipairs(formatters) do + table.insert(formatter_names, formatter.name) + end + + return "󰉿 " .. table.concat(formatter_names, ",") +end + +local function linter_status() + local ok, lint = pcall(require, "lint") + if not ok then + return "" + end + + local linters = lint.linters_by_ft[vim.bo.filetype] or {} + if #linters == 0 then + return "" + end + + return "󰁨 " .. table.concat(linters, ",") +end +-- Safe wrapper functions for statusline +local function safe_git_branch() + local ok, result = pcall(git_branch) + return ok and result or "" +end + +local function safe_lsp_status() + local ok, result = pcall(lsp_status_short) + return ok and result or "" +end + +local function safe_formatter_status() + local ok, result = pcall(formatter_status) + return ok and result or "" +end + +local function safe_linter_status() + local ok, result = pcall(linter_status) + return ok and result or "" +end + +_G.git_branch = safe_git_branch +_G.lsp_status = safe_lsp_status +_G.formatter_status = safe_formatter_status +_G.linter_status = safe_linter_status + +-- THEN set the statusline +vim.opt.statusline = table.concat({ + "%{v:lua.git_branch()}", -- Git branch + "%f", -- File name + "%m", -- Modified flag + "%r", -- Readonly flag + "%=", -- Right align + "%{v:lua.linter_status()}", -- Linter status + "%{v:lua.formatter_status()}", -- Formatter status + "%{v:lua.lsp_status()}", -- LSP status + " %l:%c", -- Line:Column + " %p%%", -- Percentage through file +}, " ") diff --git a/bootstrap/config_dirs/nvim/lua/user/core/options.lua b/bootstrap/config_dirs/nvim/lua/core/options.lua similarity index 87% rename from bootstrap/config_dirs/nvim/lua/user/core/options.lua rename to bootstrap/config_dirs/nvim/lua/core/options.lua index 88e0326..cbb802c 100644 --- a/bootstrap/config_dirs/nvim/lua/user/core/options.lua +++ b/bootstrap/config_dirs/nvim/lua/core/options.lua @@ -14,9 +14,16 @@ opt.tabstop = 4 -- 4 spaces for tabs (prettier default) opt.shiftwidth = 4 -- 4 spaces for indent width opt.expandtab = true -- expand tab to spaces opt.autoindent = true -- copy indent from current line when starting new one +opt.smartindent = true -- make indenting smarter again + +-- Preview substitutions +opt.inccommand = "split" + +opt.undofile = true -- enable persistent undo -- line wrapping opt.wrap = false -- disable line wrapping +opt.breakindent = true -- Every wrapped line will continue visually indented -- opt.textwidth = 80 opt.colorcolumn = "50,72,120" -- show visual columns at 50,72,120 @@ -50,6 +57,11 @@ opt.clipboard:append("unnamedplus") -- use system clipboard as default register opt.splitright = true -- split vertical window to the right opt.splitbelow = true -- split horizontal window to the bottom +-- Set the default border for all floating windows +opt.winborder = "rounded" + +opt.showmode = false -- we don't need to see things like -- INSERT -- anymore + opt.iskeyword:append("-") -- consider string-string as whole word -- turn off swapfile diff --git a/bootstrap/config_dirs/nvim/lua/core/utils.lua b/bootstrap/config_dirs/nvim/lua/core/utils.lua new file mode 100644 index 0000000..1205462 --- /dev/null +++ b/bootstrap/config_dirs/nvim/lua/core/utils.lua @@ -0,0 +1,94 @@ +local M = {} + +M.toggle_go_test = function() + -- Get the current buffer's file name + local current_file = vim.fn.expand("%:p") + if string.match(current_file, "_test.go$") then + -- If the current file ends with '_test.go', try to find the corresponding non-test file + local non_test_file = string.gsub(current_file, "_test.go$", ".go") + if vim.fn.filereadable(non_test_file) == 1 then + -- Open the corresponding non-test file if it exists + vim.cmd.edit(non_test_file) + else + print("No corresponding non-test file found") + end + else + -- If the current file is a non-test file, try to find the corresponding test file + local test_file = string.gsub(current_file, ".go$", "_test.go") + if vim.fn.filereadable(test_file) == 1 then + -- Open the corresponding test file if it exists + vim.cmd.edit(test_file) + else + print("No corresponding test file found") + end + end +end + +-- Get line numbers for highlighted lines in visual mode +M.get_highlighted_line_numbers = function() + local start_line = vim.fn.line("'<") + local end_line = vim.fn.line("'>") + + if start_line == 0 or end_line == 0 then + print("No visual selection found") + return + end + + -- Ensure start_line is always less than or equal to end_line + if start_line > end_line then + start_line, end_line = end_line, start_line + end + + local line_numbers = {} + for i = start_line, end_line do + table.insert(line_numbers, i) + end + + local result + if start_line == end_line then + -- Single line: L80 + result = string.format("L%d", start_line) + else + -- Multiple lines: L80-85 + result = string.format("L%d-%d", start_line, end_line) + end + + print("Line numbers: " .. result) + + -- Copy to clipboard + vim.fn.setreg("+", result) + + return line_numbers +end + +-- Copy the current file path and line number to the clipboard, use GitHub URL if in a Git repository +M.copyFilePathAndLineNumber = function() + local current_file = vim.fn.expand("%:p") + local current_line = vim.fn.line(".") + local is_git_repo = vim.fn.system("git rev-parse --is-inside-work-tree"):match("true") + + if is_git_repo then + local current_repo = vim.fn.systemlist("git remote get-url origin")[1] + local current_branch = vim.fn.systemlist("git rev-parse --abbrev-ref HEAD")[1] + + -- Convert Git URL to GitHub web URL format + current_repo = current_repo:gsub("git@github.com:", "https://github.com/") + current_repo = current_repo:gsub("%.git$", "") + + -- Remove leading system path to repository root + local repo_root = vim.fn.systemlist("git rev-parse --show-toplevel")[1] + if repo_root then + current_file = current_file:sub(#repo_root + 2) + end + + local url = string.format("%s/blob/%s/%s#L%s", current_repo, current_branch, current_file, current_line) + vim.fn.setreg("+", url) + print("Copied to clipboard: " .. url) + else + -- If not in a Git directory, copy the full file path + vim.fn.setreg("+", current_file .. "#L" .. current_line) + print("Copied full path to clipboard: " .. current_file .. "#L" .. current_line) + end +end + +return M diff --git a/bootstrap/config_dirs/nvim/lua/user/plugins/alpha.lua b/bootstrap/config_dirs/nvim/lua/plugins/alpha.lua similarity index 100% rename from bootstrap/config_dirs/nvim/lua/user/plugins/alpha.lua rename to bootstrap/config_dirs/nvim/lua/plugins/alpha.lua diff --git a/bootstrap/config_dirs/nvim/lua/user/plugins/auto-hlsearch.lua b/bootstrap/config_dirs/nvim/lua/plugins/auto-hlsearch.lua similarity index 100% rename from bootstrap/config_dirs/nvim/lua/user/plugins/auto-hlsearch.lua rename to bootstrap/config_dirs/nvim/lua/plugins/auto-hlsearch.lua diff --git a/bootstrap/config_dirs/nvim/lua/user/plugins/autosession.lua b/bootstrap/config_dirs/nvim/lua/plugins/autosession.lua similarity index 100% rename from bootstrap/config_dirs/nvim/lua/user/plugins/autosession.lua rename to bootstrap/config_dirs/nvim/lua/plugins/autosession.lua diff --git a/bootstrap/config_dirs/nvim/lua/user/plugins/bufferline.lua b/bootstrap/config_dirs/nvim/lua/plugins/bufferline.lua similarity index 100% rename from bootstrap/config_dirs/nvim/lua/user/plugins/bufferline.lua rename to bootstrap/config_dirs/nvim/lua/plugins/bufferline.lua diff --git a/bootstrap/config_dirs/nvim/lua/user/plugins/colorscheme.lua b/bootstrap/config_dirs/nvim/lua/plugins/colorscheme.lua similarity index 100% rename from bootstrap/config_dirs/nvim/lua/user/plugins/colorscheme.lua rename to bootstrap/config_dirs/nvim/lua/plugins/colorscheme.lua diff --git a/bootstrap/config_dirs/nvim/lua/user/plugins/comment.lua b/bootstrap/config_dirs/nvim/lua/plugins/comment.lua similarity index 100% rename from bootstrap/config_dirs/nvim/lua/user/plugins/comment.lua rename to bootstrap/config_dirs/nvim/lua/plugins/comment.lua diff --git a/bootstrap/config_dirs/nvim/lua/user/plugins/conform.lua b/bootstrap/config_dirs/nvim/lua/plugins/conform.lua similarity index 100% rename from bootstrap/config_dirs/nvim/lua/user/plugins/conform.lua rename to bootstrap/config_dirs/nvim/lua/plugins/conform.lua diff --git a/bootstrap/config_dirs/nvim/lua/user/plugins/dashboard.lua b/bootstrap/config_dirs/nvim/lua/plugins/dashboard.lua similarity index 100% rename from bootstrap/config_dirs/nvim/lua/user/plugins/dashboard.lua rename to bootstrap/config_dirs/nvim/lua/plugins/dashboard.lua diff --git a/bootstrap/config_dirs/nvim/lua/user/plugins/dressing.lua b/bootstrap/config_dirs/nvim/lua/plugins/dressing.lua similarity index 100% rename from bootstrap/config_dirs/nvim/lua/user/plugins/dressing.lua rename to bootstrap/config_dirs/nvim/lua/plugins/dressing.lua diff --git a/bootstrap/config_dirs/nvim/lua/user/plugins/gitsigns.lua b/bootstrap/config_dirs/nvim/lua/plugins/gitsigns.lua similarity index 100% rename from bootstrap/config_dirs/nvim/lua/user/plugins/gitsigns.lua rename to bootstrap/config_dirs/nvim/lua/plugins/gitsigns.lua diff --git a/bootstrap/config_dirs/nvim/lua/user/plugins/indent-blankline.lua b/bootstrap/config_dirs/nvim/lua/plugins/indent-blankline.lua similarity index 100% rename from bootstrap/config_dirs/nvim/lua/user/plugins/indent-blankline.lua rename to bootstrap/config_dirs/nvim/lua/plugins/indent-blankline.lua diff --git a/bootstrap/config_dirs/nvim/lua/user/plugins/init.lua b/bootstrap/config_dirs/nvim/lua/plugins/init.lua similarity index 100% rename from bootstrap/config_dirs/nvim/lua/user/plugins/init.lua rename to bootstrap/config_dirs/nvim/lua/plugins/init.lua diff --git a/bootstrap/config_dirs/nvim/lua/user/plugins/lazygit.lua b/bootstrap/config_dirs/nvim/lua/plugins/lazygit.lua similarity index 100% rename from bootstrap/config_dirs/nvim/lua/user/plugins/lazygit.lua rename to bootstrap/config_dirs/nvim/lua/plugins/lazygit.lua diff --git a/bootstrap/config_dirs/nvim/lua/user/plugins/leap.lua b/bootstrap/config_dirs/nvim/lua/plugins/leap.lua similarity index 100% rename from bootstrap/config_dirs/nvim/lua/user/plugins/leap.lua rename to bootstrap/config_dirs/nvim/lua/plugins/leap.lua diff --git a/bootstrap/config_dirs/nvim/lua/user/plugins/lspsaga.lua b/bootstrap/config_dirs/nvim/lua/plugins/lspsaga.lua similarity index 100% rename from bootstrap/config_dirs/nvim/lua/user/plugins/lspsaga.lua rename to bootstrap/config_dirs/nvim/lua/plugins/lspsaga.lua diff --git a/bootstrap/config_dirs/nvim/lua/user/plugins/lualine.lua b/bootstrap/config_dirs/nvim/lua/plugins/lualine.lua similarity index 100% rename from bootstrap/config_dirs/nvim/lua/user/plugins/lualine.lua rename to bootstrap/config_dirs/nvim/lua/plugins/lualine.lua diff --git a/bootstrap/config_dirs/nvim/lua/user/plugins/lsp/mason.lua b/bootstrap/config_dirs/nvim/lua/plugins/mason/mason.lua similarity index 71% rename from bootstrap/config_dirs/nvim/lua/user/plugins/lsp/mason.lua rename to bootstrap/config_dirs/nvim/lua/plugins/mason/mason.lua index 8559356..8223704 100644 --- a/bootstrap/config_dirs/nvim/lua/user/plugins/lsp/mason.lua +++ b/bootstrap/config_dirs/nvim/lua/plugins/mason/mason.lua @@ -4,7 +4,6 @@ return { "williamboman/mason.nvim", dependencies = { - "williamboman/mason-lspconfig.nvim", "WhoIsSethDaniel/mason-tool-installer.nvim", "neovim/nvim-lspconfig", }, @@ -12,8 +11,7 @@ return { -- import mason local mason = require("mason") - -- import mason-lspconfig - local mason_lspconfig = require("mason-lspconfig") + -- import mason_tool_installer local mason_tool_installer = require("mason-tool-installer") -- enable mason and configure icons @@ -27,30 +25,6 @@ return { }, }) - mason_lspconfig.setup({ - -- list of servers for mason to install - ensure_installed = { - "bashls", - "cssls", - "dockerls", - "emmet_ls", - "graphql", - "html", - "kotlin_language_server", - "lua_ls", - "marksman", -- we use tailwindcss - "pyright", - "rubocop", - -- "tailwindcss", - "taplo", - "terraformls", - "texlab", - "yamlls", - }, - -- auto-install configured servers (with lspconfig) - automatic_installation = true, -- not the same as ensure_installed - }) - mason_tool_installer.setup({ ensure_installed = { "actionlint", -- linter for GH actions diff --git a/bootstrap/config_dirs/nvim/lua/user/plugins/neogit.lua b/bootstrap/config_dirs/nvim/lua/plugins/neogit.lua similarity index 100% rename from bootstrap/config_dirs/nvim/lua/user/plugins/neogit.lua rename to bootstrap/config_dirs/nvim/lua/plugins/neogit.lua diff --git a/bootstrap/config_dirs/nvim/lua/user/plugins/nerdy.lua b/bootstrap/config_dirs/nvim/lua/plugins/nerdy.lua similarity index 100% rename from bootstrap/config_dirs/nvim/lua/user/plugins/nerdy.lua rename to bootstrap/config_dirs/nvim/lua/plugins/nerdy.lua diff --git a/bootstrap/config_dirs/nvim/lua/user/plugins/noice.lua b/bootstrap/config_dirs/nvim/lua/plugins/noice.lua similarity index 100% rename from bootstrap/config_dirs/nvim/lua/user/plugins/noice.lua rename to bootstrap/config_dirs/nvim/lua/plugins/noice.lua diff --git a/bootstrap/config_dirs/nvim/lua/user/plugins/nvim-autopairs.lua b/bootstrap/config_dirs/nvim/lua/plugins/nvim-autopairs.lua similarity index 78% rename from bootstrap/config_dirs/nvim/lua/user/plugins/nvim-autopairs.lua rename to bootstrap/config_dirs/nvim/lua/plugins/nvim-autopairs.lua index 8055083..a170075 100644 --- a/bootstrap/config_dirs/nvim/lua/user/plugins/nvim-autopairs.lua +++ b/bootstrap/config_dirs/nvim/lua/plugins/nvim-autopairs.lua @@ -1,5 +1,7 @@ +-- A super powerful autopair plugin for Neovim that supports multiple characters. return { "windwp/nvim-autopairs", + enabled = false, -- dissbled due to native integration of LPS in nvim 0.11+ (https://gpanders.com/blog/whats-new-in-neovim-0-11/#builtin-auto-completion) event = { "InsertEnter" }, dependencies = { "hrsh7th/nvim-cmp", diff --git a/bootstrap/config_dirs/nvim/lua/user/plugins/nvim-cmp.lua b/bootstrap/config_dirs/nvim/lua/plugins/nvim-cmp.lua similarity index 91% rename from bootstrap/config_dirs/nvim/lua/user/plugins/nvim-cmp.lua rename to bootstrap/config_dirs/nvim/lua/plugins/nvim-cmp.lua index 4640592..401e704 100644 --- a/bootstrap/config_dirs/nvim/lua/user/plugins/nvim-cmp.lua +++ b/bootstrap/config_dirs/nvim/lua/plugins/nvim-cmp.lua @@ -1,5 +1,7 @@ +-- A completion plugin for neovim coded in Lua. return { "hrsh7th/nvim-cmp", + enabled = false, -- dissbled due to native integration of LPS in nvim 0.11+ (https://gpanders.com/blog/whats-new-in-neovim-0-11/#builtin-auto-completion) event = "InsertEnter", dependencies = { "hrsh7th/cmp-buffer", -- source for text in buffer diff --git a/bootstrap/config_dirs/nvim/lua/user/plugins/nvim-lint.lua b/bootstrap/config_dirs/nvim/lua/plugins/nvim-lint.lua similarity index 100% rename from bootstrap/config_dirs/nvim/lua/user/plugins/nvim-lint.lua rename to bootstrap/config_dirs/nvim/lua/plugins/nvim-lint.lua diff --git a/bootstrap/config_dirs/nvim/lua/user/plugins/nvim-notify.lua b/bootstrap/config_dirs/nvim/lua/plugins/nvim-notify.lua similarity index 100% rename from bootstrap/config_dirs/nvim/lua/user/plugins/nvim-notify.lua rename to bootstrap/config_dirs/nvim/lua/plugins/nvim-notify.lua diff --git a/bootstrap/config_dirs/nvim/lua/user/plugins/nvim-surround.lua b/bootstrap/config_dirs/nvim/lua/plugins/nvim-surround.lua similarity index 100% rename from bootstrap/config_dirs/nvim/lua/user/plugins/nvim-surround.lua rename to bootstrap/config_dirs/nvim/lua/plugins/nvim-surround.lua diff --git a/bootstrap/config_dirs/nvim/lua/user/plugins/nvim-tree.lua b/bootstrap/config_dirs/nvim/lua/plugins/nvim-tree.lua similarity index 100% rename from bootstrap/config_dirs/nvim/lua/user/plugins/nvim-tree.lua rename to bootstrap/config_dirs/nvim/lua/plugins/nvim-tree.lua diff --git a/bootstrap/config_dirs/nvim/lua/user/plugins/nvim-treesitter-text-objects.lua b/bootstrap/config_dirs/nvim/lua/plugins/nvim-treesitter-text-objects.lua similarity index 100% rename from bootstrap/config_dirs/nvim/lua/user/plugins/nvim-treesitter-text-objects.lua rename to bootstrap/config_dirs/nvim/lua/plugins/nvim-treesitter-text-objects.lua diff --git a/bootstrap/config_dirs/nvim/lua/user/plugins/nvim-treesitter.lua b/bootstrap/config_dirs/nvim/lua/plugins/nvim-treesitter.lua similarity index 100% rename from bootstrap/config_dirs/nvim/lua/user/plugins/nvim-treesitter.lua rename to bootstrap/config_dirs/nvim/lua/plugins/nvim-treesitter.lua diff --git a/bootstrap/config_dirs/nvim/lua/user/plugins/nvim-web-devicons.lua b/bootstrap/config_dirs/nvim/lua/plugins/nvim-web-devicons.lua similarity index 100% rename from bootstrap/config_dirs/nvim/lua/user/plugins/nvim-web-devicons.lua rename to bootstrap/config_dirs/nvim/lua/plugins/nvim-web-devicons.lua diff --git a/bootstrap/config_dirs/nvim/lua/user/plugins/outline.lua b/bootstrap/config_dirs/nvim/lua/plugins/outline.lua similarity index 100% rename from bootstrap/config_dirs/nvim/lua/user/plugins/outline.lua rename to bootstrap/config_dirs/nvim/lua/plugins/outline.lua diff --git a/bootstrap/config_dirs/nvim/lua/user/plugins/scratch.lua b/bootstrap/config_dirs/nvim/lua/plugins/scratch.lua similarity index 100% rename from bootstrap/config_dirs/nvim/lua/user/plugins/scratch.lua rename to bootstrap/config_dirs/nvim/lua/plugins/scratch.lua diff --git a/bootstrap/config_dirs/nvim/lua/user/plugins/substitute.lua b/bootstrap/config_dirs/nvim/lua/plugins/substitute.lua similarity index 100% rename from bootstrap/config_dirs/nvim/lua/user/plugins/substitute.lua rename to bootstrap/config_dirs/nvim/lua/plugins/substitute.lua diff --git a/bootstrap/config_dirs/nvim/lua/user/plugins/telescope.lua b/bootstrap/config_dirs/nvim/lua/plugins/telescope.lua similarity index 100% rename from bootstrap/config_dirs/nvim/lua/user/plugins/telescope.lua rename to bootstrap/config_dirs/nvim/lua/plugins/telescope.lua diff --git a/bootstrap/config_dirs/nvim/lua/user/plugins/todo-comments.lua b/bootstrap/config_dirs/nvim/lua/plugins/todo-comments.lua similarity index 100% rename from bootstrap/config_dirs/nvim/lua/user/plugins/todo-comments.lua rename to bootstrap/config_dirs/nvim/lua/plugins/todo-comments.lua diff --git a/bootstrap/config_dirs/nvim/lua/user/plugins/trouble.lua b/bootstrap/config_dirs/nvim/lua/plugins/trouble.lua similarity index 100% rename from bootstrap/config_dirs/nvim/lua/user/plugins/trouble.lua rename to bootstrap/config_dirs/nvim/lua/plugins/trouble.lua diff --git a/bootstrap/config_dirs/nvim/lua/user/plugins/twilight.lua b/bootstrap/config_dirs/nvim/lua/plugins/twilight.lua similarity index 100% rename from bootstrap/config_dirs/nvim/lua/user/plugins/twilight.lua rename to bootstrap/config_dirs/nvim/lua/plugins/twilight.lua diff --git a/bootstrap/config_dirs/nvim/lua/user/plugins/vim-fugitive.lua b/bootstrap/config_dirs/nvim/lua/plugins/vim-fugitive.lua similarity index 100% rename from bootstrap/config_dirs/nvim/lua/user/plugins/vim-fugitive.lua rename to bootstrap/config_dirs/nvim/lua/plugins/vim-fugitive.lua diff --git a/bootstrap/config_dirs/nvim/lua/user/plugins/vim-maximizer.lua b/bootstrap/config_dirs/nvim/lua/plugins/vim-maximizer.lua similarity index 100% rename from bootstrap/config_dirs/nvim/lua/user/plugins/vim-maximizer.lua rename to bootstrap/config_dirs/nvim/lua/plugins/vim-maximizer.lua diff --git a/bootstrap/config_dirs/nvim/lua/user/plugins/vim-tmux-navigator.lua b/bootstrap/config_dirs/nvim/lua/plugins/vim-tmux-navigator.lua similarity index 100% rename from bootstrap/config_dirs/nvim/lua/user/plugins/vim-tmux-navigator.lua rename to bootstrap/config_dirs/nvim/lua/plugins/vim-tmux-navigator.lua diff --git a/bootstrap/config_dirs/nvim/lua/user/plugins/which-key.lua b/bootstrap/config_dirs/nvim/lua/plugins/which-key.lua similarity index 100% rename from bootstrap/config_dirs/nvim/lua/user/plugins/which-key.lua rename to bootstrap/config_dirs/nvim/lua/plugins/which-key.lua diff --git a/bootstrap/config_dirs/nvim/lua/user/core/init.lua b/bootstrap/config_dirs/nvim/lua/user/core/init.lua deleted file mode 100644 index cfcc5a0..0000000 --- a/bootstrap/config_dirs/nvim/lua/user/core/init.lua +++ /dev/null @@ -1,3 +0,0 @@ -require("user.core.options") -require("user.core.keymaps") -require("user.core.filetypes") diff --git a/bootstrap/config_dirs/nvim/lua/user/plugins/lsp/lspconfig.lua b/bootstrap/config_dirs/nvim/lua/user/plugins/lsp/lspconfig.lua deleted file mode 100644 index 8dd9538..0000000 --- a/bootstrap/config_dirs/nvim/lua/user/plugins/lsp/lspconfig.lua +++ /dev/null @@ -1,186 +0,0 @@ -return { - "neovim/nvim-lspconfig", - event = { "BufReadPre", "BufNewFile" }, - dependencies = { - "hrsh7th/cmp-nvim-lsp", - { "antosha417/nvim-lsp-file-operations", config = true }, - { "folke/neodev.nvim", opts = {} }, - }, - config = function() - -- import lspconfig plugin - local lspconfig = require("lspconfig") - - -- import mason_lspconfig plugin - local mason_lspconfig = require("mason-lspconfig") - - -- import cmp-nvim-lsp plugin - local cmp_nvim_lsp = require("cmp_nvim_lsp") - - local keymap = vim.keymap -- for conciseness - - local opts = { noremap = true, silent = true } - - vim.api.nvim_create_autocmd("LspAttach", { - group = vim.api.nvim_create_augroup("UserLspConfig", {}), - callback = function(ev) - -- Buffer local mappings. - -- See `:help vim.lsp.*` for documentation on any of the below functions - opts.buffer = ev.buf - - -- 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 next diagnostic" - keymap.set("n", "]d", vim.diagnostic.goto_next, opts) -- jump to next diagnostic in buffer - - 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 - - opts.desc = "Restart LSP" - keymap.set("n", "rs", ":LspRestart", opts) -- mapping to restart lsp if necessary - 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) - -- (not in youtube nvim video) - 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 - - mason_lspconfig.setup_handlers({ - -- default handler for installed servers - function(server_name) - lspconfig[server_name].setup({ - capabilities = capabilities, - }) - end, - - -- configure Bash server - ["bashls"] = function() - lspconfig["bashls"].setup({ - capabilities = capabilities, - filetypes = { - "sh", - "zsh", - "dotenv", - }, - }) - end, - - -- configure Emmet server - ["emmet_ls"] = function() - lspconfig["emmet_ls"].setup({ - capabilities = capabilities, - filetypes = { - "html", - "typescriptreact", - "javascriptreact", - "css", - "sass", - "scss", - "less", - "svelte", - }, - }) - end, - - -- configure GraphQL server - ["graphql"] = function() - lspconfig["graphql"].setup({ - capabilities = capabilities, - filetypes = { "graphql", "gql", "svelte", "typescriptreact", "javascriptreact" }, - }) - end, - - -- configure Lua server - ["lua_ls"] = function() - -- configure lua server (with special settings) - lspconfig["lua_ls"].setup({ - capabilities = capabilities, - settings = { - 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, - }, - }, - completion = { - callSnippet = "Replace", - }, - }, - }, - }) - end, - - -- -- configure Swift server - -- ["sourcekit"] = function() - -- lspconfig["sourcekit"].setup({ - -- capabilities = capabilities, - -- -- filetypes = { "swift" }, - -- }) - -- end, - }) - - -- SourceKit-LSP increasingly relies on the editor informing the server when certain files change. - -- This need is communicated through dynamic registration. You don’t have to understand what that - -- means, but Neovim doesn’t implement dynamic registration. You’ll notice this when you update - -- your package manifest, or add new files to your compile_commands.json file and LSP doesn’t - -- work without restarting Neovim. - -- - -- Instead, we know that SourceKit-LSP needs this functionality, so we’ll enable it statically. - -- We’ll update our sourcekit setup configuration to manually set the didChangeWatchedFiles - -- capability. - -- - - -- configure Swift serve here since it is not installed via Mason - lspconfig.sourcekit.setup({ - -- capabilities = capabilities, - capabilities = { - workspace = { - didChangeWatchedFiles = { - dynamicRegistration = true, - }, - }, - }, - }) - end, -}