return {
	{
		"lsp",
		event = { "BufReadPost", "BufWritePost", "BufNewFile" },
		load = function() end,
		after = function()
			-- see https://github.com/neovim/nvim-lspconfig/issues/3494
			require("lspconfig").lua_ls.setup({})
			require("lspconfig").hls.setup({})
			require("lspconfig").rust_analyzer.setup({})
			require("lspconfig").clangd.setup({})
			require("lspconfig").omnisharp.setup({})
			require("lspconfig").pyright.setup({})
			require("lspconfig").nil_ls.setup({})
			require("lspconfig").ts_ls.setup({})
			require("lspconfig").yamlls.setup({})
			require("lspconfig").marksman.setup({})
			require("lspconfig").ltex.setup({})
			require("lspconfig").texlab.setup({})
			require("lspconfig").html.setup({})
			require("lspconfig").helm_ls.setup({})
			require("lspconfig").zls.setup({})

			require("lspconfig").jsonls.setup({
				on_new_config = function(new_config)
					new_config.settings.json.schemas = new_config.settings.json.schemas or {}
					vim.list_extend(new_config.settings.json.schemas, require("schemastore").json.schemas())
				end,
				settings = {
					json = {
						format = {
							enable = true,
						},
						validate = { enable = true },
					},
				},
			})

			require("lspconfig").gopls.setup({
				settings = {
					-- https://go.googlesource.com/vscode-go/+/HEAD/docs/settings.md#settings-for
					gopls = {
						analyses = {
							nilness = true,
							unusedparams = true,
							unusedwrite = true,
							useany = true
						},
						experimentalPostfixCompletions = true,
						gofumpt = true,
						staticcheck = true,
						usePlaceholders = true,
						hints = {
							assignVariableTypes = true,
							compositeLiteralFields = true,
							compositeLiteralTypes = true,
							constantValues = true,
							functionTypeParameters = true,
							parameterNames = true,
							rangeVariableTypes = true
						}
					}
				}
			})
		end,
	},
}
