aboutsummaryrefslogtreecommitdiffhomepage
path: root/vim/lazy
diff options
context:
space:
mode:
authorHsieh Chin Fan <pham@topo.tw>2024-06-08 18:22:03 +0800
committerHsieh Chin Fan <pham@topo.tw>2024-06-08 18:24:46 +0800
commit8d8e5a626bcaf634fc56f6b7b28388f607f3b6c7 (patch)
tree5321e19a913ea40cea841ded1acd3aa2d6953801 /vim/lazy
parent024dd04edc16693545fb916150e6361f0626aad0 (diff)
Update
Diffstat (limited to 'vim/lazy')
-rw-r--r--vim/lazy/lazy.lua347
-rw-r--r--vim/lazy/plugin/telescope.lua102
-rw-r--r--vim/lazy/plugin/treesitter.lua242
3 files changed, 353 insertions, 338 deletions
diff --git a/vim/lazy/lazy.lua b/vim/lazy/lazy.lua
index efd545f..47a0380 100644
--- a/vim/lazy/lazy.lua
+++ b/vim/lazy/lazy.lua
@@ -386,353 +386,24 @@ vim.keymap.set('n', '<C-.>', ':HopChar1<CR>')
386 386
387-- [[ Highlight on yank ]] 387-- [[ Highlight on yank ]]
388-- See `:help vim.highlight.on_yank()` 388-- See `:help vim.highlight.on_yank()`
389local highlight_group = vim.api.nvim_create_augroup('YankHighlight', { clear = true }) 389-- local highlight_group = vim.api.nvim_create_augroup('YankHighlight', { clear = true })
390vim.api.nvim_create_autocmd('TextYankPost', { 390-- vim.api.nvim_create_autocmd('TextYankPost', {
391 callback = function() 391-- callback = function()
392 vim.highlight.on_yank() 392-- vim.highlight.on_yank()
393 end, 393-- end,
394 group = highlight_group, 394-- group = highlight_group,
395 pattern = '*', 395-- pattern = '*',
396}) 396-- })
397 397
398-- [[ Configure Comment.nvim ]] 398-- [[ Configure Comment.nvim ]]
399vim.cmd('nmap <C-/> V<C-/>') 399vim.cmd('nmap <C-/> V<C-/>')
400 400
401-- [[ Configure Comment.nvim ]] 401-- [[ Configure Obsidian.nvim ]]
402vim.keymap.set('n', "<leader>oo", ':Obsidian') 402vim.keymap.set('n', "<leader>oo", ':Obsidian')
403vim.keymap.set('n', "<leader>ot", ':ObsidianTags<CR>') 403vim.keymap.set('n', "<leader>ot", ':ObsidianTags<CR>')
404vim.keymap.set('n', "<leader>os", ':ObsidianSearch<CR>') 404vim.keymap.set('n', "<leader>os", ':ObsidianSearch<CR>')
405vim.keymap.set('n', "<leader>oq", ':ObsidianQuickSwitch<CR>') 405vim.keymap.set('n', "<leader>oq", ':ObsidianQuickSwitch<CR>')
406vim.keymap.set('v', "<leader>on", ':ObsidianLinkNew<CR>') 406vim.keymap.set('v', "<leader>on", ':ObsidianLinkNew<CR>')
407 407
408-- [[ Configure Telescope ]]
409-- See `:help telescope` and `:help telescope.setup()`
410require('telescope').setup {
411 defaults = {
412 mappings = {
413 i = {
414 ["<c-j>"] = "move_selection_next",
415 ["<c-k>"] = "move_selection_previous",
416 ["<C-w>"] = require("telescope.actions.layout").toggle_preview,
417 },
418 },
419 layout_config = {
420 vertical = { height = 0.8 },
421 -- other layout configuration here
422 preview_cutoff = 0,
423 },
424 },
425 pickers = {
426 buffers = {
427 show_all_buffers = true,
428 sort_lastused = true,
429 theme = "dropdown",
430 previewer = false,
431 mappings = {
432 i = {
433 ["<c-d>"] = "delete_buffer",
434 },
435 n = {
436 ["<c-d>"] = "delete_buffer",
437 }
438 }
439 },
440
441 },
442 extensions = {
443 aerial = {
444 -- Display symbols as <root>.<parent>.<symbol>
445 show_nesting = {
446 ["_"] = false, -- This key will be the default
447 json = true, -- You can set the option for specific filetypes
448 yaml = true,
449 },
450 },
451 },
452}
453
454-- Enable telescope fzf native, if installed
455pcall(require('telescope').load_extension, 'fzf')
456
457-- See `:help telescope.builtin`
458vim.keymap.set('n', '<leader>f', require('telescope.builtin').oldfiles, { desc = '[F] Find recently opened files' })
459vim.keymap.set('n', '<leader>b', require('telescope.builtin').buffers, { desc = '[B] Find existing buffers' })
460vim.keymap.set('n', '<leader>st', require('telescope.builtin').builtin, { desc = '[S]earch [T]elescope for builtin' })
461vim.keymap.set('n', '<leader>gf', require('telescope.builtin').git_files, { desc = 'Search [G]it [F]iles' })
462vim.keymap.set('n', '<leader>sf', require('telescope.builtin').find_files, { desc = '[S]earch [F]iles' })
463vim.keymap.set('n', '<leader>sh', require('telescope.builtin').help_tags, { desc = '[S]earch [H]elp' })
464vim.keymap.set('n', '<leader>sw', require('telescope.builtin').grep_string, { desc = '[S]earch current [W]ord' })
465vim.keymap.set('n', '<leader>sg', require('telescope.builtin').live_grep, { desc = '[S]earch by [G]rep' })
466vim.keymap.set('n', '<leader>sd', require('telescope.builtin').diagnostics, { desc = '[S]earch [D]iagnostics' })
467vim.keymap.set('n', '<leader>sk', require('telescope.builtin').keymaps, { desc = '[S]earch [K]eymaps' })
468vim.keymap.set('n', '<leader>sh', require('telescope.builtin').help_tags, { desc = '[S]earch [H]elp' })
469vim.keymap.set('n', '<leader>/', function()
470 -- You can pass additional configuration to telescope to change theme, layout, etc.
471 require('telescope.builtin').current_buffer_fuzzy_find(require('telescope.themes').get_dropdown {
472 --winblend = 10,
473 previewer = false,
474 })
475end, { desc = '[/] Fuzzily search in current buffer' })
476vim.keymap.set('n', '<leader>sn', function()
477 require('telescope.builtin').find_files { cwd = vim.fn.stdpath 'config' }
478end, { desc = '[S]earch [N]eovim files' })
479-- Get snippets from ~/helper/snippets
480vim.keymap.set('n', '<leader>ss', function()
481 local current_filetype = vim.bo.filetype
482 local cwd = '/home/pham/helper/snippets/' .. current_filetype
483 require('telescope.builtin').find_files {
484 prompt_title = 'Select a snippet for ' .. current_filetype,
485 cwd = cwd,
486 attach_mappings = function(prompt_bufnr, map)
487 local insert_selected_snippet = function()
488 local file = require('telescope.actions.state').get_selected_entry()[1]
489 local snippet_content = vim.fn.readfile(cwd .. "/" .. file)
490 require('telescope.actions').close(prompt_bufnr)
491 vim.api.nvim_command('normal! h')
492 vim.api.nvim_put(snippet_content, '', false, true)
493 end
494
495 map('i', '<CR>', insert_selected_snippet)
496 map('n', '<CR>', insert_selected_snippet)
497
498 return true
499 end,
500 }
501end, { desc = '[S]earch [S]nippets' })
502
503-- [[ Configure Treesitter ]]
504-- See `:help nvim-treesitter`
505require('nvim-treesitter.configs').setup {
506 -- Add languages to be installed here that you want installed for treesitter
507 ensure_installed = { 'bash', 'c', 'html', 'css', 'lua', 'python', 'rust', 'tsx', 'typescript', 'vimdoc', 'vim' },
508
509 -- Autoinstall languages that are not installed. Defaults to false (but you can change for yourself!)
510 auto_install = false,
511
512 -- highlight = { enable = true },
513 incremental_selection = {
514 enable = true,
515 keymaps = {
516 init_selection = '<c-space>',
517 node_incremental = '<c-space>',
518 scope_incremental = '<c-s>',
519 node_decremental = '<M-space>',
520 },
521 },
522 textobjects = {
523 select = {
524 enable = true,
525 lookahead = true, -- Automatically jump forward to textobj, similar to targets.vim
526 keymaps = {
527 -- You can use the capture groups defined in textobjects.scm
528 ['aa'] = '@parameter.outer',
529 ['ia'] = '@parameter.inner',
530 ['if'] = '@function.inner',
531 ['af'] = '@function.outer',
532 ['ac'] = '@class.outer',
533 ['ic'] = '@class.inner',
534 },
535 },
536 move = {
537 enable = true,
538 set_jumps = true, -- whether to set jumps in the jumplist
539 goto_next_start = {
540 [']m'] = '@function.outer',
541 [']]'] = '@class.outer',
542 },
543 goto_next_end = {
544 [']M'] = '@function.outer',
545 [']['] = '@class.outer',
546 },
547 goto_previous_start = {
548 ['[m'] = '@function.outer',
549 ['[['] = '@class.outer',
550 },
551 goto_previous_end = {
552 ['[M'] = '@function.outer',
553 ['[]'] = '@class.outer',
554 },
555 },
556 swap = {
557 enable = true,
558 swap_next = {
559 ['<leader>a'] = '@parameter.inner',
560 },
561 swap_previous = {
562 ['<leader>A'] = '@parameter.inner',
563 },
564 },
565 },
566}
567
568-- Diagnostic keymaps
569vim.keymap.set('n', '[d', vim.diagnostic.goto_prev, { desc = 'Go to previous diagnostic message' })
570vim.keymap.set('n', ']d', vim.diagnostic.goto_next, { desc = 'Go to next diagnostic message' })
571vim.keymap.set('n', '<leader>E', vim.diagnostic.open_float, { desc = 'Open floating diagnostic message' })
572vim.keymap.set('n', '<leader>Q', vim.diagnostic.setloclist, { desc = 'Open diagnostics list' })
573
574-- [[ Configure Aerial ]]
575require("aerial").setup({
576 -- optionally use on_attach to set keymaps when aerial has attached to a buffer
577 on_attach = function(bufnr)
578 -- Jump forwards/backwards with '{' and '}'
579 vim.keymap.set("n", "{", "<cmd>AerialPrev<CR>", { buffer = bufnr })
580 vim.keymap.set("n", "}", "<cmd>AerialNext<CR>", { buffer = bufnr })
581 end,
582})
583vim.keymap.set("n", "<leader><leader>a", "<cmd>Telescope aerial<CR>")
584vim.keymap.set("n", "<leader><leader>A", "<cmd>AerialToggle!left<CR>")
585
586-- [[ Configure LSP ]]
587-- This function gets run when an LSP connects to a particular buffer.
588local on_attach = function(_, bufnr)
589 -- NOTE: Remember that lua is a real programming language, and as such it is possible
590 -- to define small helper and utility functions so you don't have to repeat yourself
591 -- many times.
592 --
593 -- In this case, we create a function that lets us more easily define mappings specific
594 -- for LSP related items. It sets the mode, buffer and description for us each time.
595 local nmap = function(keys, func, desc)
596 if desc then
597 desc = 'LSP: ' .. desc
598 end
599
600 vim.keymap.set('n', keys, func, { buffer = bufnr, desc = desc })
601 end
602
603 nmap('<leader>rn', vim.lsp.buf.rename, '[R]e[n]ame')
604 nmap('<leader>ca', vim.lsp.buf.code_action, '[C]ode [A]ction')
605
606 nmap('gd', vim.lsp.buf.definition, '[G]oto [D]efinition')
607 nmap('gr', require('telescope.builtin').lsp_references, '[G]oto [R]eferences')
608 nmap('gI', vim.lsp.buf.implementation, '[G]oto [I]mplementation')
609 nmap('<leader>D', vim.lsp.buf.type_definition, 'Type [D]efinition')
610 nmap('<leader>ds', require('telescope.builtin').lsp_document_symbols, '[D]ocument [S]ymbols')
611 nmap('<leader><leader>ws', require('telescope.builtin').lsp_dynamic_workspace_symbols, '[W]orkspace [S]ymbols')
612
613 -- See `:help K` for why this keymap
614 nmap('K', vim.lsp.buf.hover, 'Hover Documentation')
615 -- nmap('<C-k>', vim.lsp.buf.signature_help, 'Signature Documentation')
616
617 -- Lesser used LSP functionality
618 nmap('gD', vim.lsp.buf.declaration, '[G]oto [D]eclaration')
619 nmap('<leader><leader>wa', vim.lsp.buf.add_workspace_folder, '[W]orkspace [A]dd Folder')
620 nmap('<leader><leader>wr', vim.lsp.buf.remove_workspace_folder, '[W]orkspace [R]emove Folder')
621 nmap('<leader><leader>wl', function()
622 print(vim.inspect(vim.lsp.buf.list_workspace_folders()))
623 end, '[W]orkspace [L]ist Folders')
624
625 -- Create a command `:Format` local to the LSP buffer
626 vim.api.nvim_buf_create_user_command(bufnr, 'Format', function(_)
627 vim.lsp.buf.format()
628 end, { desc = 'Format current buffer with LSP' })
629 nmap('<leader>F', ':Format<CR>', 'Format code')
630end
631
632-- Enable the following language servers
633-- Feel free to add/remove any LSPs that you want here. They will automatically be installed.
634--
635-- Add any additional override configuration in the following tables. They will be passed to
636-- the `settings` field of the server config. You must look up that documentation yourself.
637--
638-- If you want to override the default filetypes that your language server will attach to you can
639-- define the property 'filetypes' to the map in question.
640local servers = {
641 -- clangd = {},
642 -- gopls = {},
643 -- pyright = {},
644 -- rust_analyzer = {},
645 -- tsserver = {},
646 -- html = { filetypes = { 'html', 'twig', 'hbs'} },
647 tsserver = {},
648 beancount = {
649 filetypes = { "beancount", "bean" },
650 },
651
652 lua_ls = {
653 Lua = {
654 workspace = { checkThirdParty = false },
655 telemetry = { enable = false },
656 diagnostics = {
657 -- Get the language server to recognize the `vim` global
658 globals = { 'vim' },
659 },
660 },
661 },
662}
663
664-- Setup neovim lua configuration
665require('neodev').setup()
666
667-- nvim-cmp supports additional completion capabilities, so broadcast that to servers
668local capabilities = vim.lsp.protocol.make_client_capabilities()
669capabilities = require('cmp_nvim_lsp').default_capabilities(capabilities)
670
671-- Ensure the servers above are installed
672local mason_lspconfig = require 'mason-lspconfig'
673
674mason_lspconfig.setup {
675 ensure_installed = vim.tbl_keys(servers),
676}
677
678mason_lspconfig.setup_handlers {
679 function(server_name)
680 require('lspconfig')[server_name].setup {
681 capabilities = capabilities,
682 on_attach = on_attach,
683 settings = servers[server_name],
684 filetypes = (servers[server_name] or {}).filetypes,
685 }
686 end
687}
688
689-- [[ Configure nvim-cmp ]]
690-- See `:help cmp`
691local cmp = require 'cmp'
692local luasnip = require 'luasnip'
693require('luasnip.loaders.from_vscode').lazy_load()
694luasnip.config.setup {}
695
696cmp.setup {
697 snippet = {
698 expand = function(args)
699 luasnip.lsp_expand(args.body)
700 end,
701 },
702 mapping = cmp.mapping.preset.insert {
703 ['<C-n>'] = cmp.mapping.select_next_item(),
704 ['<C-p>'] = cmp.mapping.select_prev_item(),
705 ['<C-d>'] = cmp.mapping.scroll_docs(-4),
706 ['<C-u>'] = cmp.mapping.scroll_docs(4),
707 ['<C-Space>'] = cmp.mapping.complete {},
708 ['<CR>'] = cmp.mapping.confirm {
709 behavior = cmp.ConfirmBehavior.Replace,
710 select = false,
711 },
712 ['<Tab>'] = cmp.mapping(function(fallback)
713 if cmp.visible() then
714 cmp.select_next_item()
715 elseif luasnip.expand_or_locally_jumpable() then
716 luasnip.expand_or_jump()
717 else
718 fallback()
719 end
720 end, { 'i', 's' }),
721 ['<S-Tab>'] = cmp.mapping(function(fallback)
722 if cmp.visible() then
723 cmp.select_prev_item()
724 elseif luasnip.locally_jumpable(-1) then
725 luasnip.jump(-1)
726 else
727 fallback()
728 end
729 end, { 'i', 's' }),
730 },
731 sources = {
732 { name = 'nvim_lsp' },
733 { name = 'luasnip' },
734 },
735}
736
737-- The line beneath this is called `modeline`. See `:help modeline` 408-- The line beneath this is called `modeline`. See `:help modeline`
738-- vim: ts=2 sts=2 sw=2 et 409-- vim: ts=2 sts=2 sw=2 et
diff --git a/vim/lazy/plugin/telescope.lua b/vim/lazy/plugin/telescope.lua
new file mode 100644
index 0000000..f8947a2
--- /dev/null
+++ b/vim/lazy/plugin/telescope.lua
@@ -0,0 +1,102 @@
1-- See `:help telescope` and `:help telescope.setup()`
2
3require('telescope').setup {
4 defaults = {
5 mappings = {
6 i = {
7 ["<c-j>"] = "move_selection_next",
8 ["<c-k>"] = "move_selection_previous",
9 ["<C-w>"] = require("telescope.actions.layout").toggle_preview,
10 },
11 },
12 layout_config = {
13 vertical = { height = 0.8 },
14 -- other layout configuration here
15 preview_cutoff = 0,
16 },
17 },
18 pickers = {
19 buffers = {
20 show_all_buffers = true,
21 sort_lastused = true,
22 theme = "dropdown",
23 previewer = false,
24 mappings = {
25 i = {
26 ["<c-d>"] = "delete_buffer",
27 },
28 n = {
29 ["<c-d>"] = "delete_buffer",
30 }
31 }
32 },
33
34 },
35 extensions = {
36 aerial = {
37 -- Display symbols as <root>.<parent>.<symbol>
38 show_nesting = {
39 ["_"] = false, -- This key will be the default
40 json = true, -- You can set the option for specific filetypes
41 yaml = true,
42 },
43 },
44 },
45}
46
47-- Enable telescope fzf native, if installed
48pcall(require('telescope').load_extension, 'fzf')
49
50-- See `:help telescope.builtin`
51vim.keymap.set('n', '<leader>f', require('telescope.builtin').oldfiles, { desc = '[F] Find recently opened files' })
52vim.keymap.set('n', '<leader>b', require('telescope.builtin').buffers, { desc = '[B] Find existing buffers' })
53vim.keymap.set('n', '<leader>st', require('telescope.builtin').builtin, { desc = '[S]earch [T]elescope for builtin' })
54vim.keymap.set('n', '<leader>gf', require('telescope.builtin').git_files, { desc = 'Search [G]it [F]iles' })
55vim.keymap.set('n', '<leader>sf', require('telescope.builtin').find_files, { desc = '[S]earch [F]iles' })
56vim.keymap.set('n', '<leader>sh', require('telescope.builtin').help_tags, { desc = '[S]earch [H]elp' })
57vim.keymap.set('n', '<leader>sw', require('telescope.builtin').grep_string, { desc = '[S]earch current [W]ord' })
58vim.keymap.set('n', '<leader>sg', require('telescope.builtin').live_grep, { desc = '[S]earch by [G]rep' })
59vim.keymap.set('n', '<leader>sd', require('telescope.builtin').diagnostics, { desc = '[S]earch [D]iagnostics' })
60vim.keymap.set('n', '<leader>sk', require('telescope.builtin').keymaps, { desc = '[S]earch [K]eymaps' })
61vim.keymap.set('n', '<leader>sh', require('telescope.builtin').help_tags, { desc = '[S]earch [H]elp' })
62
63-- For grep in current buffer
64vim.keymap.set('n', '<leader>/', function()
65 -- You can pass additional configuration to telescope to change theme, layout, etc.
66 require('telescope.builtin').current_buffer_fuzzy_find(require('telescope.themes').get_dropdown {
67 --winblend = 10,
68 previewer = false,
69 })
70end, { desc = '[/] Fuzzily search in current buffer' })
71
72-- For neovim config files
73vim.keymap.set('n', '<leader>sn', function()
74 require('telescope.builtin').find_files {
75 cwd = vim.fn.stdpath 'config',
76 follow = true
77 }
78end, { desc = '[S]earch [N]eovim files' })
79
80-- Get snippets from ~/helper/snippets
81vim.keymap.set('n', '<leader>ss', function()
82 local current_filetype = vim.bo.filetype
83 local cwd = '/home/pham/helper/snippets/' .. current_filetype
84 require('telescope.builtin').find_files {
85 prompt_title = 'Select a snippet for ' .. current_filetype,
86 cwd = cwd,
87 attach_mappings = function(prompt_bufnr, map)
88 local insert_selected_snippet = function()
89 local file = require('telescope.actions.state').get_selected_entry()[1]
90 local snippet_content = vim.fn.readfile(cwd .. "/" .. file)
91 require('telescope.actions').close(prompt_bufnr)
92 vim.api.nvim_command('normal! h')
93 vim.api.nvim_put(snippet_content, '', false, true)
94 end
95
96 map('i', '<CR>', insert_selected_snippet)
97 map('n', '<CR>', insert_selected_snippet)
98
99 return true
100 end,
101 }
102end, { desc = '[S]earch [S]nippets' })
diff --git a/vim/lazy/plugin/treesitter.lua b/vim/lazy/plugin/treesitter.lua
new file mode 100644
index 0000000..dc0dafc
--- /dev/null
+++ b/vim/lazy/plugin/treesitter.lua
@@ -0,0 +1,242 @@
1-- See `:help nvim-treesitter`
2require('nvim-treesitter.configs').setup {
3 -- Add languages to be installed here that you want installed for treesitter
4 ensure_installed = { 'bash', 'c', 'html', 'css', 'lua', 'python', 'rust', 'tsx', 'typescript', 'vimdoc', 'vim' },
5
6 -- Autoinstall languages that are not installed. Defaults to false (but you can change for yourself!)
7 auto_install = false,
8
9 -- highlight = { enable = true },
10 incremental_selection = {
11 enable = true,
12 keymaps = {
13 init_selection = '<c-space>',
14 node_incremental = '<c-space>',
15 scope_incremental = '<c-s>',
16 node_decremental = '<M-space>',
17 },
18 },
19 textobjects = {
20 select = {
21 enable = true,
22 lookahead = true, -- Automatically jump forward to textobj, similar to targets.vim
23 keymaps = {
24 -- You can use the capture groups defined in textobjects.scm
25 ['aa'] = '@parameter.outer',
26 ['ia'] = '@parameter.inner',
27 ['if'] = '@function.inner',
28 ['af'] = '@function.outer',
29 ['ac'] = '@class.outer',
30 ['ic'] = '@class.inner',
31 },
32 },
33 move = {
34 enable = true,
35 set_jumps = true, -- whether to set jumps in the jumplist
36 goto_next_start = {
37 [']m'] = '@function.outer',
38 [']]'] = '@class.outer',
39 },
40 goto_next_end = {
41 [']M'] = '@function.outer',
42 [']['] = '@class.outer',
43 },
44 goto_previous_start = {
45 ['[m'] = '@function.outer',
46 ['[['] = '@class.outer',
47 },
48 goto_previous_end = {
49 ['[M'] = '@function.outer',
50 ['[]'] = '@class.outer',
51 },
52 },
53 swap = {
54 enable = true,
55 swap_next = {
56 ['<leader>a'] = '@parameter.inner',
57 },
58 swap_previous = {
59 ['<leader>A'] = '@parameter.inner',
60 },
61 },
62 },
63}
64
65-- Diagnostic keymaps
66vim.keymap.set('n', '[d', vim.diagnostic.goto_prev, { desc = 'Go to previous diagnostic message' })
67vim.keymap.set('n', ']d', vim.diagnostic.goto_next, { desc = 'Go to next diagnostic message' })
68vim.keymap.set('n', '<leader>E', vim.diagnostic.open_float, { desc = 'Open floating diagnostic message' })
69vim.keymap.set('n', '<leader>Q', vim.diagnostic.setloclist, { desc = 'Open diagnostics list' })
70
71
72-- [[ Configure Aerial ]]
73require("aerial").setup({
74 -- optionally use on_attach to set keymaps when aerial has attached to a buffer
75 on_attach = function(bufnr)
76 -- Jump forwards/backwards with '{' and '}'
77 vim.keymap.set("n", "{", "<cmd>AerialPrev<CR>", { buffer = bufnr })
78 vim.keymap.set("n", "}", "<cmd>AerialNext<CR>", { buffer = bufnr })
79 end,
80})
81vim.keymap.set("n", "<leader><leader>a", "<cmd>Telescope aerial<CR>")
82vim.keymap.set("n", "<leader><leader>A", "<cmd>AerialToggle!left<CR>")
83-- [[ Configure Aerial ]]
84require("aerial").setup({
85 -- optionally use on_attach to set keymaps when aerial has attached to a buffer
86 on_attach = function(bufnr)
87 -- Jump forwards/backwards with '{' and '}'
88 vim.keymap.set("n", "{", "<cmd>AerialPrev<CR>", { buffer = bufnr })
89 vim.keymap.set("n", "}", "<cmd>AerialNext<CR>", { buffer = bufnr })
90 end,
91})
92vim.keymap.set("n", "<leader><leader>a", "<cmd>Telescope aerial<CR>")
93vim.keymap.set("n", "<leader><leader>A", "<cmd>AerialToggle!left<CR>")
94
95
96-- [[ Configure LSP ]]
97-- This function gets run when an LSP connects to a particular buffer.
98local on_attach = function(_, bufnr)
99 -- NOTE: Remember that lua is a real programming language, and as such it is possible
100 -- to define small helper and utility functions so you don't have to repeat yourself
101 -- many times.
102 --
103 -- In this case, we create a function that lets us more easily define mappings specific
104 -- for LSP related items. It sets the mode, buffer and description for us each time.
105 local nmap = function(keys, func, desc)
106 if desc then
107 desc = 'LSP: ' .. desc
108 end
109
110 vim.keymap.set('n', keys, func, { buffer = bufnr, desc = desc })
111 end
112
113 nmap('<leader>rn', vim.lsp.buf.rename, '[R]e[n]ame')
114 nmap('<leader>ca', vim.lsp.buf.code_action, '[C]ode [A]ction')
115
116 nmap('gd', vim.lsp.buf.definition, '[G]oto [D]efinition')
117 nmap('gr', require('telescope.builtin').lsp_references, '[G]oto [R]eferences')
118 nmap('gI', vim.lsp.buf.implementation, '[G]oto [I]mplementation')
119 nmap('<leader>D', vim.lsp.buf.type_definition, 'Type [D]efinition')
120 nmap('<leader>ds', require('telescope.builtin').lsp_document_symbols, '[D]ocument [S]ymbols')
121 nmap('<leader><leader>ws', require('telescope.builtin').lsp_dynamic_workspace_symbols, '[W]orkspace [S]ymbols')
122
123 -- See `:help K` for why this keymap
124 nmap('K', vim.lsp.buf.hover, 'Hover Documentation')
125 -- nmap('<C-k>', vim.lsp.buf.signature_help, 'Signature Documentation')
126
127 -- Lesser used LSP functionality
128 nmap('gD', vim.lsp.buf.declaration, '[G]oto [D]eclaration')
129 nmap('<leader><leader>wa', vim.lsp.buf.add_workspace_folder, '[W]orkspace [A]dd Folder')
130 nmap('<leader><leader>wr', vim.lsp.buf.remove_workspace_folder, '[W]orkspace [R]emove Folder')
131 nmap('<leader><leader>wl', function()
132 print(vim.inspect(vim.lsp.buf.list_workspace_folders()))
133 end, '[W]orkspace [L]ist Folders')
134
135 -- Create a command `:Format` local to the LSP buffer
136 vim.api.nvim_buf_create_user_command(bufnr, 'Format', function(_)
137 vim.lsp.buf.format()
138 end, { desc = 'Format current buffer with LSP' })
139 nmap('<leader>F', ':Format<CR>', 'Format code')
140end
141
142-- Enable the following language servers
143-- Feel free to add/remove any LSPs that you want here. They will automatically be installed.
144--
145-- Add any additional override configuration in the following tables. They will be passed to
146-- the `settings` field of the server config. You must look up that documentation yourself.
147--
148-- If you want to override the default filetypes that your language server will attach to you can
149-- define the property 'filetypes' to the map in question.
150local servers = {
151 -- clangd = {},
152 -- gopls = {},
153 -- pyright = {},
154 -- rust_analyzer = {},
155 -- tsserver = {},
156 -- html = { filetypes = { 'html', 'twig', 'hbs'} },
157 tsserver = {},
158 beancount = {
159 filetypes = { "beancount", "bean" },
160 },
161
162 lua_ls = {
163 Lua = {
164 workspace = { checkThirdParty = false },
165 telemetry = { enable = false },
166 diagnostics = {
167 -- Get the language server to recognize the `vim` global
168 globals = { 'vim' },
169 },
170 },
171 },
172}
173
174-- nvim-cmp supports additional completion capabilities, so broadcast that to servers
175local capabilities = vim.lsp.protocol.make_client_capabilities()
176capabilities = require('cmp_nvim_lsp').default_capabilities(capabilities)
177
178-- Ensure the servers above are installed
179local mason_lspconfig = require 'mason-lspconfig'
180
181mason_lspconfig.setup {
182 ensure_installed = vim.tbl_keys(servers),
183}
184
185mason_lspconfig.setup_handlers {
186 function(server_name)
187 require('lspconfig')[server_name].setup {
188 capabilities = capabilities,
189 on_attach = on_attach,
190 settings = servers[server_name],
191 filetypes = (servers[server_name] or {}).filetypes,
192 }
193 end
194}
195
196-- [[ Configure nvim-cmp ]]
197-- See `:help cmp`
198local cmp = require 'cmp'
199local luasnip = require 'luasnip'
200require('luasnip.loaders.from_vscode').lazy_load()
201luasnip.config.setup {}
202
203cmp.setup {
204 snippet = {
205 expand = function(args)
206 luasnip.lsp_expand(args.body)
207 end,
208 },
209 mapping = cmp.mapping.preset.insert {
210 ['<C-n>'] = cmp.mapping.select_next_item(),
211 ['<C-p>'] = cmp.mapping.select_prev_item(),
212 ['<C-d>'] = cmp.mapping.scroll_docs(-4),
213 ['<C-u>'] = cmp.mapping.scroll_docs(4),
214 ['<C-Space>'] = cmp.mapping.complete {},
215 ['<CR>'] = cmp.mapping.confirm {
216 behavior = cmp.ConfirmBehavior.Replace,
217 select = false,
218 },
219 ['<Tab>'] = cmp.mapping(function(fallback)
220 if cmp.visible() then
221 cmp.select_next_item()
222 elseif luasnip.expand_or_locally_jumpable() then
223 luasnip.expand_or_jump()
224 else
225 fallback()
226 end
227 end, { 'i', 's' }),
228 ['<S-Tab>'] = cmp.mapping(function(fallback)
229 if cmp.visible() then
230 cmp.select_prev_item()
231 elseif luasnip.locally_jumpable(-1) then
232 luasnip.jump(-1)
233 else
234 fallback()
235 end
236 end, { 'i', 's' }),
237 },
238 sources = {
239 { name = 'nvim_lsp' },
240 { name = 'luasnip' },
241 },
242}