1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
|
# Installation
> [!IMPORTANT]
> Blink uses a prebuilt binary for the fuzzy matcher which will be downloaded automatically when on a tag.
> You may build from source with rust nightly. See the [fuzzy documentation](./configuration/fuzzy.md) for more information.
## Requirements
- Neovim 0.10+
- Using prebuilt binaries:
- curl
- git
- Building from source:
- Rust nightly or [rustup](https://rustup.rs/)
## `lazy.nvim`
```lua
{
'saghen/blink.cmp',
-- optional: provides snippets for the snippet source
dependencies = 'rafamadriz/friendly-snippets',
-- use a release tag to download pre-built binaries
version = '*',
-- 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' for mappings similar to built-in completion
-- 'super-tab' for mappings similar to vscode (tab to accept, arrow keys to navigate)
-- 'enter' for mappings similar to 'super-tab' but with 'enter' to accept
-- See the full "keymap" documentation for information on defining your own keymap.
keymap = { preset = 'default' },
appearance = {
-- 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,
-- Set to 'mono' for 'Nerd Font Mono' or 'normal' for 'Nerd Font'
-- Adjusts spacing to ensure icons are aligned
nerd_font_variant = 'mono'
},
-- 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' },
},
},
opts_extend = { "sources.default" }
}
```
> [!IMPORTANT]
> On Neovim 0.11+ and Blink.cmp 0.10+, you may skip this step
Setting capabilities for `nvim-lspconfig`:
```lua
-- LSP servers and clients communicate which features they support through "capabilities".
-- By default, Neovim supports a subset of the LSP specification.
-- With blink.cmp, Neovim has *more* capabilities which are communicated to the LSP servers.
-- Explanation from TJ: https://youtu.be/m8C0Cq9Uv9o?t=1275
--
-- This can vary by config, but in general for nvim-lspconfig:
{
'neovim/nvim-lspconfig',
dependencies = { 'saghen/blink.cmp' },
-- example using `opts` for defining servers
opts = {
servers = {
lua_ls = {}
}
},
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
}
```
## `mini.deps`
The following section includes only the installation and, optionally, building of the fuzzy matcher. Check the [lazy.nvim](#lazy.nvim) section for recommended configuration options and setting up `nvim-lspconfig`.
```lua
-- use a release tag to download pre-built binaries
MiniDeps.add({
source = "saghen/blink.cmp",
depends = {
"rafamadriz/friendly-snippets",
},
checkout = "some.version", -- check releases for latest tag
})
-- OR build from source, requires nightly: https://rust-lang.github.io/rustup/concepts/channels.html#working-with-nightly-rust
local function build_blink(params)
vim.notify('Building blink.cmp', vim.log.levels.INFO)
local obj = vim.system({ 'cargo', 'build', '--release' }, { cwd = params.path }):wait()
if obj.code == 0 then
vim.notify('Building blink.cmp done', vim.log.levels.INFO)
else
vim.notify('Building blink.cmp failed', vim.log.levels.ERROR)
end
end
MiniDeps.add({
source = 'Saghen/blink.cmp',
hooks = {
post_install = build_blink,
post_checkout = build_blink,
},
})
```
|