local on_attach = require("util.lsp").on_attach local diagnostic_signs = require("util.icons").diagnostic_signs local typescript_organise_imports = require("util.lsp").typescript_organise_imports local config = function() require("neoconf").setup({}) local cmp_nvim_lsp = require("cmp_nvim_lsp") local lspconfig = require("lspconfig") local capabilities = cmp_nvim_lsp.default_capabilities() -- solidity lspconfig.solidity_ls.setup({ capabilities = capabilities, on_attach = on_attach, filetypes = { "solidity" }, root_dir = lspconfig.util.root_pattern("hardhat.config.*", 'foundry.toml', 'remappings.txt', ".git"), settings = { solidity = { includePath = '', remappings = { ["@openzeppelin/"] = "lib/openzeppelin-contracts/", ["account-abstraction/"] = "lib/account-abstraction/" } } } }) -- lua lspconfig.lua_ls.setup({ capabilities = capabilities, on_attach = on_attach, settings = { -- custom settings for lua Lua = { -- make the language server recognize "vim" global diagnostics = { globals = { "vim" }, }, workspace = { library = { vim.fn.expand("$VIMRUNTIME/lua"), vim.fn.expand("$XDG_CONFIG_HOME") .. "/nvim/lua", }, }, }, }, }) -- json lspconfig.jsonls.setup({ capabilities = capabilities, on_attach = on_attach, filetypes = { "json", "jsonc" }, }) -- python lspconfig.pyright.setup({ capabilities = capabilities, on_attach = on_attach, settings = { pyright = { disableOrganizeImports = false, analysis = { useLibraryCodeForTypes = true, autoSearchPaths = true, diagnosticMode = "workspace", autoImportCompletions = true, }, }, }, }) -- typescript lspconfig.ts_ls.setup({ on_attach = on_attach, capabilities = capabilities, filetypes = { "typescript", "javascript", "typescriptreact", "javascriptreact", }, commands = { TypeScriptOrganizeImports = typescript_organise_imports, }, settings = { typescript = { indentStyle = "space", indentSize = 2, }, }, }) -- bash lspconfig.bashls.setup({ capabilities = capabilities, on_attach = on_attach, filetypes = { "sh", "aliasrc" }, }) -- markdown lspconfig.markdown_oxide.setup({ capabilities = capabilities, on_attach = on_attach, filetypes = { "markdown" }, }) -- typescriptreact, javascriptreact, css, sass, scss, less, svelte, vue lspconfig.emmet_ls.setup({ capabilities = capabilities, on_attach = on_attach, filetypes = { "typescriptreact", "javascriptreact", "javascript", "css", "sass", "scss", "less", "svelte", "vue", "html", }, }) -- docker lspconfig.dockerls.setup({ capabilities = capabilities, on_attach = on_attach, }) -- C/C++ lspconfig.clangd.setup({ capabilities = capabilities, on_attach = on_attach, cmd = { "clangd", "--offset-encoding=utf-16", }, }) -- SQL require'lspconfig'.sqlls.setup({ capabilities = capabilities, on_attach = on_attach, cmd = { "sql-language-server", "up", "--method", "stdio" }, -- root_dir = "", }) -- Zig require 'lspconfig'.zls.setup({ filetype = { "zig", "zir" }, on_attach = on_attach, cmd = { "zls", }, }) vim.api.nvim_create_autocmd('BufWritePre',{ pattern = {"*.zig", "*.zon"}, callback = function() vim.lsp.buf.format() end }) for type, icon in pairs(diagnostic_signs) do local hl = "DiagnosticSign" .. type vim.fn.sign_define(hl, { text = icon, texthl = hl, numhl = "" }) end -- local solhint = require("efmls-configs.linters.solhint") local prettier_d = require("efmls-configs.formatters.prettier_d") local luacheck = require("efmls-configs.linters.luacheck") local stylua = require("efmls-configs.formatters.stylua") -- local flake8 = require("efmls-configs.linters.flake8") local black = require("efmls-configs.formatters.black") local eslint = require("efmls-configs.linters.eslint") local fixjson = require("efmls-configs.formatters.fixjson") local shellcheck = require("efmls-configs.linters.shellcheck") local shfmt = require("efmls-configs.formatters.shfmt") -- local hadolint = require("efmls-configs.linters.hadolint") local cpplint = require("efmls-configs.linters.cpplint") local clangformat = require("efmls-configs.formatters.clang_format") local markdownlint = require("efmls-configs.linters.markdownlint") local sqlfluff = require("efmls-configs.linters.sqlfluff") local sqlformatter = require("efmls-configs.formatters.sql-formatter") -- configure efm server lspconfig.efm.setup({ filetypes = { "solidity", "lua", "python", "json", "jsonc", "sh", "javascript", "javascriptreact", "typescript", "typescriptreact", "svelte", "vue", "markdown", "docker", "html", "css", "c", "cpp", "zig", "sql", }, init_options = { documentFormatting = true, documentRangeFormatting = true, hover = true, documentSymbol = true, codeAction = true, completion = true, }, settings = { version = "*", languages = { -- solidity = { solhint, prettier_d }, lua = { luacheck, stylua }, python = { black }, typescript = { eslint, prettier_d }, json = { eslint, fixjson }, jsonc = { eslint, fixjson }, sh = { shellcheck, shfmt }, javascript = { eslint, prettier_d }, javascriptreact = { eslint, prettier_d }, typescriptreact = { eslint, prettier_d }, svelte = { eslint, prettier_d }, vue = { eslint, prettier_d }, markdown = { prettier_d, markdownlint }, docker = { prettier_d }, html = { prettier_d }, css = { prettier_d }, c = { clangformat, cpplint }, cpp = { clangformat, cpplint }, sql = { sqlfluff, sqlformatter }, -- zig = { zls }, }, }, }) end -- auto-format on save - BROKEN --[[ local lsp_fmt_group = vim.api.nvim_create_augroup("LspFormattingGroup", {}) -- vim.api.nvim_create_autocmd({ "BufWritePre", "BufEnter", "BufWritePost", "InsertLeave" }, { -- vim.api.nvim_create_autocmd({ "BufWritePre" }, { -- group = lsp_fmt_group, -- callback = function() -- local efm = vim.lsp.get_clients({ name = "efm", "zls" }) -- if vim.tbl_isempty(efm) then -- return -- end -- vim.lsp.buf.format({ name = "efm", async = true }) -- end, -- }) --]] return { "neovim/nvim-lspconfig", config = config, lazy = false, dependencies = { "windwp/nvim-autopairs", "williamboman/mason.nvim", "creativenull/efmls-configs-nvim", "hrsh7th/nvim-cmp", "hrsh7th/cmp-buffer", "hrsh7th/cmp-nvim-lsp", }, }