diff options
| author | 2026-04-17 10:53:11 +0100 | |
|---|---|---|
| committer | 2026-04-17 10:53:11 +0100 | |
| commit | fcab70e06325f123030a9442aef001707a603950 (patch) | |
| tree | 2bd9c2bd5c731767653f3e2f06adeaa54119eeb5 /home/.config/nvim/lua/plugins | |
| parent | bf282a6e1c16a2976a8478f1f6ef916bcf75e52c (diff) | |
| download | dotfiles-fcab70e06325f123030a9442aef001707a603950.tar.gz dotfiles-fcab70e06325f123030a9442aef001707a603950.tar.bz2 dotfiles-fcab70e06325f123030a9442aef001707a603950.zip | |
refactor: flatten custom/plugins/ to plugins/
Rename lua/custom/plugins/ to lua/plugins/ following the standard lazy.nvim
convention. The extra custom/ nesting added no value. Update import path in
init.lua accordingly.
Diffstat (limited to 'home/.config/nvim/lua/plugins')
| -rw-r--r-- | home/.config/nvim/lua/plugins/completion.lua | 152 | ||||
| -rw-r--r-- | home/.config/nvim/lua/plugins/debug.lua | 101 | ||||
| -rw-r--r-- | home/.config/nvim/lua/plugins/git.lua | 159 | ||||
| -rw-r--r-- | home/.config/nvim/lua/plugins/init.lua | 521 | ||||
| -rw-r--r-- | home/.config/nvim/lua/plugins/lsp.lua | 207 | ||||
| -rw-r--r-- | home/.config/nvim/lua/plugins/search.lua | 183 | ||||
| -rw-r--r-- | home/.config/nvim/lua/plugins/ts.lua | 153 | ||||
| -rw-r--r-- | home/.config/nvim/lua/plugins/ui.lua | 83 |
8 files changed, 1559 insertions, 0 deletions
diff --git a/home/.config/nvim/lua/plugins/completion.lua b/home/.config/nvim/lua/plugins/completion.lua new file mode 100644 index 0000000..ca46170 --- /dev/null +++ b/home/.config/nvim/lua/plugins/completion.lua @@ -0,0 +1,152 @@ +return { + { + "zbirenbaum/copilot.lua", + cmd = "Copilot", + build = ":Copilot auth", + event = "InsertEnter", + dependencies = { + { + "copilotlsp-nvim/copilot-lsp", + init = function() + vim.g.copilot_nes_debounce = 500 + end, + }, + }, + keys = { + { + "<leader>tc", + function() + require("copilot.command").toggle() + end, + desc = "[T]oggle [C]opilot attachment", + }, + }, + opts = { + suggestion = { enabled = false }, + panel = { enabled = false }, + server_opts_overrides = { + settings = { + telemetry = { + telemetryLevel = "off", + }, + }, + }, + nes = { + enabled = true, + keymap = { + accept_and_goto = "<leader>p", + accept = false, + dismiss = "<Esc>", + }, + }, + }, + }, + { + "saghen/blink.compat", + opts = {}, + }, + { + "saghen/blink.cmp", + dependencies = { + "rafamadriz/friendly-snippets", + "fang2hou/blink-copilot", + "rcarriga/cmp-dap", + "xzbdmw/colorful-menu.nvim", + }, + opts = { + keymap = { + preset = "cmdline", + ["<CR>"] = { "accept", "fallback" }, + }, + appearance = { + use_nvim_cmp_as_default = true, + }, + completion = { + menu = { + draw = { + -- treesitter = { "lsp" }, + -- We don't need label_description now because label and label_description are already + -- combined together in label by colorful-menu.nvim. + columns = { { "kind_icon" }, { "label", gap = 1 } }, + components = { + label = { + text = function(ctx) + return require("colorful-menu").blink_components_text(ctx) + end, + highlight = function(ctx) + return require("colorful-menu").blink_components_highlight( + ctx + ) + end, + }, + }, + }, + }, + list = { + selection = { + preselect = function() + return not require("blink.cmp").snippet_active({ direction = 1 }) + end, + }, + }, + documentation = { auto_show = true }, + }, + signature = { + enabled = true, + trigger = { + enabled = true, + show_on_keyword = true, + show_on_insert = true, + }, + }, + sources = { + default = { "lazydev", "lsp", "copilot", "snippets", "path", "buffer" }, + per_filetype = { + ["dap-repl"] = { "dap" }, + codecompanion = { "codecompanion" }, + }, + providers = { + path = { + opts = { + get_cwd = vim.fn.getcwd, + }, + }, + copilot = { + name = "copilot", + module = "blink-copilot", + score_offset = 100, + async = true, + }, + lazydev = { + name = "LazyDev", + module = "lazydev.integrations.blink", + -- make lazydev completions top priority (see `:h blink.cmp`) + score_offset = 100, + }, + dap = { name = "dap", module = "blink.compat.source" }, + }, + }, + }, + }, + { + "saghen/blink.pairs", + version = "*", + dependencies = "saghen/blink.download", + opts = { + mappings = { + disabled_filetypes = {}, + }, + highlights = { + groups = { + "BlinkIndentOrange", + "BlinkIndentViolet", + "BlinkIndentBlue", + "BlinkIndentRed", + "BlinkIndentCyan", + "BlinkIndentYellow", + "BlinkIndentGreen", + }, + }, + }, + }, +} diff --git a/home/.config/nvim/lua/plugins/debug.lua b/home/.config/nvim/lua/plugins/debug.lua new file mode 100644 index 0000000..b47dd63 --- /dev/null +++ b/home/.config/nvim/lua/plugins/debug.lua @@ -0,0 +1,101 @@ +return { + { + "miroshQa/debugmaster.nvim", + branch = "dashboard", + dependencies = "mfussenegger/nvim-dap", + keys = { + { + "<leader>td", + function() + require("debugmaster").mode.toggle() + end, + desc = "[T]oggle [D]ebug mode", + }, + }, + }, + { + "mfussenegger/nvim-dap", + config = function() + local dap = require("dap") + + local function get_env_vars() + local variables = vim.fn.environ() + table.insert(variables, { ASAN_OPTIONS = "detect_leaks=0" }) + return variables + end + + dap.adapters.lldb = { + type = "executable", + command = "lldb-dap", + name = "lldb", + env = get_env_vars, + } + dap.adapters.gdb = { + type = "executable", + command = "gdb", + args = { "--interpreter=dap" }, + env = get_env_vars, + } + dap.adapters.codelldb = { + type = "executable", + command = "codelldb", + env = get_env_vars, + } + + local function get_program() + local _program + vim.ui.input({ + prompt = "Program: ", + complete = "file_in_path", + }, function(res) + _program = res + end) + return vim.fn.system("which " .. _program):gsub("\n$", "") + end + + local function get_args() + local _args + vim.ui.input({ + prompt = "Args: ", + default = vim.fn.getreg("+"), + complete = "file", + }, function(res) + _args = res + end) + return require("dap.utils").splitstr(_args) + end + + dap.configurations.cpp = { + { + name = "codelldb Launch", + type = "codelldb", + request = "launch", + cwd = "${workspaceFolder}", + program = get_program, + args = get_args, + stopOnEntry = true, + console = "integratedTerminal", + }, + } + + dap.configurations.c = dap.configurations.cpp + dap.configurations.rust = dap.configurations.cpp + end, + dependencies = { + { + "theHamsta/nvim-dap-virtual-text", + opts = {}, + dependencies = { "nvim-treesitter/nvim-treesitter" }, + }, + "williamboman/mason.nvim", + { + "jay-babu/mason-nvim-dap.nvim", + opts = { + automatic_installation = false, + handlers = {}, + ensure_installed = {}, + }, + }, + }, + }, +} diff --git a/home/.config/nvim/lua/plugins/git.lua b/home/.config/nvim/lua/plugins/git.lua new file mode 100644 index 0000000..9e920e2 --- /dev/null +++ b/home/.config/nvim/lua/plugins/git.lua @@ -0,0 +1,159 @@ +return { + { + "akinsho/git-conflict.nvim", + event = "BufRead", + opts = { + disable_diagnostics = true, + default_mappings = { + next = "]x", + prev = "[x", + }, + }, + }, + { + "NeogitOrg/neogit", + dependencies = { + "nvim-lua/plenary.nvim", + }, + keys = { + { + "<leader>go", + function() + require("neogit").open() + end, + desc = "neo[G]it [O]pen", + }, + }, + cmd = "Neogit", + opts = { + disable_commit_confirmation = true, + kind = "split", + console_timeout = 5000, + auto_show_console = false, + }, + }, + { + "ruifm/gitlinker.nvim", + keys = { + { + "<leader>gy", + function() + require("gitlinker").get_buf_range_url("n") + end, + }, + { + "<leader>gy", + function() + require("gitlinker").get_buf_range_url("v") + end, + mode = "v", + }, + }, + dependencies = { + "nvim-lua/plenary.nvim", + }, + opts = { + callbacks = { + ["git.sommerfeld.dev"] = function(url_data) + local url = require("gitlinker.hosts").get_base_https_url(url_data) + url = url .. "/tree/" .. url_data.file .. "?id=" .. url_data.rev + if url_data.lstart then + url = url .. "#n" .. url_data.lstart + end + return url + end, + }, + }, + }, + { + "lewis6991/gitsigns.nvim", + event = "BufRead", + opts = { + signs = { + change = { show_count = true }, + delete = { show_count = true }, + topdelete = { show_count = true }, + changedelete = { show_count = true }, + }, + numhl = true, + on_attach = function(bufnr) + local gs = require("gitsigns") + local function map(mode, l, r, desc) + vim.keymap.set(mode, l, r, { buffer = bufnr, desc = desc }) + end + local function nmap(l, r, desc) + map("n", l, r, desc) + end + local function vmap(l, r, desc) + map("v", l, r, desc) + end + -- Navigation + nmap("]c", function() + if vim.wo.diff then + vim.cmd.normal({ "]c", bang = true }) + else + gs.nav_hunk("next") + end + end, "Jump to next git [c]hange") + + nmap("[c", function() + if vim.wo.diff then + vim.cmd.normal({ "[c", bang = true }) + else + gs.nav_hunk("prev") + end + end, "Jump to previous git [c]hange") + + -- Actions + nmap("<leader>hs", gs.stage_hunk, "git [s]tage hunk") + nmap("<leader>hr", gs.reset_hunk, "git [r]eset hunk") + vmap("<leader>hs", function() + gs.stage_hunk({ vim.fn.line("."), vim.fn.line("v") }) + end, "git [s]tage hunk") + vmap("<leader>hr", function() + gs.reset_hunk({ vim.fn.line("."), vim.fn.line("v") }) + end, "git [r]eset hunk") + nmap("<leader>hS", gs.stage_buffer, "git [S]tage buffer") + nmap("<leader>hR", gs.reset_buffer, "git [R]eset buffer") + nmap("<leader>hp", gs.preview_hunk, "git [p]review hunk") + nmap("<leader>hb", function() + gs.blame_line({ full = true }) + end, "git [b]lame line") + nmap( + "<leader>tb", + gs.toggle_current_line_blame, + "[T]oggle git show [b]lame line" + ) + nmap("<leader>hd", gs.diffthis, "git [d]iff against index") + nmap("<leader>hD", function() + gs.diffthis("~") + end, "git [D]iff against last commit") + nmap("<leader>hc", gs.change_base, "git [C]hange base to index") + nmap("<leader>hC", function() + gs.change_base("~") + end, "git [C]hange base to HEAD") + nmap( + "<leader>tgd", + gs.preview_hunk_inline, + "[T]oggle [G]it show [D]eleted" + ) + nmap("<leader>tgw", gs.toggle_word_diff, "[T]oggle [G]it [W]ord diff") + nmap( + "<leader>tgl", + gs.toggle_linehl, + "[T]oggle [G]it [L]ine highlighting" + ) + -- Text object + map( + { "o", "x" }, + "ih", + ":<C-U>Gitsigns select_hunk<CR>", + "git [H]unk text object" + ) + end, + }, + dependencies = { + "nvim-lua/plenary.nvim", + }, + }, +} diff --git a/home/.config/nvim/lua/plugins/init.lua b/home/.config/nvim/lua/plugins/init.lua new file mode 100644 index 0000000..2822338 --- /dev/null +++ b/home/.config/nvim/lua/plugins/init.lua @@ -0,0 +1,521 @@ +return { + { "nvim-lua/plenary.nvim", branch = "master", lazy = true }, + { + "nmac427/guess-indent.nvim", + event = "BufRead", + opts = {}, + }, + { + "kylechui/nvim-surround", + event = "VeryLazy", + opts = {}, + }, + { + "chrisgrieser/nvim-various-textobjs", + event = "VeryLazy", + opts = { + keymaps = { + useDefaults = true, + }, + }, + }, + { + "monaqa/dial.nvim", + keys = { + { + "]i", + function() + require("dial.map").inc_normal() + end, + expr = true, + desc = "Increment", + }, + { + "[i", + function() + require("dial.map").dec_normal() + end, + expr = true, + desc = "Decrement", + }, + { + "]i", + function() + require("dial.map").inc_visual() + end, + expr = true, + mode = "v", + desc = "Increment", + }, + { + "[i", + function() + require("dial.map").dec_visual() + end, + expr = true, + mode = "v", + desc = "Decrement", + }, + }, + }, + { + "iamcco/markdown-preview.nvim", + cmd = { "MarkdownPreviewToggle", "MarkdownPreview", "MarkdownPreviewStop" }, + build = "cd app && yarn install", + ft = "markdown", + }, + { + "rmagatti/auto-session", + lazy = false, + opts = function() + -- Convert the cwd to a simple file name + local function get_cwd_as_name() + local dir = vim.fn.getcwd(0) + return dir:gsub("[^A-Za-z0-9]", "_") + end + local overseer = require("overseer") + return { + use_git_branch = true, + pre_save_cmds = { + function() + overseer.save_task_bundle( + get_cwd_as_name(), + -- Passing nil will use config.opts.save_task_opts. You can call list_tasks() explicitly and + -- pass in the results if you want to save specific tasks. + nil, + { on_conflict = "overwrite" } -- Overwrite existing bundle, if any + ) + end, + }, + -- Optionally get rid of all previous tasks when restoring a session + pre_restore_cmds = { + function() + for _, task in ipairs(overseer.list_tasks({})) do + task:dispose(true) + end + end, + }, + post_restore_cmds = { + function() + overseer.load_task_bundle( + get_cwd_as_name(), + { ignore_missing = true, autostart = false } + ) + end, + }, + save_extra_data = function(_) + local ok, breakpoints = pcall(require, "dap.breakpoints") + if not ok or not breakpoints then + return + end + + local bps = {} + local breakpoints_by_buf = breakpoints.get() + for buf, buf_bps in pairs(breakpoints_by_buf) do + bps[vim.api.nvim_buf_get_name(buf)] = buf_bps + end + if vim.tbl_isempty(bps) then + return + end + local extra_data = { + breakpoints = bps, + } + return vim.fn.json_encode(extra_data) + end, + + restore_extra_data = function(_, extra_data) + local json = vim.fn.json_decode(extra_data) + + if json.breakpoints then + local ok, breakpoints = pcall(require, "dap.breakpoints") + + if not ok or not breakpoints then + return + end + vim.notify("restoring breakpoints") + for buf_name, buf_bps in pairs(json.breakpoints) do + for _, bp in pairs(buf_bps) do + local line = bp.line + local opts = { + condition = bp.condition, + log_message = bp.logMessage, + hit_condition = bp.hitCondition, + } + breakpoints.set(opts, vim.fn.bufnr(buf_name), line) + end + end + end + end, + suppressed_dirs = { "~/", "/" }, + } + end, + }, + { + "aserowy/tmux.nvim", + event = "VeryLazy", + opts = { + resize = { + enable_default_keybindings = false, + }, + }, + }, + { + "stevearc/overseer.nvim", + version = "v1.6.0", + keys = { + { + "<leader>to", + function() + require("overseer").toggle() + end, + desc = "[T]oggle [O]verseer", + }, + { + "<leader>ob", + function() + require("overseer").run_template({ + name = "just build", + prompt = "never", + }) + end, + desc = "[O]verseer [B]uild", + }, + { + "<leader>oB", + function() + require("overseer").run_template({ + name = "just build", + }) + end, + desc = "[O]verseer [B]uild", + }, + { + "<leader>ot", + function() + require("overseer").run_template({ + name = "just test", + prompt = "never", + }) + end, + desc = "[O]verseer [J]ust [T]est", + }, + { + "<leader>oT", + function() + require("overseer").run_template({ + name = "just test", + }) + end, + desc = "[O]verseer [J]ust [T]est", + }, + { + "<leader>of", + function() + require("overseer").run_template({ + name = "just test", + prompt = "never", + params = { target = vim.fn.expand("%") }, + }) + end, + desc = "[O]verseer test [F]ile", + }, + { + "<leader>oF", + function() + require("overseer").run_template({ + name = "just test", + params = { target = vim.fn.expand("%") }, + }) + end, + desc = "[O]verseer test [F]ile", + }, + { + "<leader>od", + function() + require("overseer").run_template({ + name = "just debug=true test", + prompt = "never", + params = { target = vim.fn.expand("%") }, + }) + end, + desc = "[O]verseer [d]ebug test file", + }, + { + "<leader>oD", + function() + require("overseer").run_template({ + name = "just debug=true test", + params = { target = vim.fn.expand("%") }, + }) + end, + desc = "[O]verseer [D]ebug test file", + }, + { + "<leader>oa", + function() + require("overseer").run_template({ + name = "just test_autofix", + prompt = "never", + params = { target = vim.fn.expand("%") }, + }) + end, + desc = "[O]verseer [A]utofix", + }, + { + "<leader>or", + function() + require("overseer").run_template() + end, + desc = "[O]verseer [R]un", + }, + { + "<leader>os", + function() + require("overseer").run_template({ name = "shell" }) + end, + desc = "[O]verseer [S]hell", + }, + { + "<leader>ol", + function() + local tasks = require("overseer").list_tasks({ recent_first = true }) + if vim.tbl_isempty(tasks) then + vim.notify("No tasks found", vim.log.levels.WARN) + else + require("overseer").run_action(tasks[1], "restart") + end + end, + desc = "[O]verseer run [L]ast", + }, + }, + config = function() + local overseer = require("overseer") + overseer.setup({}) + overseer.add_template_hook({ name = ".*" }, function(task_defn, util) + util.add_component(task_defn, { + "open_output", + on_start = "never", + on_complete = "failure", + direction = "vertical", + }) + end) + end, + }, + { + "ThePrimeagen/refactoring.nvim", + dependencies = { + "nvim-lua/plenary.nvim", + "nvim-treesitter/nvim-treesitter", + }, + keys = { + { + "<leader>re", + function() + require("refactoring").refactor("Extract Function") + end, + mode = "x", + desc = "[R]efactor [E]xtract function", + }, + { + "<leader>rf", + function() + require("refactoring").refactor("Extract Function To File") + end, + mode = "x", + desc = "[R]efactor extract function to [F]ile", + }, + { + "<leader>rv", + function() + require("refactoring").refactor("Extract Variable") + end, + mode = "x", + desc = "[R]efactor extract [V]ariable", + }, + { + "<leader>rI", + function() + require("refactoring").refactor("Inline Function") + end, + desc = "[R]efactor [I]nline function", + }, + { + "<leader>ri", + function() + require("refactoring").refactor("Inline Variable") + end, + mode = { "x", "n" }, + desc = "[R]efactor [I]nline variable", + }, + { + "<leader>rb", + function() + require("refactoring").refactor("Extract Block") + end, + desc = "[R]efactor extract [B]lock", + }, + { + "<leader>rB", + function() + require("refactoring").refactor("Extract Block To File") + end, + desc = "[R]efactor extract [B]lock to file", + }, + { + "<leader>rp", + function() + require("refactoring").debug.printf({}) + end, + desc = "[R]efactor [P]rint", + }, + + { + "<leader>rV", + function() + require("refactoring").debug.print_var({}) + end, + mode = { "x", "n" }, + desc = "[R]efactor [P]rint [V]ariable", + }, + { + "<leader>rc", + function() + require("refactoring").debug.cleanup({}) + end, + desc = "[R]efactor [C]leanup", + }, + }, + opts = {}, + }, + { + "folke/which-key.nvim", + event = "VeryLazy", + opts = { + spec = { + { "g", group = "[G]oto" }, + { "yo", group = "Toggle options" }, + { "]", group = "Navigate to next" }, + { "[", group = "Navigate to previous" }, + { "<leader>c", group = "[C]ode", mode = { "n", "x" } }, + { "<leader>d", group = "[D]ocument" }, + { "<leader>g", group = "[G]it" }, + { "<leader>h", group = "Git [H]unk", mode = { "n", "v" } }, + { "<leader>n", group = "[N]eotest" }, + { "<leader>o", group = "[O]verseer" }, + { "<leader>r", group = "[R]efactor" }, + { "<leader>s", group = "[S]earch" }, + { "<leader>w", group = "[W]orkspace" }, + { "<leader>t", group = "[T]oggle" }, + }, + }, + keys = { + { + "<leader>?", + function() + require("which-key").show({ global = false }) + end, + desc = "Buffer Local Keymaps (which-key)", + }, + }, + }, + { + "stevearc/quicker.nvim", + event = "FileType qf", + keys = { + { + "<leader>tq", + function() + require("quicker").toggle() + end, + desc = "[T]oggle [Q]uickfix", + }, + { + "<leader>tl", + function() + require("quicker").toggle({ loclist = true }) + end, + desc = "[T]oggle [L]oclist", + }, + }, + opts = { + keys = { + { + ">", + function() + require("quicker").expand({ + before = 2, + after = 2, + add_to_existing = true, + }) + end, + desc = "Expand quickfix context", + }, + { + "<", + function() + require("quicker").collapse() + end, + desc = "Collapse quickfix context", + }, + }, + }, + }, + { + "olimorris/codecompanion.nvim", + dependencies = { + "nvim-lua/plenary.nvim", + "ravitemer/mcphub.nvim", + }, + keys = { + { + "<leader>aa", + "<cmd>CodeCompanionActions<cr>", + mode = { "n", "v" }, + noremap = true, + silent = true, + desc = "[A]I [A]ctions", + }, + { + "<leader>ta", + "<cmd>CodeCompanionChat Toggle<cr>", + mode = { "n", "v" }, + noremap = true, + silent = true, + desc = "[T]oggle [A]I chat", + }, + { + "<leader>ac", + "<cmd>CodeCompanionChat Add<cr>", + mode = "v", + noremap = true, + silent = true, + desc = "[A]I [C]hat add", + }, + }, + opts = { + strategies = { + chat = { + adapter = "copilot", + }, + inline = { + adapter = "copilot", + }, + }, + extensions = { + mcphub = { + callback = "mcphub.extensions.codecompanion", + opts = { + make_vars = true, + make_slash_commands = true, + show_result_in_chat = true, + }, + }, + }, + }, + }, + { + "stevearc/oil.nvim", + opts = {}, + lazy = false, + }, +} diff --git a/home/.config/nvim/lua/plugins/lsp.lua b/home/.config/nvim/lua/plugins/lsp.lua new file mode 100644 index 0000000..585c285 --- /dev/null +++ b/home/.config/nvim/lua/plugins/lsp.lua @@ -0,0 +1,207 @@ +return { + { + "folke/lazydev.nvim", + ft = "lua", + opts = { + library = { + { path = "${3rd}/luv/library", words = { "vim%.uv" } }, + }, + }, + }, + { + "neovim/nvim-lspconfig", + version = false, + dependencies = { + { "j-hui/fidget.nvim", opts = {} }, + "saghen/blink.cmp", + { "williamboman/mason.nvim", opts = {} }, + { + "williamboman/mason-lspconfig.nvim", + opts = { + ensure_installed = {}, + automatic_installation = false, + handlers = { + function(server_name) + vim.lsp.enable(server_name) + end, + }, + }, + }, + { + "WhoIsSethDaniel/mason-tool-installer.nvim", + opts = { + ensure_installed = { + "actionlint", + "autotools-language-server", + "basedpyright", + "bash-language-server", + "clangd", + "codelldb", + "codespell", + "css-lsp", + "dockerfile-language-server", + "gh", + "gh-actions-language-server", + "groovy-language-server", + "hadolint", + "html-lsp", + "jq", + "json-lsp", + "jsonlint", + "just-lsp", -- "Platform unsupported" + "lua-language-server", + "markdownlint", + "mdformat", + "neocmakelsp", + "nginx-config-formatter", + "nginx-language-server", -- needs python <= 3.12 + "npm-groovy-lint", + "prettier", + "ruff", + "rust-analyzer", + "shellcheck", + "shellharden", + "shfmt", + "stylelint", + "stylua", + "systemd-lsp", + "systemdlint", + "typescript-language-server", + "typos", + "yaml-language-server", + "yamllint", + "yq", + -- "fortls", + }, + }, + }, + }, + config = function() + vim.lsp.enable("just") + vim.lsp.enable("tblgen_lsp_server") + end, + }, + { + "stevearc/conform.nvim", + event = { "BufWritePre" }, + cmd = { "ConformInfo" }, + keys = { + { + "<leader>f", + function() + require("conform").format({ async = true, lsp_fallback = true }) + end, + mode = "", + desc = "[F]ormat buffer", + }, + }, + config = function() + require("conform").setup({ + formatters_by_ft = { + awk = { "gawk" }, + bash = { "shfmt" }, + cmake = { "cmake_format" }, + css = { "prettier", "stylelint" }, + groovy = { "npm-groovy-lint" }, + html = { "prettier" }, + javascript = { "prettier" }, + typescript = { "prettier" }, + jenkins = { "npm-groovy-lint" }, + json = { "jq", "jsonlint" }, + jsonc = { "prettier" }, + just = { "just" }, + markdown = { "mdformat" }, + nginx = { "nginxfmt" }, + lua = { "stylua" }, + python = { "ruff_format", "ruff_fix", "ruff_organize_imports" }, + rust = { "rustfmt" }, + sh = { "shfmt", "shellcheck", "shellharden" }, + yaml = { "yamllint" }, + zsh = { "shfmt", "shellcheck", "shellharden" }, + }, + default_format_opts = { + lsp_format = "fallback", + }, + formatters = { + shfmt = { + prepend_args = { "-i", "2" }, + }, + }, + }) + vim.o.formatexpr = "v:lua.require'conform'.formatexpr()" + end, + }, + { + "mrcjkb/rustaceanvim", + ft = "rust", + }, + { + "mfussenegger/nvim-lint", + event = { "BufReadPre", "BufNewFile" }, + config = function() + local lint = require("lint") + + lint.linters_by_ft = { + css = { "stylelint" }, + dockerfile = { "hadolint" }, + groovy = { "npm-groovy-lint" }, + jenkins = { "npm-groovy-lint" }, + json = { "jsonlint" }, + markdown = { "markdownlint" }, + makefile = { "checkmake" }, + systemd = { "systemdlint" }, + yaml = { "yamllint", "yq" }, + ghaction = { "actionlint" }, + zsh = { "zsh" }, + ["*"] = { "codespell", "typos" }, + } + local lint_augroup = vim.api.nvim_create_augroup("lint", { clear = true }) + vim.api.nvim_create_autocmd({ "BufReadPost", "BufWritePost" }, { + group = lint_augroup, + callback = function() + if vim.opt_local.modifiable:get() then + lint.try_lint() + end + end, + }) + end, + }, + { + "rachartier/tiny-inline-diagnostic.nvim", + event = "VeryLazy", + priority = 1000, + opts = { + options = { + show_source = { + if_many = true, + }, + -- Set the arrow icon to the same color as the first diagnostic severity + set_arrow_to_diag_color = true, + -- Configuration for multiline diagnostics + -- Can be a boolean or a table with detailed options + multilines = { + -- Enable multiline diagnostic messages + enabled = true, + }, + + -- Display all diagnostic messages on the cursor line, not just those under cursor + show_all_diags_on_cursorline = true, + -- Enable diagnostics in Select mode (e.g., when auto-completing with Blink) + enable_on_select = true, + -- Configuration for breaking long messages into separate lines + break_line = { + -- Enable breaking messages after a specific length + enabled = true, + }, + -- Filter diagnostics by severity levels + -- Available severities: vim.diagnostic.severity.ERROR, WARN, INFO, HINT + severity = { + vim.diagnostic.severity.ERROR, + vim.diagnostic.severity.WARN, + vim.diagnostic.severity.INFO, + vim.diagnostic.severity.HINT, + }, + }, + }, + }, +} diff --git a/home/.config/nvim/lua/plugins/search.lua b/home/.config/nvim/lua/plugins/search.lua new file mode 100644 index 0000000..40d8395 --- /dev/null +++ b/home/.config/nvim/lua/plugins/search.lua @@ -0,0 +1,183 @@ +return { + { + "ibhagwan/fzf-lua", + branch = "main", + keys = { + { + "<localleader>b", + function() + require("fzf-lua").buffers() + end, + desc = "fzf-lua by [G]rep", + }, + { + "<localleader>g", + function() + require("fzf-lua").live_grep() + end, + desc = "fzf-lua by [G]rep", + }, + { + "<localleader>f", + function() + require("fzf-lua").files() + end, + desc = "fzf-lua [F]iles", + }, + { + "<leader><leader>", + function() + require("fzf-lua").global() + end, + desc = "fzf-lua global picker", + }, + { + "<localleader>d", + function() + require("fzf-lua").diagnostics() + end, + desc = "fzf-lua [D]iagnostics", + }, + { + "<localleader>r", + function() + require("fzf-lua").resume() + end, + desc = "fzf-lua [R]esume", + }, + { + "<localleader>gc", + function() + require("fzf-lua").git_bcommits() + end, + mode = "n", + desc = "[G]it buffer [C]commits", + }, + { + "<localleader>gc", + function() + require("fzf-lua").git_bcommits_range() + end, + mode = "v", + desc = "[G]it [C]commits for selected range", + }, + { + "<localleader>gC", + function() + require("fzf-lua").git_commits() + end, + desc = "[G]it (all) [C]commits", + }, + { + "<localleader>gb", + function() + require("fzf-lua").git_branches() + end, + desc = "[G]it [B]ranches", + }, + { + "<localleader>gs", + function() + require("fzf-lua").git_status() + end, + desc = "[G]it [S]tatus", + }, + { + "<localleader>gS", + function() + require("fzf-lua").git_stash() + end, + desc = "[G]it [S]tash", + }, + }, + config = function() + local fzflua = require("fzf-lua") + fzflua.setup({ + keymap = { + builtin = { + true, + ["<M-p>"] = "toggle-preview", + }, + }, + grep = { + hidden = true, + RIPGREP_CONFIG_PATH = "~/.config/ripgrep/ripgreprc", + }, + lsp = { + includeDeclaration = false, + }, + actions = { + files = { + true, + ["ctrl-x"] = fzflua.actions.file_split, + }, + }, + }) + vim.api.nvim_create_autocmd("LspAttach", { + callback = function(event) + local bnmap = function(keys, func, desc) + vim.keymap.set( + "n", + keys, + func, + { buffer = event.buf, desc = "LSP: " .. desc } + ) + end + bnmap("gd", fzflua.lsp_definitions, "[G]oto [D]efinition") + bnmap("gvd", function() + fzflua.lsp_definitions({ jump1_action = fzflua.actions.file_vsplit }) + end, "[G]oto in a [V]ertical split to [D]efinition") + bnmap("gxd", function() + fzflua.lsp_definitions({ jump1_action = fzflua.actions.file_split }) + end, "[G]oto in a [X]horizontal split to [D]efinition") + bnmap("gtd", function() + fzflua.lsp_definitions({ + jump1_action = fzflua.actions.file_tabedit, + }) + end, "[G]oto in a [T]ab to [D]efinition") + bnmap("<leader>D", fzflua.lsp_typedefs, "Type [D]efinition") + bnmap("<leader>vD", function() + fzflua.lsp_typedefs({ jump1_action = fzflua.actions.file_vsplit }) + end, "Open in a [V]ertical split Type [D]efinition") + bnmap("<leader>xD", function() + fzflua.lsp_typedefs({ jump1_action = fzflua.actions.file_split }) + end, "Open in a [X]horizontal split Type [D]efinition") + bnmap("<leader>tD", function() + fzflua.lsp_typedefs({ jump1_action = fzflua.actions.file_tabedit }) + end, "Open in a [T]ab Type [D]efinition") + bnmap("gri", fzflua.lsp_implementations, "[G]oto [I]mplementation") + bnmap("grvi", function() + fzflua.lsp_implementations({ + jump1_action = fzflua.actions.file_vsplit, + }) + end, "[G]oto in a [V]ertical split to [I]mplementation") + bnmap("grxi", function() + fzflua.lsp_implementations({ + jump1_action = fzflua.actions.file_split, + }) + end, "[G]oto in a [X]horizontal split to [I]mplementation") + bnmap("grti", function() + fzflua.lsp_implementations({ + jump1_action = fzflua.actions.file_tabedit, + }) + end, "[G]oto in a [T]ab to [I]mplementation") + bnmap("grr", fzflua.lsp_references, "[G]oto [R]eferences") + bnmap("<leader>ic", fzflua.lsp_incoming_calls, "[I]ncoming [C]alls") + bnmap("<leader>oc", fzflua.lsp_outgoing_calls, "[O]utgoing [C]alls") + bnmap("gO", fzflua.lsp_document_symbols, "d[O]ocument symbols") + bnmap( + "<leader>ws", + fzflua.lsp_live_workspace_symbols, + "[W]orkspace [S]ymbols" + ) + bnmap( + "<leader>wd", + fzflua.diagnostics_workspace, + "[W]orkspace [D]iagnostics" + ) + end, + }) + fzflua.register_ui_select() + end, + }, +} diff --git a/home/.config/nvim/lua/plugins/ts.lua b/home/.config/nvim/lua/plugins/ts.lua new file mode 100644 index 0000000..99c9688 --- /dev/null +++ b/home/.config/nvim/lua/plugins/ts.lua @@ -0,0 +1,153 @@ +return { + { + "aaronik/treewalker.nvim", + keys = { + { + "<a-k>", + "<cmd>Treewalker Up<cr>", + mode = { "n", "v" }, + silent = true, + desc = "Moves up to the previous neighbor node", + }, + { + "<a-j>", + "<cmd>Treewalker Down<cr>", + mode = { "n", "v" }, + silent = true, + desc = "Moves up to the next neighbor node", + }, + { + "<a-h>", + "<cmd>Treewalker Left<cr>", + mode = { "n", "v" }, + silent = true, + desc = "Moves to the first ancestor node that's on a different line from the current node", + }, + { + "<a-l>", + "<cmd>Treewalker Right<cr>", + mode = { "n", "v" }, + silent = true, + desc = "Moves to the next node down that's indented further than the current node", + }, + { + "<s-a-k>", + "<cmd>Treewalker SwapUp<cr>", + silent = true, + desc = "Swaps the highest node on the line upwards in the document", + }, + { + "<s-a-j>", + "<cmd>Treewalker SwapDown<cr>", + silent = true, + desc = "Swaps the biggest node on the line downward in the document", + }, + { + "<s-a-h>", + "<cmd>Treewalker SwapLeft<cr>", + silent = true, + desc = "Swap the node under the cursor with its previous neighbor", + }, + { + "<s-a-l>", + "<cmd>Treewalker SwapRight<cr>", + silent = true, + desc = "Swap the node under the cursor with its next neighbor", + }, + }, + opts = {}, + }, + { + "nvim-treesitter/nvim-treesitter", + branch = "main", + lazy = false, + dependencies = { + { + "LiadOz/nvim-dap-repl-highlights", + opts = {}, + }, + }, + build = ":TSUpdate", + config = function() + require("nvim-treesitter").install({ + "awk", + "bash", + "c", + "cmake", + "comment", + "cpp", + "css", + "csv", + "diff", + "dockerfile", + "dap_repl", + "doxygen", + "editorconfig", + "fortran", + "git_config", + "git_rebase", + "gitattributes", + "gitcommit", + "gitignore", + "groovy", + "gpg", + "hlsplaylist", + "html", + "http", + "ini", + "javascript", + "jq", + "jsdoc", + "json", + "just", + "llvm", + "lua", + "luadoc", + "luap", + "make", + "markdown", + "markdown_inline", + "query", + "passwd", + "printf", + "python", + "regex", + "readline", + "requirements", + "rust", + "sql", + "ssh_config", + "strace", + "sxhkdrc", + "tablegen", + "tmux", + "todotxt", + "toml", + "typescript", + "vim", + "vimdoc", + "xcompose", + "xml", + "xresources", + "yaml", + }) + end, + }, + "RRethy/nvim-treesitter-endwise", + { "nvim-treesitter/nvim-treesitter-context", opts = {} }, + { + "JoosepAlviste/nvim-ts-context-commentstring", + config = function() + require("ts_context_commentstring").setup({ + enable_autocmd = false, + }) + local get_option = vim.filetype.get_option + + vim.filetype.get_option = function(filetype, option) + return option == "commentstring" + and require("ts_context_commentstring.internal").calculate_commentstring() + or get_option(filetype, option) + end + end, + }, +} diff --git a/home/.config/nvim/lua/plugins/ui.lua b/home/.config/nvim/lua/plugins/ui.lua new file mode 100644 index 0000000..6ea0c97 --- /dev/null +++ b/home/.config/nvim/lua/plugins/ui.lua @@ -0,0 +1,83 @@ +return { + { + "ellisonleao/gruvbox.nvim", + priority = 1000, + config = function() + require("gruvbox").setup({}) + vim.o.background = "dark" + vim.cmd([[colorscheme gruvbox]]) + end, + }, + { + "saghen/blink.indent", + --- @module 'blink.indent' + --- @type blink.indent.Config + opts = { + scope = { + highlights = { + "BlinkIndentOrange", + "BlinkIndentViolet", + "BlinkIndentBlue", + "BlinkIndentRed", + "BlinkIndentCyan", + "BlinkIndentYellow", + "BlinkIndentGreen", + }, + underline = { + enabled = true, + highlights = { + "BlinkIndentOrangeUnderline", + "BlinkIndentVioletUnderline", + "BlinkIndentBlueUnderline", + "BlinkIndentRedUnderline", + "BlinkIndentCyanUnderline", + "BlinkIndentYellowUnderline", + "BlinkIndentGreenUnderline", + }, + }, + }, + }, + }, + { + "nvim-lualine/lualine.nvim", + opts = { + options = { + icons_enabled = false, + theme = "gruvbox_dark", + component_separators = "", + section_separators = "|", + disabled_filetypes = { + winbar = { + "dap-view", + "dap-repl", + "dap-view-term", + }, + }, + }, + sections = { + lualine_a = { "filetype", { "filename", path = 1 } }, + lualine_b = { "%l/%L:%c:%o" }, + lualine_c = { "diff" }, + lualine_x = { "searchcount", "selectioncount" }, + lualine_y = { "overseer", "copilot" }, + lualine_z = { "diagnostics" }, + }, + inactive_sections = { + lualine_a = {}, + lualine_b = {}, + lualine_c = { "filename" }, + lualine_x = {}, + lualine_y = {}, + lualine_z = {}, + }, + }, + dependencies = { + "AndreM222/copilot-lualine", + }, + }, + { + "jake-stewart/auto-cmdheight.nvim", + lazy = false, + opts = {}, + }, +} |
