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