diff options
Diffstat (limited to 'modules/development/nixvim')
| -rw-r--r-- | modules/development/nixvim/default.nix | 40 | ||||
| -rw-r--r-- | modules/development/nixvim/keymaps.nix | 41 | ||||
| -rw-r--r-- | modules/development/nixvim/plugins/comment.nix | 14 | ||||
| -rw-r--r-- | modules/development/nixvim/plugins/dap-ui.nix | 25 | ||||
| -rw-r--r-- | modules/development/nixvim/plugins/dap-virtual-text.nix | 7 | ||||
| -rw-r--r-- | modules/development/nixvim/plugins/dap.nix | 81 | ||||
| -rw-r--r-- | modules/development/nixvim/plugins/default.nix | 3 | ||||
| -rw-r--r-- | modules/development/nixvim/plugins/gitsigns.nix | 103 | ||||
| -rw-r--r-- | modules/development/nixvim/plugins/lsp.nix | 242 | ||||
| -rw-r--r-- | modules/development/nixvim/plugins/nvim-tree.nix | 78 | ||||
| -rw-r--r-- | modules/development/nixvim/plugins/telescope.nix | 10 | ||||
| -rw-r--r-- | modules/development/nixvim/plugins/which-key.nix | 29 |
12 files changed, 374 insertions, 299 deletions
diff --git a/modules/development/nixvim/default.nix b/modules/development/nixvim/default.nix index bf3d143..8506b7d 100644 --- a/modules/development/nixvim/default.nix +++ b/modules/development/nixvim/default.nix @@ -28,31 +28,29 @@ tabstop = 2; softtabstop = 2; expandtab = true; + wrap = true; + linebreak = true; + breakindent = true; + showbreak = "↳"; list = true; laststatus = 3; foldlevel = 99; clipboard = "unnamedplus"; updatetime = 500; + fillchars = "eob: "; + listchars = "tab: ,trail:_,lead: "; + exrc = true; }; + globals.mapleader = " "; clipboard.providers.xclip.enable = true; - extraConfigLuaPre = with config.scheme.withHashtag; '' - vim.opt.fillchars:append({ eob = " " }) - vim.opt.listchars = { tab = " ", trail = "_", lead = " " } - vim.api.nvim_set_hl(0, "WinSeparator", { - fg = "${base01}", - bg = "${base00}", - }) - vim.api.nvim_create_autocmd({ "FileType" }, { - pattern = { "yaml", "yml" }, - callback = function() - vim.opt_local.expandtab = true - vim.opt_local.shiftwidth = 2 - vim.opt_local.softtabstop = 2 - vim.opt_local.tabstop = 2 - end, - }) - ''; + highlight = with config.scheme.withHashtag; { + WinSeparator = { + fg = base01; + bg = base00; + }; + }; + performance = { byteCompileLua.enable = true; combinePlugins.enable = true; @@ -83,6 +81,14 @@ end ''; } + { + event = [ "FileType" ]; + pattern = [ + "yaml" + "yml" + ]; + command = "setlocal expandtab shiftwidth=2 softtabstop=2 tabstop=2"; + } ]; }; }; diff --git a/modules/development/nixvim/keymaps.nix b/modules/development/nixvim/keymaps.nix index 46c3168..cc258c1 100644 --- a/modules/development/nixvim/keymaps.nix +++ b/modules/development/nixvim/keymaps.nix @@ -2,13 +2,25 @@ { config, lib, ... }: { config.programs.nixvim.keymaps = lib.mkIf config.development.nixvim.enable [ + # set the <space> key to nop for normal and visual modes as we are tyring + # to use it as our <leader> + { + mode = [ + "n" + "v" + ]; + key = "<space>"; + action = "<nop>"; + options.desc = "Disable leader delay"; + } + # window navigation { key = "<c-h>"; action = "<c-w>h"; options.desc = "Move to left window"; } { - key = "<c-w>"; + key = "<c-j>"; action = "<c-w>j"; options.desc = "Move to bottom window"; } @@ -22,15 +34,28 @@ action = "<c-w>l"; options.desc = "Move to right window"; } + # window resizing { - key = "<c-n>"; - action = "<cmd>NvimTreeToggle<cr>"; - mode = [ - "n" - "i" - ]; - options.desc = "Toggle file explorer"; + key = "<C-=>"; + action = "<c-w>+"; + options.desc = "Increase window height"; + } + { + key = "<C-->"; + action = "<c-w>-"; + options.desc = "Decrease window height"; + } + { + key = "<C-.>"; + action = "<c-w>>"; + options.desc = "Increase window height"; + } + { + key = "<C-,>"; + action = "<c-w><"; + options.desc = "Decrease window height"; } + # scrolling { key = "<c-d>"; action = "<c-d>zz"; diff --git a/modules/development/nixvim/plugins/comment.nix b/modules/development/nixvim/plugins/comment.nix index 10bed84..8c69218 100644 --- a/modules/development/nixvim/plugins/comment.nix +++ b/modules/development/nixvim/plugins/comment.nix @@ -5,17 +5,17 @@ enable = true; settings = { toggler = { - line = "gcc"; # toggle line comment - block = "gbc"; # toggle block comment + line = "<leader>cc"; # toggle line comment + block = "<leader>cb"; # toggle block comment }; opleader = { - line = "gc"; # line comment operator (gc + motion) - block = "gb"; # block comment operator (gb + motion) + line = "<leader>cc"; # toggle line comment + block = "<leader>cb"; # toggle block comment }; extra = { - above = "gcO"; # add comment line above - below = "gco"; # add comment line below - eol = "gcA"; # add comment at end of line + above = "<leader>cu"; # add comment line above + below = "<leader>cd"; # add comment line below + eol = "<leader>ce"; # add comment at end of line }; }; }; diff --git a/modules/development/nixvim/plugins/dap-ui.nix b/modules/development/nixvim/plugins/dap-ui.nix new file mode 100644 index 0000000..cc25d2d --- /dev/null +++ b/modules/development/nixvim/plugins/dap-ui.nix @@ -0,0 +1,25 @@ +# A UI for nvim-dap. +{ config, lib, ... }: +{ + config.programs.nixvim = lib.mkIf config.development.nixvim.enable { + plugins.dap-ui = { + enable = true; + }; + + keymaps = [ + # dap-ui controls + { + mode = "n"; + key = "<leader>du"; + action = "<cmd>lua require('dapui').toggle()<CR>"; + options.desc = "Debug: Toggle UI"; + } + { + mode = "n"; + key = "<leader>de"; + action = "<cmd>lua require('dapui').eval()<CR>"; + options.desc = "Debug: Eval Expression Under Cursor"; + } + ]; + }; +} diff --git a/modules/development/nixvim/plugins/dap-virtual-text.nix b/modules/development/nixvim/plugins/dap-virtual-text.nix new file mode 100644 index 0000000..4fea5ca --- /dev/null +++ b/modules/development/nixvim/plugins/dap-virtual-text.nix @@ -0,0 +1,7 @@ +# A plugin that adds virtual text support to the nvim-dap. +{ config, lib, ... }: +{ + config.programs.nixvim.plugins.dap-virtual-text = lib.mkIf config.development.nixvim.enable { + enable = true; + }; +} diff --git a/modules/development/nixvim/plugins/dap.nix b/modules/development/nixvim/plugins/dap.nix new file mode 100644 index 0000000..02bffa6 --- /dev/null +++ b/modules/development/nixvim/plugins/dap.nix @@ -0,0 +1,81 @@ +# Debug Adapter Protocol client implementation for Neovim. +{ config, lib, ... }: +{ + config.programs.nixvim = lib.mkIf config.development.nixvim.enable { + plugins.dap = { + enable = true; + }; + + keymaps = [ + # Core DAP controls + { + mode = "n"; + key = "<leader>dc"; + action = "<cmd>lua require('dap').continue()<CR>"; + options.desc = "Debug: Continue"; + } + { + mode = "n"; + key = "<leader>di"; + action = "<cmd>lua require('dap').step_into()<CR>"; + options.desc = "Debug: Step Into"; + } + { + mode = "n"; + key = "<leader>do"; + action = "<cmd>lua require('dap').step_over()<CR>"; + options.desc = "Debug: Step Over"; + } + { + mode = "n"; + key = "<leader>dO"; + action = "<cmd>lua require('dap').step_out()<CR>"; + options.desc = "Debug: Step Out"; + } + { + mode = "n"; + key = "<leader>db"; + action = "<cmd>lua require('dap').toggle_breakpoint()<CR>"; + options.desc = "Debug: Toggle Breakpoint"; + } + { + mode = "n"; + key = "<leader>dB"; + action = "<cmd>lua require('dap').set_breakpoint(vim.fn.input('Breakpoint condition: '))<CR>"; + options.desc = "Debug: Conditional Breakpoint"; + } + { + mode = "n"; + key = "<leader>dl"; + action = "<cmd>lua require('dap').run_last()<CR>"; + options.desc = "Debug: Run Last"; + } + { + mode = "n"; + key = "<leader>dt"; + action = "<cmd>lua require('dap').terminate()<CR>"; + options.desc = "Debug: Terminate"; + } + { + mode = "n"; + key = "<leader>dr"; + action = "<cmd>lua require('dap').repl.toggle()<CR>"; + options.desc = "Debug: Toggle REPL"; + } + ]; + + # Auto open/close dap-ui with the debug session lifecycle + extraConfigLua = '' + local dap, dapui = require("dap"), require("dapui") + dap.listeners.after.event_initialized["dapui_config"] = function() + dapui.open() + end + dap.listeners.before.event_terminated["dapui_config"] = function() + dapui.close() + end + dap.listeners.before.event_exited["dapui_config"] = function() + dapui.close() + end + ''; + }; +} diff --git a/modules/development/nixvim/plugins/default.nix b/modules/development/nixvim/plugins/default.nix index c7ebea4..67f7f06 100644 --- a/modules/development/nixvim/plugins/default.nix +++ b/modules/development/nixvim/plugins/default.nix @@ -4,6 +4,9 @@ imports = [ ./cmp.nix ./comment.nix + ./dap-ui.nix + ./dap-virtual-text.nix + ./dap.nix ./gitsigns.nix ./indent-blankline.nix ./lsp.nix diff --git a/modules/development/nixvim/plugins/gitsigns.nix b/modules/development/nixvim/plugins/gitsigns.nix index 38ad85f..28123fd 100644 --- a/modules/development/nixvim/plugins/gitsigns.nix +++ b/modules/development/nixvim/plugins/gitsigns.nix @@ -1,7 +1,104 @@ -# Git status in the sign column +# Git integration: signs, blame, diffs and hunk operations { config, lib, ... }: { - config.programs.nixvim.plugins.gitsigns = lib.mkIf config.development.nixvim.enable { - enable = true; + config.programs.nixvim = lib.mkIf config.development.nixvim.enable { + plugins.gitsigns = { + enable = true; + + settings = { + signs = { + add.text = "┃"; + change.text = "┃"; + delete.text = "▁"; + topdelete.text = "▔"; + changedelete.text = "~"; + untracked.text = "┆"; + }; + + signcolumn = false; + numhl = true; + current_line_blame = false; + current_line_blame_formatter = "<author>, <author_time:%Y-%m-%d> - <summary>"; + + on_attach = '' + function(bufnr) + local gitsigns = require('gitsigns') + local function map(mode, lhs, rhs, desc) + vim.keymap.set(mode, lhs, rhs, { buffer = bufnr, silent = true, desc = desc }) + end + + -- Navigation + map('n', ']c', function() gitsigns.nav_hunk('next') end, 'Next hunk') + map('n', '[c', function() gitsigns.nav_hunk('prev') end, 'Previous hunk') + map('n', ']C', function() gitsigns.nav_hunk('last') end, 'Last hunk') + map('n', '[C', function() gitsigns.nav_hunk('first') end, 'First hunk') + + -- Hunk actions + map('n', '<leader>gs', gitsigns.stage_hunk, 'Stage hunk') + map('v', '<leader>gs', function() + gitsigns.stage_hunk({ vim.fn.line('.'), vim.fn.line('v') }) + end, 'Stage visual range hunk') + map('n', '<leader>gr', gitsigns.reset_hunk, 'Reset hunk') + map('v', '<leader>gr', function() + gitsigns.reset_hunk({ vim.fn.line('.'), vim.fn.line('v') }) + end, 'Reset visual range hunk') + map('n', '<leader>gS', gitsigns.stage_buffer, 'Stage buffer') + map('n', '<leader>gR', gitsigns.reset_buffer, 'Reset buffer') + map('n', '<leader>gi', gitsigns.reset_buffer_index, 'Unstage buffer (reset index)') + map('n', '<leader>gu', gitsigns.undo_stage_hunk, 'Undo stage hunk') + + -- Preview + map('n', '<leader>gp', gitsigns.preview_hunk, 'Preview hunk') + map('n', '<leader>gP', gitsigns.preview_hunk_inline, 'Preview hunk inline') + + -- Blame + map('n', '<leader>gb', gitsigns.blame_line, 'Blame line') + map('n', '<leader>gB', function() + gitsigns.blame_line({ full = true }) + end, 'Blame line (full)') + + -- Diffs / base + map('n', '<leader>gd', gitsigns.diffthis, 'Diff this (index)') + map('n', '<leader>gD', function() + gitsigns.diffthis('~') + end, 'Diff this (HEAD)') + map('n', '<leader>gc', function() + gitsigns.change_base(nil, true) + end, 'Change diff base') + + -- Quickfix / location list + map('n', '<leader>gq', gitsigns.setqflist, 'Hunks to quickfix') + map('n', '<leader>gQ', function() + gitsigns.setqflist('all') + end, 'Repo hunks to quickfix') + map('n', '<leader>gl', gitsigns.setloclist, 'Hunks to location list') + + -- Toggles + map('n', '<leader>gts', gitsigns.toggle_signs, 'Toggle signs') + map('n', '<leader>gtl', gitsigns.toggle_linehl, 'Toggle line highlight') + map('n', '<leader>gtn', gitsigns.toggle_numhl, 'Toggle number highlight') + map('n', '<leader>gtw', gitsigns.toggle_word_diff, 'Toggle word diff') + map('n', '<leader>gtb', gitsigns.toggle_current_line_blame, 'Toggle current line blame') + map('n', '<leader>gtd', gitsigns.toggle_deleted, 'Toggle deleted lines') + + -- Misc + map('n', '<leader>gF', gitsigns.refresh, 'Refresh gitsigns') + + -- Text object + map({ 'o', 'x' }, 'ih', gitsigns.select_hunk, 'Select hunk text object') + end + ''; + }; + }; + + highlight = with config.scheme.withHashtag; { + GitSignsAdd.fg = base0B; + GitSignsChange.fg = base0A; + GitSignsDelete.fg = base08; + GitSignsTopdelete.fg = base08; + GitSignsChangedelete.fg = base0A; + GitSignsUntracked.fg = base0C; + GitSignsCurrentLineBlame.fg = base04; + }; }; } diff --git a/modules/development/nixvim/plugins/lsp.nix b/modules/development/nixvim/plugins/lsp.nix index 0a92f86..6c64a37 100644 --- a/modules/development/nixvim/plugins/lsp.nix +++ b/modules/development/nixvim/plugins/lsp.nix @@ -6,228 +6,28 @@ inlayHints = true; autoLoad = true; - keymaps.lspBuf = { - K = "hover"; - gD = "references"; - gd = "definition"; - gi = "implementation"; - gt = "type_definition"; - }; - - servers = { - # System and configuration - nixd = { - enable = true; - package = null; - }; # Nix - bashls = { - enable = true; - package = null; - }; # Bash shell - taplo = { - enable = true; - package = null; - }; # TOML - yamlls = { - enable = true; - package = null; - }; # YAML - jsonls = { - enable = true; - package = null; - }; # JSON - marksman = { - enable = true; - package = null; - }; # Markdown - - # Web development - html = { - enable = true; - package = null; - }; # HTML - cssls = { - enable = true; - package = null; - }; # CSS, SCSS and LESS - tailwindcss = { - enable = true; - package = null; - }; # Tailwind CSS - vtsls = { - # JS and TS fast wrapper for tsserver - enable = true; - package = null; - settings = { - # Limits huge generic type hints - vtsls.experimental.maxInlayHintLength = 30; - - # TypeScript type inferences - typescript.inlayHints = { - parameterNames.enabled = "all"; - parameterTypes.enabled = true; - variableTypes.enabled = true; - propertyDeclarationTypes.enabled = true; - functionLikeReturnTypes.enabled = true; - enumMemberValues.enabled = true; - }; - - # JavaScript type inferences - javascript.inlayHints = { - parameterNames.enabled = "all"; - parameterTypes.enabled = true; - variableTypes.enabled = true; - propertyDeclarationTypes.enabled = true; - functionLikeReturnTypes.enabled = true; - enumMemberValues.enabled = true; - }; - }; - }; - eslint = { - enable = true; - package = null; - }; # ESLint diagnostics and formatting - - # Web frameworks - volar = { - # Vue - enable = true; - package = null; - tslsIntegration = false; - }; - svelte = { - enable = true; - package = null; - }; # Svelte - astro = { - enable = true; - package = null; - }; # Astro - - # Scripting and high-level languages - basedpyright = { - # Python, modern faster fork of Pyright - enable = true; - package = null; - settings.basedpyright.analysis.inlayHints = { - variableTypes = true; - callArgumentNames = true; - functionReturnTypes = true; - genericTypes = false; # Opt in since these can get noisy - }; + keymaps = { + lspBuf = { + "<leader>lh" = "hover"; + "<leader>lr" = "references"; + "<leader>ld" = "definition"; + "<leader>li" = "implementation"; + "<leader>lt" = "type_definition"; + "<leader>lD" = "declaration"; + "<leader>lR" = "rename"; + "<leader>la" = "code_action"; + "<leader>lf" = "format"; + "<leader>ls" = "signature_help"; + "<leader>lwa" = "add_workspace_folder"; + "<leader>lwr" = "remove_workspace_folder"; + "<leader>lwl" = "list_workspace_folders"; + }; + diagnostic = { + "<leader>le" = "open_float"; + "<leader>lq" = "setloclist"; + "[d" = "goto_prev"; + "]d" = "goto_next"; }; - ruff = { - enable = true; - package = null; - }; # Python linter and formatter - ruby_lsp = { - enable = true; - package = null; - }; # Ruby - lua_ls = { - # Lua - enable = true; - package = null; - settings.Lua.hint = { - enable = true; - arrayIndex = "Auto"; - setType = true; - paramName = "All"; - paramType = true; - }; - }; - intelephense = { - enable = true; - package = null; - }; # PHP - elixirls = { - enable = true; - package = null; - }; # Elixir - - # Systems, compiled and enterprise - clangd = { - enable = true; - package = null; - }; # C and C++ with inlay hints on by default - rust_analyzer = { - # Rust with inlay hints on by default - enable = true; - package = null; - installCargo = false; - installRustc = false; - }; - gopls = { - # Go - enable = true; - package = null; - settings.gopls.hints = { - assignVariableTypes = true; - compositeLiteralFields = true; - compositeLiteralTypes = true; - constantValues = true; - functionTypeParameters = true; - parameterNames = true; - rangeVariableTypes = true; - }; - }; - zls = { - enable = true; - package = null; - }; # Zig with inlay hints on by default - jdtls = { - # Java - enable = true; - package = null; - settings.java.inlayHints.parameterNames.enabled = "all"; - }; - kotlin_language_server = { - enable = true; - package = null; - }; # Kotlin - csharp_ls = { - enable = true; - package = null; - }; # C# without inlay hint support - hls = { - # Haskell - enable = true; - package = null; - installGhc = false; - settings.haskell.plugin."inlay-hints".globalOn = true; - }; - ocamllsp = { - enable = true; - package = null; - }; # OCaml - - # Infrastructure and DevOps - dockerls = { - enable = true; - package = null; - }; # Dockerfile - docker_compose_language_service = { - enable = true; - package = null; - }; # Docker Compose - terraformls = { - enable = true; - package = null; - }; # Terraform and HCL - - # Data and APIs - sqlls = { - enable = true; - package = null; - }; # SQL - graphql = { - enable = true; - package = null; - }; # GraphQL - prismals = { - enable = true; - package = null; - }; # Prisma ORM }; }; } diff --git a/modules/development/nixvim/plugins/nvim-tree.nix b/modules/development/nixvim/plugins/nvim-tree.nix index 2f35e3c..67f61fd 100644 --- a/modules/development/nixvim/plugins/nvim-tree.nix +++ b/modules/development/nixvim/plugins/nvim-tree.nix @@ -1,43 +1,57 @@ # File explorer sidebar { config, lib, ... }: { - config.programs.nixvim.plugins.nvim-tree = lib.mkIf config.development.nixvim.enable { - enable = true; - settings = { - filters = { - dotfiles = false; - git_clean = false; - no_buffer = false; - custom = { }; - }; - git = { - enable = true; - ignore = false; - }; - view = { - width = 30; - }; - renderer = { - indent_markers = { + config.programs.nixvim = lib.mkIf config.development.nixvim.enable { + plugins.nvim-tree = { + enable = true; + settings = { + filters = { + dotfiles = false; + git_clean = false; + no_buffer = false; + custom = { }; + }; + git = { enable = true; - inline_arrows = false; - icons = { - corner = "└"; - edge = "│"; - item = "├"; - bottom = "─"; - none = " "; - }; + ignore = false; + }; + view = { + width = 30; }; - icons = { - show = { - folder = true; - folder_arrow = false; - file = true; - git = true; + renderer = { + indent_markers = { + enable = true; + inline_arrows = false; + icons = { + corner = "└"; + edge = "│"; + item = "├"; + bottom = "─"; + none = " "; + }; + }; + icons = { + show = { + folder = true; + folder_arrow = false; + file = true; + git = true; + }; }; }; }; }; + + keymaps = [ + { + key = "<leader>nt"; + action = "<cmd>NvimTreeToggle<cr>"; + mode = [ + "n" + "i" + ]; + options.desc = "Toggle file explorer"; + } + ]; }; } diff --git a/modules/development/nixvim/plugins/telescope.nix b/modules/development/nixvim/plugins/telescope.nix index 8f06ec9..505a3eb 100644 --- a/modules/development/nixvim/plugins/telescope.nix +++ b/modules/development/nixvim/plugins/telescope.nix @@ -56,16 +56,6 @@ options.desc = "Document symbols"; }; - # Git - "<leader>gc" = { - action = "git_commits"; - options.desc = "Git commits"; - }; - "<leader>gb" = { - action = "git_branches"; - options.desc = "Git branches"; - }; - # Misc "<leader>fh" = { action = "help_tags"; diff --git a/modules/development/nixvim/plugins/which-key.nix b/modules/development/nixvim/plugins/which-key.nix index 81ecd14..3a0c0ef 100644 --- a/modules/development/nixvim/plugins/which-key.nix +++ b/modules/development/nixvim/plugins/which-key.nix @@ -9,12 +9,39 @@ registers = true; spelling = { enabled = true; - suggestions = 20; }; }; win = { border = "single"; }; + + # Group descriptions for leader prefixes + spec = [ + { + __unkeyed-1 = "<leader>g"; + group = "+Git"; + } + { + __unkeyed-1 = "<leader>f"; + group = "+Find"; + } + { + __unkeyed-1 = "<leader>d"; + group = "+Debug"; + } + { + __unkeyed-1 = "<leader>l"; + group = "+LSP"; + } + { + __unkeyed-1 = "<leader>c"; + group = "+Comment"; + } + { + __unkeyed-1 = "<leader>n"; + group = "+Explorer"; + } + ]; }; }; } |
