init.lua 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. local M = {}
  2. local Log = require "lvim.core.log"
  3. local utils = require "lvim.utils"
  4. local autocmds = require "lvim.core.autocmds"
  5. local function add_lsp_buffer_options(bufnr)
  6. for k, v in pairs(lvim.lsp.buffer_options) do
  7. vim.api.nvim_buf_set_option(bufnr, k, v)
  8. end
  9. end
  10. local function add_lsp_buffer_keybindings(bufnr)
  11. local mappings = {
  12. normal_mode = "n",
  13. insert_mode = "i",
  14. visual_mode = "v",
  15. }
  16. for mode_name, mode_char in pairs(mappings) do
  17. for key, remap in pairs(lvim.lsp.buffer_mappings[mode_name]) do
  18. local opts = { buffer = bufnr, desc = remap[2], noremap = true, silent = true }
  19. vim.keymap.set(mode_char, key, remap[1], opts)
  20. end
  21. end
  22. end
  23. function M.common_capabilities()
  24. local status_ok, cmp_nvim_lsp = pcall(require, "cmp_nvim_lsp")
  25. if status_ok then
  26. return cmp_nvim_lsp.default_capabilities()
  27. end
  28. local capabilities = vim.lsp.protocol.make_client_capabilities()
  29. capabilities.textDocument.completion.completionItem.snippetSupport = true
  30. capabilities.textDocument.completion.completionItem.resolveSupport = {
  31. properties = {
  32. "documentation",
  33. "detail",
  34. "additionalTextEdits",
  35. },
  36. }
  37. return capabilities
  38. end
  39. function M.common_on_exit(_, _)
  40. if lvim.lsp.document_highlight then
  41. autocmds.clear_augroup "lsp_document_highlight"
  42. end
  43. if lvim.lsp.code_lens_refresh then
  44. autocmds.clear_augroup "lsp_code_lens_refresh"
  45. end
  46. end
  47. function M.common_on_init(client, bufnr)
  48. if lvim.lsp.on_init_callback then
  49. lvim.lsp.on_init_callback(client, bufnr)
  50. Log:debug "Called lsp.on_init_callback"
  51. return
  52. end
  53. end
  54. function M.common_on_attach(client, bufnr)
  55. if lvim.lsp.on_attach_callback then
  56. lvim.lsp.on_attach_callback(client, bufnr)
  57. Log:debug "Called lsp.on_attach_callback"
  58. end
  59. local lu = require "lvim.lsp.utils"
  60. if lvim.lsp.document_highlight then
  61. lu.setup_document_highlight(client, bufnr)
  62. end
  63. if lvim.lsp.code_lens_refresh then
  64. lu.setup_codelens_refresh(client, bufnr)
  65. end
  66. add_lsp_buffer_keybindings(bufnr)
  67. add_lsp_buffer_options(bufnr)
  68. lu.setup_document_symbols(client, bufnr)
  69. end
  70. function M.get_common_opts()
  71. return {
  72. on_attach = M.common_on_attach,
  73. on_init = M.common_on_init,
  74. on_exit = M.common_on_exit,
  75. capabilities = M.common_capabilities(),
  76. }
  77. end
  78. function M.setup()
  79. Log:debug "Setting up LSP support"
  80. local lsp_status_ok, _ = pcall(require, "lspconfig")
  81. if not lsp_status_ok then
  82. return
  83. end
  84. if lvim.use_icons then
  85. for _, sign in ipairs(lvim.lsp.diagnostics.signs.values) do
  86. vim.fn.sign_define(sign.name, { texthl = sign.name, text = sign.text, numhl = sign.name })
  87. end
  88. end
  89. require("lvim.lsp.handlers").setup()
  90. if not utils.is_directory(lvim.lsp.templates_dir) then
  91. require("lvim.lsp.templates").generate_templates()
  92. end
  93. pcall(function()
  94. require("nlspsettings").setup(lvim.lsp.nlsp_settings.setup)
  95. end)
  96. pcall(function()
  97. require("mason-lspconfig").setup(lvim.lsp.installer.setup)
  98. local util = require "lspconfig.util"
  99. -- automatic_installation is handled by lsp-manager
  100. util.on_setup = nil
  101. end)
  102. require("lvim.lsp.null-ls").setup()
  103. autocmds.configure_format_on_save()
  104. end
  105. return M