diff --git a/lua/pika/plugins/lsp/blink-cmp.lua b/lua/pika/plugins/lsp/blink-cmp.lua index a0e3b74..0660cd0 100644 --- a/lua/pika/plugins/lsp/blink-cmp.lua +++ b/lua/pika/plugins/lsp/blink-cmp.lua @@ -10,7 +10,7 @@ return { -- 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', + -- build = "cargo build --release", -- If you use nix, you can build from source using latest nightly rust with: -- build = 'nix run .#build-plugin', @@ -76,6 +76,72 @@ return { -- (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, @@ -98,15 +164,40 @@ return { ghost_text = { enabled = true, show_with_selection = true, - show_without_selection = true, + show_without_selection = false, show_with_menu = true, - show_without_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 = { - columns = { { "kind_icon" }, { "label", gap = 1 } }, + -- 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) @@ -135,6 +226,30 @@ return { -- 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", + }, }, }, }, @@ -146,12 +261,40 @@ return { 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" }, + 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" }, },