-- if true then -- return {} -- end -- WARNING: If this line is true, then the plugin will NOT get sourced! -- NOTE: Has to be commented out if blink should be used return { -- ╭───────────╮ -- │ blink.cmp │ -- ╰───────────╯ { "saghen/blink.cmp", -- optional: provides snippets for the snippet source dependencies = { "rafamadriz/friendly-snippets" }, -- use a release tag to download pre-built binaries version = "1.*", -- AND/OR build from source, requires nightly: https://rust-lang.github.io/rustup/concepts/channels.html#working-with-nightly-rust -- build = "cargo build --release", -- If you use nix, you can build from source using latest nightly rust with: -- build = 'nix run .#build-plugin', ---@module 'blink.cmp' ---@type blink.cmp.Config opts = { -- 'default' (recommended) for mappings similar to built-in completions (C-y to accept) -- 'super-tab' for mappings similar to vscode (tab to accept) -- 'enter' for enter to accept -- 'none' for no mappings -- -- All presets have the following mappings: -- C-space: Open menu or open docs if already open -- C-n/C-p or Up/Down: Select next/previous item -- C-e: Hide menu -- C-k: Toggle signature help (if signature.enabled = true) -- -- See :h blink-cmp-config-keymap for defining your own keymap cmdline = { sources = { "cmdline" } }, keymap = { -- set to 'none' to disable the 'default' preset preset = "super-tab", [""] = { "select_prev", "fallback" }, [""] = { "select_next", "fallback" }, [""] = { "hide", "fallback" }, -- disable a keymap from the preset [""] = {}, [""] = {}, -- show with a list of providers -- [""] = { -- function(cmp) -- cmp.show({ providers = { "snippets" } }) -- end, -- }, -- control whether the next command will be run when using a function -- [""] = { -- function(cmp) -- if some_condition then -- return -- end -- runs the next command -- return true -- doesn't run the next command -- end, -- "select_next", -- }, }, appearance = { -- 'mono' (default) for 'Nerd Font Mono' or 'normal' for 'Nerd Font' -- Adjusts spacing to ensure icons are aligned nerd_font_variant = "mono", -- highlight_ns = vim.api.nvim_create_namespace("nvim-cmp"), -- Sets the fallback highlight groups to nvim-cmp's highlight groups -- Useful for when your theme doesn't support blink.cmp -- Will be removed in a future release use_nvim_cmp_as_default = true, kind_icons = { Text = "󰉿", Method = "󰊕", Function = "󰊕", Constructor = "󰒓", Field = "󰜢", Variable = "󰆦", Property = "󰖷", Class = "󱡠", Interface = "󱡠", Struct = "󱡠", Module = "󰅩", Unit = "󰪚", Value = "󰦨", Enum = "󰦨", EnumMember = "󰦨", Keyword = "󰻾", Constant = "󰏿", Snippet = "󱄽", Color = "󰏘", File = "󰈔", Reference = "󰬲", Folder = "󰉋", Event = "󱐋", Operator = "󰪚", TypeParameter = "󰬛", }, }, -- (Default) Only show the documentation popup when manually triggered completion = { keyword = { range = "full" }, trigger = { -- When true, will prefetch the completion items when entering insert mode prefetch_on_insert = false, -- When false, will not show the completion window automatically when in a snippet show_in_snippet = true, -- When true, will show the completion window after typing any of alphanumerics, `-` or `_` show_on_keyword = true, -- When true, will show the completion window after typing a trigger character show_on_trigger_character = true, -- LSPs can indicate when to show the completion window via trigger characters -- however, some LSPs (i.e. tsserver) return characters that would essentially -- always show the window. We block these by default. show_on_blocked_trigger_characters = { " ", "\n", "\t" }, -- You can also block per filetype with a function: -- show_on_blocked_trigger_characters = function(ctx) -- if vim.bo.filetype == "markdown" then -- return { " ", "\n", "\t", ".", "/", "(", "[" } -- end -- return { " ", "\n", "\t" } -- end, -- When both this and show_on_trigger_character are true, will show the completion window -- when the cursor comes after a trigger character after accepting an item show_on_accept_on_trigger_character = true, -- When both this and show_on_trigger_character are true, will show the completion window -- when the cursor comes after a trigger character when entering insert mode show_on_insert_on_trigger_character = true, -- List of trigger characters (on top of `show_on_blocked_trigger_characters`) that won't trigger -- the completion window when the cursor comes after a trigger character when -- entering insert mode/accepting an item show_on_x_blocked_trigger_characters = { "'", '"', "(" }, -- or a function, similar to show_on_blocked_trigger_character }, list = { -- Maximum number of items to display max_items = 128, -- selection = { -- -- When `true`, will automatically select the first item in the completion list -- preselect = true, -- -- preselect = function(ctx) return vim.bo.filetype ~= 'markdown' end, -- -- -- When `true`, inserts the completion item automatically when selecting it -- -- You may want to bind a key to the `cancel` command (default ) when using this option, -- -- which will both undo the selection and hide the completion menu -- auto_insert = true, -- -- auto_insert = function(ctx) return vim.bo.filetype ~= 'markdown' end -- }, -- cycle = { -- -- When `true`, calling `select_next` at the _bottom_ of the completion list -- -- will select the _first_ completion item. -- from_bottom = true, -- -- When `true`, calling `select_prev` at the _top_ of the completion list -- -- will select the _last_ completion item. -- from_top = true, -- }, }, documentation = { auto_show = false, auto_show_delay_ms = 230, update_delay_ms = 50, treesitter_highlighting = false, draw = function(opts) opts.default_implementation() end, window = { min_width = 16, max_width = 80, max_height = 24, border = "padded", -- Defaults to `vim.o.winborder` on nvim 0.11+ or 'padded' when not defined/<=0.10 winblend = 0, winhighlight = "Normal:BlinkCmpDoc,FloatBorder:BlinkCmpDocBorder,EndOfBuffer:BlinkCmpDoc", -- Note that the gutter will be disabled when border ~= 'none' scrollbar = true, }, }, ghost_text = { enabled = true, show_with_selection = true, show_without_selection = false, show_with_menu = true, show_without_menu = false, }, -- ─────────────────────────────────< mini-icons config >────────────────────────────── menu = { enabled = true, min_width = 16, max_height = 10, border = nil, -- Defaults to `vim.o.winborder` on nvim 0.11+ winblend = 0, winhighlight = "Normal:BlinkCmpMenu,FloatBorder:BlinkCmpMenuBorder,CursorLine:BlinkCmpMenuSelection,Search:None", -- Keep the cursor X lines away from the top/bottom of the window scrolloff = 2, -- Note that the gutter will be disabled when border ~= 'none' scrollbar = true, -- Which directions to show the window, -- falling back to the next direction when there's not enough space direction_priority = { "s", "n" }, -- Whether to automatically show the window when new completion items are available auto_show = true, draw = { -- Aligns the keyword you've typed to a component in the menu align_to = "label", -- or 'none' to disable, or 'cursor' to align to the cursor -- Left and right padding, optionally { left, right } for different padding on each side padding = 1, -- Gap between columns gap = 2, -- Use treesitter to highlight the label text for the given list of sources -- treesitter = {}, treesitter = { "lsp" }, columns = { { "kind_icon" }, { "label", "label_description", gap = 1 } }, components = { label = { text = function(ctx) return require("colorful-menu").blink_components_text(ctx) end, highlight = function(ctx) return require("colorful-menu").blink_components_highlight(ctx) end, }, kind_icon = { text = function(ctx) local kind_icon, _, _ = require("mini.icons").get("lsp", ctx.kind) return kind_icon end, -- (optional) use highlights from mini.icons highlight = function(ctx) local _, hl, _ = require("mini.icons").get("lsp", ctx.kind) return hl end, }, -- kind = { -- -- (optional) use highlights from mini.icons -- highlight = function(ctx) -- local _, hl, _ = require("mini.icons").get("lsp", ctx.kind) -- return hl -- end, -- }, label_description = { width = { max = 30 }, text = function(ctx) return ctx.label_description end, highlight = "BlinkCmpLabelDescription", }, source_name = { width = { max = 30 }, text = function(ctx) return ctx.source_name end, highlight = "BlinkCmpSource", }, source_id = { width = { max = 30 }, text = function(ctx) return ctx.source_id end, highlight = "BlinkCmpSource", }, }, }, }, }, -- Default list of enabled providers defined so that you can extend it -- elsewhere in your config, without redefining it, due to `opts_extend` sources = { default = { "lsp", "path", "snippets", "buffer" }, }, -- snippets = { preset = "default" | "luasnip" }, -- (Default) Rust fuzzy matcher for typo resistance and significantly better performance -- You may use a lua implementation instead by using `implementation = "lua"` or fallback to the lua implementation, -- when the Rust fuzzy matcher is not available, by using `implementation = "prefer_rust"` -- -- See the fuzzy documentation for more information fuzzy = { implementation = "prefer_rust", -- Frecency tracks the most recently/frequently used items and boosts the score of the item -- Note, this does not apply when using the Lua implementation. use_frecency = true, -- Proximity bonus boosts the score of items matching nearby words -- Note, this does not apply when using the Lua implementation. use_proximity = true, -- UNSAFE!! When enabled, disables the lock and fsync when writing to the frecency database. This should only be used on unsupported platforms (i.e. alpine termux) -- Note, this does not apply when using the Lua implementation. use_unsafe_no_lock = false, sorts = { -- (optionally) always prioritize exact matches -- 'exact', -- pass a function for custom behavior -- function(item_a, item_b) -- return item_a.score > item_b.score -- end, "score", "sort_text", }, }, }, opts_extend = { "sources.default" }, }, -- ─────────────────────────────────< colorful menu.nvim >───────────────────────────────── { "xzbdmw/colorful-menu.nvim", opts = { { ls = { lua_ls = { -- Maybe you want to dim arguments a bit. arguments_hl = "@comment", }, gopls = { -- By default, we render variable/function's type in the right most side, -- to make them not to crowd together with the original label. -- when true: -- foo *Foo -- ast "go/ast" -- when false: -- foo *Foo -- ast "go/ast" align_type_to_right = true, -- When true, label for field and variable will format like "foo: Foo" -- instead of go's original syntax "foo Foo". If align_type_to_right is -- true, this option has no effect. add_colon_before_type = false, -- See https://github.com/xzbdmw/colorful-menu.nvim/pull/36 preserve_type_when_truncate = true, }, -- for lsp_config or typescript-tools ts_ls = { -- false means do not include any extra info, -- see https://github.com/xzbdmw/colorful-menu.nvim/issues/42 extra_info_hl = "@comment", }, vtsls = { -- false means do not include any extra info, -- see https://github.com/xzbdmw/colorful-menu.nvim/issues/42 extra_info_hl = "@comment", }, ["rust-analyzer"] = { -- Such as (as Iterator), (use std::io). extra_info_hl = "@comment", -- Similar to the same setting of gopls. align_type_to_right = true, -- See https://github.com/xzbdmw/colorful-menu.nvim/pull/36 preserve_type_when_truncate = true, }, clangd = { -- Such as "From ". extra_info_hl = "@comment", -- Similar to the same setting of gopls. align_type_to_right = true, -- the hl group of leading dot of "•std::filesystem::permissions(..)" import_dot_hl = "@comment", -- See https://github.com/xzbdmw/colorful-menu.nvim/pull/36 preserve_type_when_truncate = true, }, zls = { -- Similar to the same setting of gopls. align_type_to_right = true, }, roslyn = { extra_info_hl = "@comment", }, dartls = { extra_info_hl = "@comment", }, -- The same applies to pyright/pylance basedpyright = { -- It is usually import path such as "os" extra_info_hl = "@comment", }, -- If true, try to highlight "not supported" languages. fallback = true, -- this will be applied to label description for unsupport languages fallback_extra_info_hl = "@comment", }, -- If the built-in logic fails to find a suitable highlight group for a label, -- this highlight is applied to the label. fallback_highlight = "@variable", -- If provided, the plugin truncates the final displayed text to -- this width (measured in display cells). Any highlights that extend -- beyond the truncation point are ignored. When set to a float -- between 0 and 1, it'll be treated as percentage of the width of -- the window: math.floor(max_width * vim.api.nvim_win_get_width(0)) -- Default 60. max_width = 60, }, }, -- config = function() -- -- You don't need to set these options. -- require("colorful-menu").setup({ -- ls = { -- lua_ls = { -- -- Maybe you want to dim arguments a bit. -- arguments_hl = "@comment", -- }, -- gopls = { -- -- By default, we render variable/function's type in the right most side, -- -- to make them not to crowd together with the original label. -- -- -- when true: -- -- foo *Foo -- -- ast "go/ast" -- -- -- when false: -- -- foo *Foo -- -- ast "go/ast" -- align_type_to_right = true, -- -- When true, label for field and variable will format like "foo: Foo" -- -- instead of go's original syntax "foo Foo". If align_type_to_right is -- -- true, this option has no effect. -- add_colon_before_type = false, -- -- See https://github.com/xzbdmw/colorful-menu.nvim/pull/36 -- preserve_type_when_truncate = true, -- }, -- -- for lsp_config or typescript-tools -- ts_ls = { -- -- false means do not include any extra info, -- -- see https://github.com/xzbdmw/colorful-menu.nvim/issues/42 -- extra_info_hl = "@comment", -- }, -- vtsls = { -- -- false means do not include any extra info, -- -- see https://github.com/xzbdmw/colorful-menu.nvim/issues/42 -- extra_info_hl = "@comment", -- }, -- ["rust-analyzer"] = { -- -- Such as (as Iterator), (use std::io). -- extra_info_hl = "@comment", -- -- Similar to the same setting of gopls. -- align_type_to_right = true, -- -- See https://github.com/xzbdmw/colorful-menu.nvim/pull/36 -- preserve_type_when_truncate = true, -- }, -- clangd = { -- -- Such as "From ". -- extra_info_hl = "@comment", -- -- Similar to the same setting of gopls. -- align_type_to_right = true, -- -- the hl group of leading dot of "•std::filesystem::permissions(..)" -- import_dot_hl = "@comment", -- -- See https://github.com/xzbdmw/colorful-menu.nvim/pull/36 -- preserve_type_when_truncate = true, -- }, -- zls = { -- -- Similar to the same setting of gopls. -- align_type_to_right = true, -- }, -- roslyn = { -- extra_info_hl = "@comment", -- }, -- dartls = { -- extra_info_hl = "@comment", -- }, -- -- The same applies to pyright/pylance -- basedpyright = { -- -- It is usually import path such as "os" -- extra_info_hl = "@comment", -- }, -- -- If true, try to highlight "not supported" languages. -- fallback = true, -- -- this will be applied to label description for unsupport languages -- fallback_extra_info_hl = "@comment", -- }, -- -- If the built-in logic fails to find a suitable highlight group for a label, -- -- this highlight is applied to the label. -- fallback_highlight = "@variable", -- -- If provided, the plugin truncates the final displayed text to -- -- this width (measured in display cells). Any highlights that extend -- -- beyond the truncation point are ignored. When set to a float -- -- between 0 and 1, it'll be treated as percentage of the width of -- -- the window: math.floor(max_width * vim.api.nvim_win_get_width(0)) -- -- Default 60. -- max_width = 60, -- }) -- end, }, -- ╭───────────╮ -- │ lspconfig │ -- ╰───────────╯ { "neovim/nvim-lspconfig", event = { "BufReadPre", "BufNewFile" }, dependencies = { { "saghen/blink.cmp" }, { "antosha417/nvim-lsp-file-operations", config = true }, -- { "folke/neodev.nvim", opts = {} }, }, opts = { servers = { lua_ls = { function() lspconfig["lua_ls"].setup({ capabilities = capabilities, settings = { Lua = { diagnostics = { globals = { "vim" }, }, completion = { callSnippet = "Replace", }, }, }, }) end, }, bashls = {}, }, }, config = function(_, opts) -- local lspconfig = require("lspconfig") -- for server, config in pairs(opts.servers) do -- -- passing config.capabilities to blink.cmp merges with the capabilities in your -- -- `opts[server].capabilities, if you've defined it -- config.capabilities = require("blink.cmp").get_lsp_capabilities(config.capabilities) -- lspconfig[server].setup(config) -- end local servers = { html = {}, awk_ls = {}, shfmt = { filetypes = { "ab", "bash", }, }, bashls = { filetypes = { "bash", "sh", "zsh", }, }, lua_ls = { -- capabilities = capabilities, settings = { Lua = { diagnostics = { globals = { "vim" }, }, completion = { callSnippet = "Replace", }, }, }, }, misspell = { filetypes = { "md", "markdown", }, }, pyright = { settings = { python = { analysis = { autoSearchPaths = true, typeCheckingMode = "basic", }, }, }, }, } for name, opts in pairs(servers) do vim.lsp.enable(name) -- nvim v0.11.0 or above required vim.lsp.config(name, opts) -- nvim v0.11.0 or above required end end, -- CAUTION: -- old config -- -- config = function() -- local lspconfig = require("lspconfig") -- local capabilities = require("blink.cmp").get_lsp_capabilities() -- local mason_lspconfig = require("mason-lspconfig") -- -- -- Change the Diagnostic symbols in the sign column (gutter) -- -- (not in youtube nvim video) -- local signs = { Error = " ", Warn = " ", Hint = " ", Info = " " } -- for type, icon in pairs(signs) do -- local hl = "DiagnosticSign" .. type -- vim.fn.sign_define(hl, { text = icon, texthl = hl, numhl = "" }) -- end -- -- mason_lspconfig.setup_handlers({ -- function(server_name) -- lspconfig[server_name].setup({ -- capabilities = capabilities, -- }) -- end, -- ["svelte"] = function() -- lspconfig["svelte"].setup({ -- capabilities = capabilities, -- on_attach = function(client, bufnr) -- vim.api.nvim_create_autocmd("BufWritePost", { -- pattern = { "*.js", "*.ts" }, -- callback = function(ctx) -- client.notify("$/onDidChangeTsOrJsFile", { uri = ctx.match }) -- end, -- }) -- end, -- }) -- end, -- ["graphql"] = function() -- lspconfig["graphql"].setup({ -- capabilities = capabilities, -- filetypes = { "graphql", "gql", "svelte", "typescriptreact", "javascriptreact" }, -- }) -- end, -- ["emmet_ls"] = function() -- lspconfig["emmet_ls"].setup({ -- capabilities = capabilities, -- filetypes = { -- "html", -- "typescriptreact", -- "javascriptreact", -- "css", -- "sass", -- "scss", -- "less", -- "svelte", -- }, -- }) -- end, -- ["lua_ls"] = function() -- lspconfig["lua_ls"].setup({ -- capabilities = capabilities, -- settings = { -- Lua = { -- diagnostics = { -- globals = { "vim" }, -- }, -- completion = { -- callSnippet = "Replace", -- }, -- }, -- }, -- }) -- end, -- ["cssls"] = function() -- lspconfig["cssls"].setup({ -- capabilities = capabilities, -- filetypes = { "css", "scss" }, -- }) -- end, -- ["intelephense"] = function() -- lspconfig["intelephense"].setup({ -- capabilities = capabilities, -- filetypes = { "php", "blade.php" }, -- }) -- end, -- -- ["tsserver"] = function() -- -- -- Replace tsserver with typescript-language-server -- -- lspconfig["typescript-language-server"].setup({ -- -- capabilities = capabilities, -- -- filetypes = { "typescript", "typescriptreact", "javascript", "javascriptreact" }, -- -- }) -- -- end, -- }) -- end, }, }