init.lua 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  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_keybindings(bufnr)
  6. local mappings = {
  7. normal_mode = "n",
  8. insert_mode = "i",
  9. visual_mode = "v",
  10. }
  11. if lvim.builtin.which_key.active then
  12. -- Remap using which_key
  13. local status_ok, wk = pcall(require, "which-key")
  14. if not status_ok then
  15. return
  16. end
  17. for mode_name, mode_char in pairs(mappings) do
  18. wk.register(lvim.lsp.buffer_mappings[mode_name], { mode = mode_char, buffer = bufnr })
  19. end
  20. else
  21. -- Remap using nvim api
  22. for mode_name, mode_char in pairs(mappings) do
  23. for key, remap in pairs(lvim.lsp.buffer_mappings[mode_name]) do
  24. vim.api.nvim_buf_set_keymap(bufnr, mode_char, key, remap[1], { noremap = true, silent = true })
  25. end
  26. end
  27. end
  28. end
  29. function M.common_capabilities()
  30. local capabilities = vim.lsp.protocol.make_client_capabilities()
  31. capabilities.textDocument.completion.completionItem.snippetSupport = true
  32. capabilities.textDocument.completion.completionItem.resolveSupport = {
  33. properties = {
  34. "documentation",
  35. "detail",
  36. "additionalTextEdits",
  37. },
  38. }
  39. local status_ok, cmp_nvim_lsp = pcall(require, "cmp_nvim_lsp")
  40. if status_ok then
  41. capabilities = cmp_nvim_lsp.update_capabilities(capabilities)
  42. end
  43. return capabilities
  44. end
  45. function M.common_on_exit(_, _)
  46. if lvim.lsp.document_highlight then
  47. autocmds.clear_augroup "lsp_document_highlight"
  48. end
  49. if lvim.lsp.code_lens_refresh then
  50. autocmds.clear_augroup "lsp_code_lens_refresh"
  51. end
  52. end
  53. function M.common_on_init(client, bufnr)
  54. if lvim.lsp.on_init_callback then
  55. lvim.lsp.on_init_callback(client, bufnr)
  56. Log:debug "Called lsp.on_init_callback"
  57. return
  58. end
  59. end
  60. function M.common_on_attach(client, bufnr)
  61. if lvim.lsp.on_attach_callback then
  62. lvim.lsp.on_attach_callback(client, bufnr)
  63. Log:debug "Called lsp.on_attach_callback"
  64. end
  65. local lu = require "lvim.lsp.utils"
  66. if lvim.lsp.document_highlight then
  67. lu.setup_document_highlight(client, bufnr)
  68. end
  69. if lvim.lsp.code_lens_refresh then
  70. lu.setup_codelens_refresh(client, bufnr)
  71. end
  72. add_lsp_buffer_keybindings(bufnr)
  73. end
  74. local function bootstrap_nlsp(opts)
  75. opts = opts or {}
  76. local lsp_settings_status_ok, lsp_settings = pcall(require, "nlspsettings")
  77. if lsp_settings_status_ok then
  78. lsp_settings.setup(opts)
  79. end
  80. end
  81. function M.get_common_opts()
  82. return {
  83. on_attach = M.common_on_attach,
  84. on_init = M.common_on_init,
  85. on_exit = M.common_on_exit,
  86. capabilities = M.common_capabilities(),
  87. }
  88. end
  89. function M.setup()
  90. Log:debug "Setting up LSP support"
  91. local lsp_status_ok, _ = pcall(require, "lspconfig")
  92. if not lsp_status_ok then
  93. return
  94. end
  95. if lvim.use_icons then
  96. for _, sign in ipairs(lvim.lsp.diagnostics.signs.values) do
  97. vim.fn.sign_define(sign.name, { texthl = sign.name, text = sign.text, numhl = sign.name })
  98. end
  99. end
  100. require("lvim.lsp.handlers").setup()
  101. if not utils.is_directory(lvim.lsp.templates_dir) then
  102. require("lvim.lsp.templates").generate_templates()
  103. end
  104. bootstrap_nlsp {
  105. config_home = utils.join_paths(get_config_dir(), "lsp-settings"),
  106. append_default_schemas = true,
  107. }
  108. require("nvim-lsp-installer").setup {
  109. -- use the default nvim_data_dir, since the server binaries are independent
  110. install_root_dir = utils.join_paths(vim.call("stdpath", "data"), "lsp_servers"),
  111. }
  112. require("lvim.lsp.null-ls").setup()
  113. autocmds.configure_format_on_save()
  114. end
  115. return M