From 7c376f611557965bbf89f2bd88fd762bb4a61b1b Mon Sep 17 00:00:00 2001 From: Janis Hutz Date: Mon, 6 Jul 2026 10:53:21 +0200 Subject: [PATCH] feat: improved blink completions (better trigger chars) --- README.md | 2 +- nvim/lua/plugins/lsp/completion.lua | 140 ++++++++++++++++------------ nvim/lua/plugins/lsp/lspconfig.lua | 7 -- nvim/lua/plugins/lsp/none-ls.lua | 7 +- 4 files changed, 89 insertions(+), 67 deletions(-) diff --git a/README.md b/README.md index 7cd275f..a20bc60 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ It uses: - NeoVim's built-in LSP support, with lspconfig for the language server configuration - none-ls for formatters - Snacks.nvim for search, file explorer and more -- blink.cmp for completions, with LuaSnip for snippets +- blink.cmp for completions and snippets - Nightfox theme, with customized colours - TODO comment highlighting - Debugger support (through nvim-dap) diff --git a/nvim/lua/plugins/lsp/completion.lua b/nvim/lua/plugins/lsp/completion.lua index 8de9e8a..17e5fdb 100644 --- a/nvim/lua/plugins/lsp/completion.lua +++ b/nvim/lua/plugins/lsp/completion.lua @@ -1,67 +1,91 @@ +local trigger_chars_add = { "-", "*", "@" } return { - "saghen/blink.cmp", - -- optional: provides snippets for the snippet source - dependencies = { "rafamadriz/friendly-snippets", "L3MON4D3/LuaSnip" }, + "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.*", + -- use a release tag to download pre-built binaries + version = "1.*", - ---@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 - keymap = { - preset = "super-tab", - [""] = { "select_prev", "fallback" }, - [""] = { "select_next", "fallback" }, - [""] = { "show_documentation", "hide_documentation" }, - [""] = { "scroll_documentation_down", "scroll_signature_down" }, - [""] = { "scroll_documentation_up", "scroll_signature_up" }, - [""] = { "snippet_backward", "fallback" }, - [""] = { "snippet_forward", "fallback" }, - [""] = { "show_signature", "hide_signature", "fallback" }, - }, + ---@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 + keymap = { + preset = "super-tab", + [""] = { "select_prev", "fallback" }, + [""] = { "select_next", "fallback" }, + [""] = { "show_documentation", "hide_documentation" }, + [""] = { "scroll_documentation_down", "scroll_signature_down" }, + [""] = { "scroll_documentation_up", "scroll_signature_up" }, + [""] = { "snippet_backward", "fallback" }, + [""] = { "snippet_forward", "fallback" }, + [""] = { "show_signature", "hide_signature", "fallback" }, + }, - appearance = { - -- 'mono' (default) for 'Nerd Font Mono' or 'normal' for 'Nerd Font' - -- Adjusts spacing to ensure icons are aligned - nerd_font_variant = "mono", - }, + appearance = { + -- 'mono' (default) for 'Nerd Font Mono' or 'normal' for 'Nerd Font' + -- Adjusts spacing to ensure icons are aligned + nerd_font_variant = "mono", + }, - -- (Default) Only show the documentation popup when manually triggered - completion = { - documentation = { auto_show = false }, - list = { - cycle = { from_top = true, from_bottom = true }, + -- (Default) Only show the documentation popup when manually triggered + completion = { + documentation = { auto_show = true, auto_show_delay_ms = 500 }, + trigger = {}, + list = { + cycle = { from_top = true, from_bottom = true }, selection = { - auto_insert = false - } - }, - }, + auto_insert = false, + }, + }, + ghost_text = { + enabled = true, + }, + }, - -- 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" }, - }, + -- 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" }, + providers = { + snippets = { + override = { + get_trigger_characters = function(self) + if self.get_trigger_characters then + local stat, trigger_chars = pcall(self:get_trigger_characters()) + if stat then + vim.list_extend(trigger_chars, trigger_chars_add) + return trigger_chars + else + return trigger_chars_add + end + else + return trigger_chars_add + end + end, + }, + }, + }, + }, - -- (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_with_warning" }, - }, - opts_extend = { "sources.default" }, + -- (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_with_warning" }, + }, + opts_extend = { "sources.default" }, } diff --git a/nvim/lua/plugins/lsp/lspconfig.lua b/nvim/lua/plugins/lsp/lspconfig.lua index c2f2c55..e2e73c5 100755 --- a/nvim/lua/plugins/lsp/lspconfig.lua +++ b/nvim/lua/plugins/lsp/lspconfig.lua @@ -17,13 +17,6 @@ return { vim.fn.sign_define(hl, { text = icon, texthl = hl, numhl = "" }) end - local luasnip = require("luasnip") - - -- loads vscode style snippets from installed plugins (e.g. friendly-snippets) - require("luasnip.loaders.from_vscode").lazy_load() - require("luasnip.loaders.from_vscode").load({ paths = { "~/.config/nvim/snippets" } }) - luasnip.setup({}) - -- ─────────────────────────────────────────────────────────────────── -- ╭───────────────────────────────────────────────╮ -- │ Import configs from other files │ diff --git a/nvim/lua/plugins/lsp/none-ls.lua b/nvim/lua/plugins/lsp/none-ls.lua index 672f6e9..c90caed 100755 --- a/nvim/lua/plugins/lsp/none-ls.lua +++ b/nvim/lua/plugins/lsp/none-ls.lua @@ -12,7 +12,12 @@ return { null_ls.setup({ sources = { - null_ls.builtins.formatting.stylua, + null_ls.builtins.formatting.stylua.with({ + extra_args = { + '--indent-type', + 'Spaces' + } + }), null_ls.builtins.formatting.prettier.with({ filetypes = { "css",