From 569238e45f241de366cd96aaf46a019facc94073 Mon Sep 17 00:00:00 2001 From: js0ny Date: Fri, 21 Mar 2025 00:46:30 +0000 Subject: [PATCH] feat(nvim): Change completion source to blink.cmp * fix: Completion does not work under Linux * chore: Load less LSPs * feat: Add selection border for completions --- tools/nvim/lua/plugins/completion.lua | 11 ++-- tools/nvim/lua/plugins/lsp.lua | 5 +- tools/nvim/lua/plugins/mod/blink-cmp.lua | 64 +++++++++++++++++++ tools/nvim/lua/plugins/mod/nvim-cmp.lua | 8 --- tools/nvim/lua/plugins/mod/nvim-lspconfig.lua | 42 ++++++++++++ 5 files changed, 112 insertions(+), 18 deletions(-) create mode 100644 tools/nvim/lua/plugins/mod/blink-cmp.lua create mode 100644 tools/nvim/lua/plugins/mod/nvim-lspconfig.lua diff --git a/tools/nvim/lua/plugins/completion.lua b/tools/nvim/lua/plugins/completion.lua index eae382d..62e9179 100644 --- a/tools/nvim/lua/plugins/completion.lua +++ b/tools/nvim/lua/plugins/completion.lua @@ -1,8 +1,9 @@ return { - { import = "plugins.mod.nvim-cmp" }, - { - "saadparwaiz1/cmp_luasnip", - }, + -- { import = "plugins.mod.nvim-cmp" }, + -- { + -- "saadparwaiz1/cmp_luasnip", + -- }, + { import = "plugins.mod.blink-cmp" }, { "L3MON4D3/LuaSnip", build = "make install_jsregexp", @@ -11,8 +12,6 @@ return { require("luasnip.loaders.from_vscode").lazy_load({ paths = "~/.config/lsp-snippets" }) -- require("luasnip.loaders.from_vscode").lazy_load() end, - -- TODO: Remove this, simply delete this will let nvim-cmp not work - -- dependencies = { "rafamadriz/friendly-snippets" }, }, { "zbirenbaum/copilot-cmp", diff --git a/tools/nvim/lua/plugins/lsp.lua b/tools/nvim/lua/plugins/lsp.lua index 6f280fd..976ea96 100644 --- a/tools/nvim/lua/plugins/lsp.lua +++ b/tools/nvim/lua/plugins/lsp.lua @@ -1,8 +1,5 @@ return { - { - "neovim/nvim-lspconfig", - lazy = false, - }, + { import = "plugins.mod.nvim-lspconfig" }, { import = "plugins.mod.render-markdown" }, -- { import = "plugins.mod.markview" }, { diff --git a/tools/nvim/lua/plugins/mod/blink-cmp.lua b/tools/nvim/lua/plugins/mod/blink-cmp.lua new file mode 100644 index 0000000..a67cf4a --- /dev/null +++ b/tools/nvim/lua/plugins/mod/blink-cmp.lua @@ -0,0 +1,64 @@ +return { + "saghen/blink.cmp", + -- optional: provides snippets for the snippet source + dependencies = { "L3MON4D3/LuaSnip", version = "v2.*" }, + + -- use a release tag to download pre-built binaries + version = "*", + + ---@module 'blink.cmp' + ---@type blink.cmp.Config + opts = { + keymap = { + preset = "default", + [""] = { + function(cmp) + if cmp.snippet_active() then + return cmp.accept() + else + return cmp.select_and_accept() + end + end, + "snippet_forward", + "fallback", + }, + [""] = { "select_and_accept" }, + [""] = { "hide", "fallback" }, + [""] = { "accept", "fallback" }, + }, + completion = { + menu = { border = "single" }, + documentation = { window = { border = "single" } }, + }, + signature = { window = { border = "single" } }, + + appearance = { + -- 'mono' (default) for 'Nerd Font Mono' or 'normal' for 'Nerd Font' + -- Adjusts spacing to ensure icons are aligned + nerd_font_variant = "normal", + }, + + snippets = { + preset = "luasnip", + }, + + sources = { + default = { "lazydev", "lsp", "path", "snippets", "buffer" }, + providers = { + lazydev = { + name = "LazyDev", + module = "lazydev.integrations.blink", + score_offset = 100, + }, + }, + }, + + -- (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/tools/nvim/lua/plugins/mod/nvim-cmp.lua b/tools/nvim/lua/plugins/mod/nvim-cmp.lua index 8cabbf5..6c4a0a4 100644 --- a/tools/nvim/lua/plugins/mod/nvim-cmp.lua +++ b/tools/nvim/lua/plugins/mod/nvim-cmp.lua @@ -1,11 +1,3 @@ -local function set_keymaps(keymaps_cmp) - local mappings = {} - for _, map in ipairs(keymaps_cmp) do - mappings[map.keys] = map.cmd - end - return mappings -end - return { "hrsh7th/nvim-cmp", -- lazy = false, diff --git a/tools/nvim/lua/plugins/mod/nvim-lspconfig.lua b/tools/nvim/lua/plugins/mod/nvim-lspconfig.lua new file mode 100644 index 0000000..6671b35 --- /dev/null +++ b/tools/nvim/lua/plugins/mod/nvim-lspconfig.lua @@ -0,0 +1,42 @@ +return { + "neovim/nvim-lspconfig", + dependencies = { "saghen/blink.cmp" }, + + -- example using `opts` for defining servers + opts = { + servers = { + lua_ls = {}, + bashls = {}, + clangd = {}, + eslint = {}, -- JavaScript + gopls = {}, -- Go + jsonls = {}, -- JSON + markdown_oxide = {}, -- Markdown + omnisharp = {}, -- C# & F# + powershell_es = {}, -- PowerShell + pyright = {}, -- Python + taplo = {}, -- TOML + ts_ls = {}, -- TypeScript + vimls = {}, -- vimscript + yamlls = {}, -- YAML + beancount = {}, -- Beancount + }, + }, + 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 + end, + + -- example calling setup directly for each LSP + -- config = function() + -- local capabilities = require('blink.cmp').get_lsp_capabilities() + -- local lspconfig = require('lspconfig') + -- + -- lspconfig['lua_ls'].setup({ capabilities = capabilities }) + -- end +}