mirror of
https://github.com/LazyVim/LazyVim.git
synced 2025-06-21 16:39:06 +02:00
## Description Since [this commit in Neovim](https://github.com/neovim/neovim/pull/27339), snippet navigation mappings are set by default to `<tab>` and `<s-tab>`, and hence don't need to be redefined here. Moreover, the core implementation makes sure that those snippet navigation mappings are active only when snippet expansion is happening, and if other user bindings are using those keys, they're restored when snippet navigation ends. ## Checklist - [x] I've read the [CONTRIBUTING](https://github.com/LazyVim/LazyVim/blob/main/CONTRIBUTING.md) guidelines.
210 lines
6.7 KiB
Lua
210 lines
6.7 KiB
Lua
return {
|
|
|
|
-- auto completion
|
|
{
|
|
"hrsh7th/nvim-cmp",
|
|
version = false, -- last release is way too old
|
|
event = "InsertEnter",
|
|
dependencies = {
|
|
"hrsh7th/cmp-nvim-lsp",
|
|
"hrsh7th/cmp-buffer",
|
|
"hrsh7th/cmp-path",
|
|
},
|
|
-- Not all LSP servers add brackets when completing a function.
|
|
-- To better deal with this, LazyVim adds a custom option to cmp,
|
|
-- that you can configure. For example:
|
|
--
|
|
-- ```lua
|
|
-- opts = {
|
|
-- auto_brackets = { "python" }
|
|
-- }
|
|
-- ```
|
|
opts = function()
|
|
vim.api.nvim_set_hl(0, "CmpGhostText", { link = "Comment", default = true })
|
|
local cmp = require("cmp")
|
|
local defaults = require("cmp.config.default")()
|
|
local auto_select = true
|
|
return {
|
|
auto_brackets = {}, -- configure any filetype to auto add brackets
|
|
completion = {
|
|
completeopt = "menu,menuone,noinsert" .. (auto_select and "" or ",noselect"),
|
|
},
|
|
preselect = auto_select and cmp.PreselectMode.Item or cmp.PreselectMode.None,
|
|
mapping = cmp.mapping.preset.insert({
|
|
["<C-b>"] = cmp.mapping.scroll_docs(-4),
|
|
["<C-f>"] = cmp.mapping.scroll_docs(4),
|
|
["<C-n>"] = cmp.mapping.select_next_item({ behavior = cmp.SelectBehavior.Insert }),
|
|
["<C-p>"] = cmp.mapping.select_prev_item({ behavior = cmp.SelectBehavior.Insert }),
|
|
["<C-Space>"] = cmp.mapping.complete(),
|
|
["<CR>"] = LazyVim.cmp.confirm({ select = auto_select }),
|
|
["<C-y>"] = LazyVim.cmp.confirm({ select = true }),
|
|
["<S-CR>"] = LazyVim.cmp.confirm({ behavior = cmp.ConfirmBehavior.Replace }), -- Accept currently selected item. Set `select` to `false` to only confirm explicitly selected items.
|
|
["<C-CR>"] = function(fallback)
|
|
cmp.abort()
|
|
fallback()
|
|
end,
|
|
}),
|
|
sources = cmp.config.sources({
|
|
{ name = "nvim_lsp" },
|
|
{ name = "path" },
|
|
}, {
|
|
{ name = "buffer" },
|
|
}),
|
|
formatting = {
|
|
format = function(entry, item)
|
|
local icons = LazyVim.config.icons.kinds
|
|
if icons[item.kind] then
|
|
item.kind = icons[item.kind] .. item.kind
|
|
end
|
|
|
|
local widths = {
|
|
abbr = vim.g.cmp_widths and vim.g.cmp_widths.abbr or 40,
|
|
menu = vim.g.cmp_widths and vim.g.cmp_widths.menu or 30,
|
|
}
|
|
|
|
for key, width in pairs(widths) do
|
|
if item[key] and vim.fn.strdisplaywidth(item[key]) > width then
|
|
item[key] = vim.fn.strcharpart(item[key], 0, width - 1) .. "…"
|
|
end
|
|
end
|
|
|
|
return item
|
|
end,
|
|
},
|
|
experimental = {
|
|
ghost_text = {
|
|
hl_group = "CmpGhostText",
|
|
},
|
|
},
|
|
sorting = defaults.sorting,
|
|
}
|
|
end,
|
|
main = "lazyvim.util.cmp",
|
|
},
|
|
|
|
-- snippets
|
|
{
|
|
"nvim-cmp",
|
|
optional = true,
|
|
dependencies = {
|
|
{
|
|
"garymjr/nvim-snippets",
|
|
opts = {
|
|
friendly_snippets = true,
|
|
},
|
|
dependencies = { "rafamadriz/friendly-snippets" },
|
|
},
|
|
},
|
|
opts = function(_, opts)
|
|
opts.snippet = {
|
|
expand = function(item)
|
|
return LazyVim.cmp.expand(item.body)
|
|
end,
|
|
}
|
|
if LazyVim.has("nvim-snippets") then
|
|
table.insert(opts.sources, { name = "snippets" })
|
|
end
|
|
end,
|
|
init = function()
|
|
-- Neovim enabled snippet navigation mappings by default in v0.11
|
|
if vim.fn.has("nvim-0.11") == 0 then
|
|
vim.keymap.set({ "i", "s" }, "<Tab>", function()
|
|
return vim.snippet.active({ direction = 1 }) and "<cmd>lua vim.snippet.jump(1)<cr>" or "<Tab>"
|
|
end, { expr = true, silent = true })
|
|
vim.keymap.set({ "i", "s" }, "<S-Tab>", function()
|
|
return vim.snippet.active({ direction = -1 }) and "<cmd>lua vim.snippet.jump(-1)<cr>" or "<S-Tab>"
|
|
end, { expr = true, silent = true })
|
|
end
|
|
end,
|
|
},
|
|
|
|
-- auto pairs
|
|
{
|
|
"echasnovski/mini.pairs",
|
|
event = "VeryLazy",
|
|
opts = {
|
|
modes = { insert = true, command = true, terminal = false },
|
|
-- skip autopair when next character is one of these
|
|
skip_next = [=[[%w%%%'%[%"%.%`%$]]=],
|
|
-- skip autopair when the cursor is inside these treesitter nodes
|
|
skip_ts = { "string" },
|
|
-- skip autopair when next character is closing pair
|
|
-- and there are more closing pairs than opening pairs
|
|
skip_unbalanced = true,
|
|
-- better deal with markdown code blocks
|
|
markdown = true,
|
|
},
|
|
config = function(_, opts)
|
|
LazyVim.mini.pairs(opts)
|
|
end,
|
|
},
|
|
|
|
-- comments
|
|
{
|
|
"folke/ts-comments.nvim",
|
|
event = "VeryLazy",
|
|
opts = {},
|
|
},
|
|
|
|
-- Better text-objects
|
|
{
|
|
"echasnovski/mini.ai",
|
|
event = "VeryLazy",
|
|
opts = function()
|
|
local ai = require("mini.ai")
|
|
return {
|
|
n_lines = 500,
|
|
custom_textobjects = {
|
|
o = ai.gen_spec.treesitter({ -- code block
|
|
a = { "@block.outer", "@conditional.outer", "@loop.outer" },
|
|
i = { "@block.inner", "@conditional.inner", "@loop.inner" },
|
|
}),
|
|
f = ai.gen_spec.treesitter({ a = "@function.outer", i = "@function.inner" }), -- function
|
|
c = ai.gen_spec.treesitter({ a = "@class.outer", i = "@class.inner" }), -- class
|
|
t = { "<([%p%w]-)%f[^<%w][^<>]->.-</%1>", "^<.->().*()</[^/]->$" }, -- tags
|
|
d = { "%f[%d]%d+" }, -- digits
|
|
e = { -- Word with case
|
|
{ "%u[%l%d]+%f[^%l%d]", "%f[%S][%l%d]+%f[^%l%d]", "%f[%P][%l%d]+%f[^%l%d]", "^[%l%d]+%f[^%l%d]" },
|
|
"^().*()$",
|
|
},
|
|
i = LazyVim.mini.ai_indent, -- indent
|
|
g = LazyVim.mini.ai_buffer, -- buffer
|
|
u = ai.gen_spec.function_call(), -- u for "Usage"
|
|
U = ai.gen_spec.function_call({ name_pattern = "[%w_]" }), -- without dot in function name
|
|
},
|
|
}
|
|
end,
|
|
config = function(_, opts)
|
|
require("mini.ai").setup(opts)
|
|
LazyVim.on_load("which-key.nvim", function()
|
|
vim.schedule(function()
|
|
LazyVim.mini.ai_whichkey(opts)
|
|
end)
|
|
end)
|
|
end,
|
|
},
|
|
|
|
{
|
|
"folke/lazydev.nvim",
|
|
ft = "lua",
|
|
cmd = "LazyDev",
|
|
opts = {
|
|
library = {
|
|
{ path = "luvit-meta/library", words = { "vim%.uv" } },
|
|
{ path = "LazyVim", words = { "LazyVim" } },
|
|
{ path = "snacks.nvim", words = { "Snacks" } },
|
|
{ path = "lazy.nvim", words = { "LazyVim" } },
|
|
},
|
|
},
|
|
},
|
|
-- Manage libuv types with lazy. Plugin will never be loaded
|
|
{ "Bilal2453/luvit-meta", lazy = true },
|
|
-- Add lazydev source to cmp
|
|
{
|
|
"hrsh7th/nvim-cmp",
|
|
optional = true,
|
|
opts = function(_, opts)
|
|
table.insert(opts.sources, { name = "lazydev", group_index = 0 })
|
|
end,
|
|
},
|
|
}
|