btw i use nix
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}