1{ 2 pkgs, 3 config, 4 lib, 5 ... 6}: 7 8let 9 ltex-ls-nvim = pkgs.vimUtils.buildVimPlugin { 10 pname = "ltex-ls.nvim"; 11 version = "2.6.0"; 12 src = pkgs.fetchFromGitHub { 13 owner = "vigoux"; 14 repo = "ltex-ls.nvim"; 15 rev = "c8139ea6b7f3d71adcff121e16ee8726037ffebd"; 16 sha256 = "sha256-jY3ALr6h88xnWN2QdKe3R0vvRcSNhFWDW56b2NvnTCs="; 17 }; 18 }; 19 vim-ledger-2024-07-15 = pkgs.vimUtils.buildVimPlugin { 20 pname = "vim-ledger"; 21 version = "2024-07-15"; 22 src = pkgs.fetchFromGitHub { 23 owner = "ledger"; 24 repo = "vim-ledger"; 25 rev = "dbc683e24bd5338b8c12540227a58b2d247e097a"; 26 sha256 = "sha256-y2f0s0aAieXtj4mSnJdH7UxQlMqJqABNVPoGLlLc57A="; 27 }; 28 meta.homepage = "https://github.com/ledger/vim-ledger/"; 29 }; 30 calendar-nvim = pkgs.vimUtils.buildVimPlugin { 31 pname = "calendar-nvim"; 32 version = "2024-07-23"; 33 src = pkgs.fetchFromGitHub { 34 owner = "RyanGibb"; 35 repo = "calendar.nvim"; 36 rev = "e1ebd87eb953a91de5cba2c6eff04b127c6a894b"; 37 sha256 = "sha256-0iiW6dAvdS5UDbjJvXWKTDqvo/4yoFkYfDind+RuTmE="; 38 }; 39 meta.homepage = "https://github.com/RyanGibb/calendar.nvim/"; 40 }; 41 cfg = config.custom; 42in 43{ 44 config = { 45 xdg.configFile = { 46 "ftplugin/mail.vim".text = '' 47 setlocal tw=72 48 set formatoptions+=w 49 ''; 50 }; 51 programs.neovim = { 52 enable = true; 53 viAlias = true; 54 vimAlias = true; 55 extraPackages = with pkgs; [ ripgrep ]; 56 extraLuaConfig = builtins.readFile ./init.lua; 57 # undo transparent background 58 # + "colorscheme gruvbox"; 59 plugins = 60 with pkgs.vimPlugins; 61 [ 62 { 63 plugin = gruvbox-nvim; 64 type = "lua"; 65 # TODO is there a better place to put this? 66 runtime = 67 let 68 ml-style = '' 69 setlocal expandtab 70 setlocal shiftwidth=2 71 setlocal tabstop=2 72 setlocal softtabstop=2 73 ''; 74 in 75 { 76 "ftplugin/nix.vim".text = ml-style; 77 "ftplugin/ocaml.vim".text = ml-style; 78 "ftplugin/ledger.vim".text = '' 79 setlocal foldmethod=syntax 80 vnoremap <silent> <buffer> <Tab> :LedgerAlign<CR> 81 nnoremap <silent> <buffer> <Tab> :LedgerAlign<CR> 82 ''; 83 }; 84 } 85 86 { 87 plugin = telescope-nvim; 88 type = "lua"; 89 config = builtins.readFile ./telescope-nvim.lua; 90 } 91 telescope-fzf-native-nvim 92 telescope-undo-nvim 93 telescope-file-browser-nvim 94 95 { 96 plugin = gitsigns-nvim; 97 type = "lua"; 98 config = '' 99 require('gitsigns').setup{ 100 on_attach = function(bufnr) 101 local gitsigns = require('gitsigns') 102 103 local function map(mode, l, r, opts) 104 opts = opts or {} 105 opts.buffer = bufnr 106 vim.keymap.set(mode, l, r, opts) 107 end 108 109 map('n', ']c', function() 110 if vim.wo.diff then 111 vim.cmd.normal({']c', bang = true}) 112 else 113 gitsigns.nav_hunk('next') 114 end 115 end, { desc = 'Git next hunk' }) 116 117 map('n', '[c', function() 118 if vim.wo.diff then 119 vim.cmd.normal({'[c', bang = true}) 120 else 121 gitsigns.nav_hunk('prev') 122 end 123 end, { desc = 'Git prev hunk' }) 124 125 map('n', '<leader>gs', gitsigns.stage_hunk, { desc = 'Git stage hunk' }) 126 map('n', '<leader>gr', gitsigns.reset_hunk, { desc = 'Git reset hunk' }) 127 map('v', '<leader>gs', function() gitsigns.stage_hunk {vim.fn.line('.'), vim.fn.line('v')} end, { desc = 'Git stage hunk' }) 128 map('v', '<leader>gr', function() gitsigns.reset_hunk {vim.fn.line('.'), vim.fn.line('v')} end, { desc = 'Git reset hunk' }) 129 map('n', '<leader>gS', gitsigns.stage_buffer, { desc = 'Git stage buffer' }) 130 map('n', '<leader>gu', gitsigns.undo_stage_hunk, { desc = 'Git unstage hunk' }) 131 map('n', '<leader>gR', gitsigns.reset_buffer, { desc = 'Git reset buffer' }) 132 map('n', '<leader>gp', gitsigns.preview_hunk, { desc = 'Git preview hunk' }) 133 map('n', '<leader>gb', function() gitsigns.blame_line{full=true} end, { desc = 'Git blame' }) 134 map('n', '<leader>gtb', gitsigns.toggle_current_line_blame, { desc = 'Git toggle line blame' }) 135 map('n', '<leader>gd', gitsigns.diffthis, { desc = 'Git diff index' }) 136 map('n', '<leader>gD', function() gitsigns.diffthis('~') end, { desc = 'Git diff last' }) 137 map('n', '<leader>gtd', gitsigns.toggle_deleted, { desc = 'Git toggle deleted' }) 138 139 -- vih 140 map({'o', 'x'}, 'ih', ':<C-U>Git select_hunk<CR>', { desc = 'Gitsigns select hunk' }) 141 end 142 } 143 ''; 144 } 145 { 146 plugin = pkgs.overlay-unstable.vimPlugins.neogit; 147 type = "lua"; 148 config = '' 149 local neogit = require('neogit') 150 neogit.setup {} 151 ''; 152 } 153 154 plenary-nvim 155 pkgs.ripgrep 156 157 { 158 plugin = nvim-cmp; 159 type = "lua"; 160 config = builtins.readFile ./nvim-cmp.lua; 161 } 162 cmp-path 163 cmp-buffer 164 cmp-cmdline 165 { 166 plugin = cmp-dictionary; 167 type = "lua"; 168 config = '' 169 require("cmp_dictionary").setup({ 170 paths = { "${pkgs.scowl}/share/dict/words.txt" }, 171 exact_length = 2, 172 first_case_insensitive = true, 173 }) 174 ''; 175 } 176 177 { 178 plugin = luasnip; 179 type = "lua"; 180 config = builtins.readFile ./luasnip.lua; 181 } 182 cmp_luasnip 183 pkgs.overlay-unstable.vimPlugins.friendly-snippets 184 185 { 186 plugin = nvim-treesitter.withAllGrammars; 187 type = "lua"; 188 config = '' 189 require'nvim-treesitter.configs'.setup { 190 highlight = { 191 enable = true, 192 -- :h vimtex-faq-treesitter 193 disable = { "latex" }, 194 }, 195 } 196 vim.opt.foldmethod = "expr" 197 vim.opt.foldexpr = "v:lua.vim.treesitter.foldexpr()" 198 vim.opt.foldenable = false 199 ''; 200 } 201 { 202 plugin = nvim-treesitter-textobjects; 203 type = "lua"; 204 config = '' 205 require'nvim-treesitter.configs'.setup { 206 textobjects = { 207 select = { 208 enable = true, 209 lookahead = true, 210 keymaps = { 211 ["af"] = "@function.outer", 212 ["if"] = "@function.inner", 213 ["ac"] = "@conditional.outer", 214 ["ic"] = "@conditional.inner", 215 ["al"] = "@loop.outer", 216 ["il"] = "@loop.inner", 217 }, 218 include_surrounding_whitespace = true, 219 }, 220 swap = { 221 enable = true, 222 swap_next = { 223 ["<leader>a"] = "@parameter.inner", 224 }, 225 swap_previous = { 226 ["<leader>A"] = "@parameter.inner", 227 }, 228 }, 229 move = { 230 enable = true, 231 set_jumps = true, 232 goto_next_start = { 233 ["]m"] = "@function.outer", 234 }, 235 goto_next_end = { 236 ["]M"] = "@function.outer", 237 }, 238 goto_previous_start = { 239 ["[m"] = "@function.outer", 240 }, 241 goto_previous_end = { 242 ["[M"] = "@function.outer", 243 }, 244 }, 245 }, 246 } 247 -- could use some tweaking 248 vim.treesitter.query.set("ocaml", "textobjects", [[ 249 ((value_definition (let_binding)) @function.outer) 250 ((let_binding body: (_) @function.inner)) 251 ]]) 252 ''; 253 } 254 255 { 256 plugin = vimtex; 257 type = "lua"; 258 config = '' 259 vim.cmd("filetype plugin indent on") 260 vim.cmd("syntax enable") 261 vim.g.vimtex_quickfix_mode = 0 262 vim.g.vimtex_view_general_viewer = 'evince' 263 ''; 264 } 265 { 266 plugin = sved; 267 type = "lua"; 268 runtime = { 269 "ftplugin/tex.lua".text = '' 270 vim.keymap.set('n', '<localleader>v', ':call SVED_Sync()<CR>') 271 ''; 272 }; 273 } 274 cmp-omni 275 276 { 277 plugin = nvim-surround; 278 type = "lua"; 279 config = '' 280 require('nvim-surround').setup({}) 281 ''; 282 } 283 { 284 plugin = comment-nvim; 285 type = "lua"; 286 config = '' 287 require('Comment').setup() 288 ''; 289 } 290 { 291 plugin = undotree; 292 type = "lua"; 293 config = '' 294 vim.keymap.set('n', '<leader>u', vim.cmd.UndotreeToggle, { desc = 'Undotree toggle' }) 295 ''; 296 } 297 { 298 plugin = leap-nvim; 299 type = "lua"; 300 config = '' 301 vim.keymap.set({'n', 'x', 'o'}, 's', '<Plug>(leap-forward)', { desc = "Leap forward"} ) 302 vim.keymap.set({'n', 'x', 'o'}, 'S', '<Plug>(leap-backward)', { desc = "Leap backward"} ) 303 vim.keymap.set({'n', 'x', 'o'}, 'gs', '<Plug>(leap-from-window)', { desc = "Leap from window"} ) 304 ''; 305 } 306 { 307 plugin = pkgs.overlay-unstable.vimPlugins.which-key-nvim; 308 type = "lua"; 309 config = '' 310 local wk = require('which-key') 311 wk.setup({ 312 plugins = { 313 spelling = { 314 enabled = false 315 }, 316 }, 317 icons = { mappings = false }, 318 triggers = { 319 { "<leader>", mode = { "n", "v" } }, 320 { "<auto>", mode = "nixsotc" }, 321 }, 322 delay = 1000, 323 }) 324 wk.add({ 325 { "<leader>f", group = 'Find' }, 326 { "<leader>l", group = 'LSP' }, 327 { "<leader>;", group = 'DAP' }, 328 { "<leader>s", group = 'Session' }, 329 { "<leader>t", group = 'Tab' }, 330 { "<leader>h", group = 'Hunk' }, 331 { "<leader>x", group = 'Trouble' }, 332 { "<leader>g", group = 'Git' }, 333 { "<leader>i", group = 'Insert' }, 334 }) 335 ''; 336 } 337 338 { 339 plugin = vim-ledger-2024-07-15; 340 type = "lua"; 341 config = '' 342 vim.g.ledger_fuzzy_account_completion = true 343 vim.g.ledger_extra_options = '--pedantic' 344 vim.g.ledger_align_at = 50 345 vim.g.ledger_accounts_cmd = 'ledger accounts --add-budget' 346 347 vim.g.ledger_date_format = '%Y-%m-%d' 348 349 vim.cmd([[ 350 autocmd FileType ledger nnoremap <buffer> <leader>e :call ledger#entry()<CR> 351 ]]) 352 ''; 353 } 354 { 355 plugin = orgmode; 356 type = "lua"; 357 config = '' 358 -- In any orgmode buffer press g? for help 359 require('orgmode').setup({ 360 org_agenda_files = { '~/vault/*.org' }, 361 org_default_notes_file = '~/vault/todo.org', 362 org_capture_templates = { 363 t = { 364 description = 'Task', 365 template = '* TODO %?\n %u', 366 }, 367 }, 368 }) 369 ''; 370 } 371 372 { 373 plugin = nvim-lspconfig; 374 type = "lua"; 375 config = builtins.readFile ./lsp.lua; 376 runtime = { 377 "ftplugin/java.lua".text = '' 378 local project_name = vim.fn.fnamemodify(vim.fn.getcwd(), ':p:h:t') 379 local workspace_dir = '~/.cache/jdt/' .. project_name 380 require('jdtls').start_or_attach { 381 on_attach = On_attach, 382 capabilities = Capabilities, 383 cmd = { 'jdt-language-server', '-data', workspace_dir, }, 384 root_dir = vim.fs.dirname(vim.fs.find({'gradlew', '.git', 'mvnw'}, { upward = true })[1]), 385 } 386 ''; 387 }; 388 } 389 { 390 plugin = nvim-dap; 391 type = "lua"; 392 config = builtins.readFile ./dap.lua; 393 } 394 cmp-nvim-lsp 395 cmp-nvim-lsp-signature-help 396 ltex-ls-nvim 397 nvim-jdtls 398 ]; 399 }; 400 }; 401}