Advertisement
UsSe3wa

Untitled

Jun 6th, 2025
25
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.48 KB | None | 0 0
  1. ```
  2. return {
  3. "neovim/nvim-lspconfig",
  4. event = { "BufReadPre", "BufNewFile" },
  5. dependencies = {
  6. "hrsh7th/cmp-nvim-lsp",
  7. { "antosha417/nvim-lsp-file-operations", config = true },
  8. { "folke/neodev.nvim", opts = {} },
  9. },
  10. config = function()
  11. -- Установка глобальной переменной ПЕРЕД загрузкой модулей
  12. vim.g.mason_disable_automatic_lsp_setup = true
  13.  
  14. -- Импорт модулей
  15. local lspconfig = require("lspconfig")
  16. local cmp_nvim_lsp = require("cmp_nvim_lsp")
  17. local mr = require("mason-registry") -- Для ручной установки серверов
  18.  
  19. -- Установка LSP серверов через Mason API
  20. local lsp_servers = {
  21. "lua_ls",
  22. "pyright",
  23. "html",
  24. "cssls",
  25. "ltex",
  26. "jdtls",
  27. "hls",
  28. "bashls",
  29. "jsonls",
  30. "yamlls",
  31. }
  32. {
  33. "neovim/nvim-lspconfig",
  34. event = { "BufReadPre", "BufNewFile" },
  35. dependencies = {
  36. "hrsh7th/cmp-nvim-lsp",
  37. { "antosha417/nvim-lsp-file-operations", config = true },
  38. { "folke/neodev.nvim", opts = {} },
  39. },
  40. config = function()
  41. -- Установка глобальной переменной ПЕРЕД загрузкой модулей
  42. vim.g.mason_disable_automatic_lsp_setup = true
  43.  
  44. -- Импорт модулей
  45. local lspconfig = require("lspconfig")
  46. local cmp_nvim_lsp = require("cmp_nvim_lsp")
  47. local mr = require("mason-registry") -- Для ручной установки серверов
  48.  
  49. -- Установка LSP серверов через Mason API
  50. local lsp_servers = {
  51. "lua_ls",
  52. "pyright",
  53. "html",
  54. "cssls",
  55. "ltex",
  56. "jdtls",
  57. "hls",
  58. "bashls",
  59. "jsonls",
  60. "yamlls",
  61. }
  62.  
  63. for _, server in ipairs(lsp_servers) do
  64. if mr.is_installed(server) then
  65. vim.notify(server .. " already installed", vim.log.levels.INFO)
  66. else
  67. pcall(function()
  68. local pkg = mr.get_package(server)
  69. pkg:install()
  70. vim.notify("Installing " .. server, vim.log.levels.INFO)
  71. end)
  72. end
  73. end
  74.  
  75. -- Ключевые привязки
  76. local keymap = vim.keymap
  77.  
  78. -- Автокоманды для прикрепления LSP
  79. vim.api.nvim_create_autocmd("LspAttach", {
  80. group = vim.api.nvim_create_augroup("UserLspConfig", {}),
  81. callback = function(ev)
  82. local opts = { buffer = ev.buf, silent = true }
  83.  
  84. -- Навигация по коду
  85. keymap.set("n", "gR", "<cmd>FzfLua lsp_references<CR>", opts)
  86. keymap.set("n", "gD", vim.lsp.buf.declaration, opts)
  87. keymap.set("n", "gd", "<cmd>FzfLua lsp_definitions<CR>", opts)
  88. keymap.set("n", "gi", "<cmd>FzfLua lsp_implementations<CR>", opts)
  89. keymap.set("n", "gt", "<cmd>FzfLua lsp_typedefs<CR>", opts)
  90.  
  91. -- Действия с кодом
  92. keymap.set({ "n", "v" }, "<leader>ca", vim.lsp.buf.code_action, opts)
  93. keymap.set("n", "<leader>rn", vim.lsp.buf.rename, opts)
  94.  
  95. -- Диагностика
  96. keymap.set("n", "<leader>D", "<cmd>FzfLua diagnostics_workspace<CR>", opts)
  97. keymap.set("n", "<leader>d", vim.diagnostic.open_float, opts)
  98. keymap.set("n", "[d", vim.diagnostic.goto_prev, opts)
  99. keymap.set("n", "]d", vim.diagnostic.goto_next, opts)
  100.  
  101. -- Документация
  102. keymap.set("n", "K", vim.lsp.buf.hover, opts)
  103.  
  104. -- Управление LSP
  105. keymap.set("n", "<leader>rs", ":LspRestart<CR>", opts)
  106. end,
  107. })
  108.  
  109. -- Возможности автодополнения
  110. local capabilities = cmp_nvim_lsp.default_capabilities()
  111. capabilities.offsetEncoding = { "utf-16" } -- Для корректной работы с некоторыми серверами
  112.  
  113. -- Значки диагностики
  114. local signs = { Error = " ", Warn = " ", Hint = "󰠠 ", Info = " " }
  115. for type, icon in pairs(signs) do
  116. local hl = "DiagnosticSign" .. type
  117. vim.fn.sign_define(hl, { text = icon, texthl = hl, numhl = "" })
  118. end
  119.  
  120. -- Конфигурация серверов
  121. local servers = {
  122. lua_ls = {
  123. capabilities = capabilities,
  124. settings = {
  125. Lua = {
  126. runtime = { version = "LuaJIT" },
  127. workspace = {
  128. checkThirdParty = false,
  129. library = vim.api.nvim_get_runtime_file("", true),
  130. },
  131. completion = { callSnippet = "Replace" },
  132. telemetry = { enable = false },
  133. diagnostics = {
  134. globals = { "vim" },
  135. disable = { "missing-fields" },
  136. },
  137. },
  138. },
  139. },
  140. pyright = {
  141. capabilities = capabilities,
  142. settings = {
  143. python = {
  144. analysis = {
  145. autoImportCompletions = true,
  146. useLibraryCodeForTypes = true,
  147. diagnosticSeverityOverrides = {
  148. reportUnusedVariable = "warning",
  149. },
  150. },
  151. },
  152. },
  153. },
  154. html = {
  155. capabilities = capabilities,
  156. filetypes = { "html", "htmldjango" },
  157. },
  158. cssls = {
  159. capabilities = capabilities,
  160. settings = {
  161. css = { validate = true },
  162. scss = { validate = true },
  163. less = { validate = true },
  164. },
  165. },
  166. ltex = {
  167. capabilities = capabilities,
  168. filetypes = { "markdown", "tex", "text" },
  169. },
  170. }
  171.  
  172. -- Настройка серверов
  173. for server_name, config in pairs(servers) do
  174. lspconfig[server_name].setup(config)
  175. end
  176.  
  177. -- Специальные конфигурации
  178. lspconfig.jdtls.setup({
  179. capabilities = capabilities,
  180. cmd = { "jdtls" },
  181. root_dir = lspconfig.util.root_pattern("build.gradle", "pom.xml", ".git"),
  182. filetypes = { "java" },
  183. })
  184.  
  185. lspconfig.hls.setup({
  186. capabilities = capabilities,
  187. filetypes = { "haskell", "lhaskell" },
  188. settings = {
  189. haskell = {
  190. formattingProvider = "ormolu",
  191. plugin = {
  192. rename = { crossModule = true },
  193. },
  194. },
  195. },
  196. })
  197.  
  198. -- Глобальные обработчики LSP
  199. vim.lsp.handlers["textDocument/hover"] = vim.lsp.with(vim.lsp.handlers.hover, {
  200. border = "rounded",
  201. })
  202.  
  203. vim.lsp.handlers["textDocument/signatureHelp"] = vim.lsp.with(vim.lsp.handlers.signature_help, {
  204. border = "rounded",
  205. })
  206.  
  207. -- Автокоманда для обновления серверов при изменении конфигурации
  208. vim.api.nvim_create_autocmd("BufWritePost", {
  209. pattern = "*.lua",
  210. callback = function()
  211. vim.schedule(function()
  212. vim.cmd("LspRestart")
  213. end)
  214. end,
  215. })
  216. end,
  217. ```
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement