return {
    {
        'neovim/nvim-lspconfig',
        config = function()
            local capabilities = require('cmp_nvim_lsp').default_capabilities()
            local wk = require('which-key')

            vim.lsp.enable('ocamllsp')
            vim.lsp.config('ocamllsp', {
                capabilities = capabilities
            })

            vim.lsp.enable('tinymist')
            vim.lsp.config('tinymist', {
                settings = {
                    formatterMode = "typstyle",
                    exportPdf = "onType",
                    semanticTokens = "disable",
                }
            })

            vim.lsp.enable('millet')
            vim.lsp.config('millet', {
                root_dir = function(fname)
                    local util = vim.lsp.config.util
                    return util.root_pattern(".cm", ".mlb")(fname)
                        or util.path.dirname(fname)
                end
            })

            vim.lsp.enable('clangd')
            vim.lsp.config('clangd', {
                capabilities = capabilities
            })

            vim.lsp.enable('zls')
            vim.lsp.config('zls', {
                capabilities = capabilities
            })

            vim.api.nvim_create_autocmd('LspAttach', {
                group = vim.api.nvim_create_augroup('UserLspConfig', {}),
                callback = function(ev)
                    local builtin = require('telescope.builtin')
                    wk.add({
                        { 'gD', vim.lsp.buf.declaration, desc = 'Go to declaration' },
                        { 'gR', builtin.lsp_references, desc = 'Go to references' },
                        { 'gd', builtin.lsp_definitions, desc = 'Go to definition' },

                        { '<leader>l', group = 'lsp' },
                        { '<leader>la', vim.lsp.buf.code_action, desc = 'Code actions' },
                        { '<leader>lr', vim.lsp.buf.rename, desc = 'Rename' },
                        { '<leader>lf', vim.lsp.buf.format, desc = 'Format' },
                        { '<leader>le', vim.diagnostic.open_float, desc = 'Show line diagnostics' },

                        { '[d', vim.diagnostic.goto_prev, desc = 'Go to previous diagnostic' },
                        { '[d', vim.diagnostic.goto_next, desc = 'Go to next diagnostic' },
                    })
                end
            })
        end,
        dependencies = {
            'ray-x/lsp_signature.nvim',
            'hrsh7th/nvim-cmp',
        }
    },
    {
        'ray-x/lsp_signature.nvim',
        event = 'VeryLazy',
        opts = {
            hind_prefix = 'λ ',
        },
    },
    {
        'j-hui/fidget.nvim',
        config = true,
        event = 'VeryLazy',
    },
    {
        'onsails/lspkind.nvim',
        event = 'VeryLazy',
    }
}
