You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

128 lines
3.9 KiB

  1. local lsp = require('lsp-zero')
  2. local luasnip = require("luasnip")
  3. lsp.preset('recommended')
  4. lsp.ensure_installed({
  5. 'lua_ls',
  6. 'tsserver',
  7. 'eslint',
  8. 'gopls',
  9. 'intelephense',
  10. 'jsonls',
  11. 'volar',
  12. })
  13. local has_words_before = function()
  14. local line, col = unpack(vim.api.nvim_win_get_cursor(0))
  15. return col ~= 0 and vim.api.nvim_buf_get_lines(0, line - 1, line, true)[1]:sub(col, col):match "%s" == nil
  16. end
  17. local cmp = require('cmp')
  18. -- Use buffer source for `/`
  19. cmp.setup.cmdline("/", {
  20. enabled = false
  21. })
  22. -- Use cmdline & path source for ':' (if you enabled `native_menu`, this won't work anymore).
  23. cmp.setup.cmdline(':', {
  24. enabled = false,
  25. })
  26. -- local cmp_select = {behavior = cmp.SelectBehavior.Select}
  27. local cmp_mappings = lsp.defaults.cmp_mappings({
  28. ["<C-k>"] = cmp.mapping(cmp.mapping.select_prev_item(), { "i", "c" }),
  29. ["<C-j>"] = cmp.mapping(cmp.mapping.select_next_item(), { "i", "c" }),
  30. ["<C-b>"] = cmp.mapping(cmp.mapping.scroll_docs(-4), { "i", "c" }),
  31. ["<C-f>"] = cmp.mapping(cmp.mapping.scroll_docs(4), { "i", "c" }),
  32. ["<C-Space>"] = cmp.mapping(cmp.mapping.complete(), { "i", "c" }),
  33. ["<C-e>"] = cmp.mapping { i = cmp.mapping.close(), c = cmp.mapping.close() },
  34. ["<CR>"] = cmp.mapping {
  35. i = cmp.mapping.confirm { behavior = cmp.ConfirmBehavior.Replace, select = false },
  36. c = function(fallback)
  37. if cmp.visible() then
  38. cmp.mapping.confirm { behavior = cmp.ConfirmBehavior.Replace, select = false }
  39. else
  40. fallback()
  41. end
  42. end,
  43. },
  44. ["<Tab>"] = cmp.mapping(
  45. function(fallback)
  46. if cmp.visible() then
  47. cmp.select_next_item()
  48. elseif luasnip.expand_or_jumpable() then
  49. luasnip.expand_or_jump()
  50. elseif has_words_before() then
  51. cmp.complete()
  52. else
  53. fallback()
  54. end
  55. end,
  56. {
  57. "i",
  58. "s",
  59. }),
  60. ["<S-Tab>"] = cmp.mapping(function(fallback)
  61. if cmp.visible() then
  62. cmp.select_prev_item()
  63. elseif luasnip.jumpable(-1) then
  64. luasnip.jump(-1)
  65. else
  66. fallback()
  67. end
  68. end,
  69. {
  70. "i",
  71. "s",
  72. }),
  73. })
  74. lsp.setup_nvim_cmp({
  75. mapping = cmp_mappings,
  76. completion = {
  77. completeopt = "menu,menuone",
  78. },
  79. window = {
  80. completion = {
  81. side_padding = 1,
  82. winhighlight = "NormalFloat:NormalFloat,FloatBorder:TelescopeBorder",
  83. scrollbar = false,
  84. },
  85. documentation = {
  86. border = { "", "", "", "", "", "", "", "" },
  87. winhighlight = "NormalFloat:NormalFloat,FloatBorder:TelescopeBorder",
  88. },
  89. snippet = {
  90. expand = function(args)
  91. luasnip.lsp_expand(args.body)
  92. end,
  93. },
  94. },
  95. })
  96. lsp.on_attach(function(client, bufnr)
  97. local opts = {buffer = bufnr, remap = false}
  98. -- Key mappings
  99. vim.keymap.set("n", "K", vim.lsp.buf.hover, opts)
  100. vim.keymap.set("n", "[d", vim.diagnostic.goto_prev, opts)
  101. vim.keymap.set("n", "]d", vim.diagnostic.goto_next, opts)
  102. vim.keymap.set("n", "[e", function () vim.diagnostic.goto_prev({severity = vim.diagnostic.severity.ERROR}) end, opts)
  103. vim.keymap.set("n", "]e", function () vim.diagnostic.goto_next({severity = vim.diagnostic.severity.ERROR}) end, opts)
  104. vim.keymap.set("n", "gd", function() vim.lsp.buf.definition() end, opts)
  105. vim.keymap.set("n", "<leader>vws", function() vim.lsp.buf.workspace_symbol() end, opts)
  106. vim.keymap.set("n", "<leader>vd", function() vim.diagnostic.open_float() end, opts)
  107. vim.keymap.set("n", "<leader>rn", vim.lsp.buf.rename, opts)
  108. vim.keymap.set("n", "<leader>K", vim.lsp.buf.code_action, opts)
  109. vim.keymap.set("n", "<leader>of", vim.diagnostic.open_float, opts)
  110. vim.keymap.set("n", "gh", vim.lsp.buf.signature_help, opts)
  111. end)
  112. lsp.setup()