104 lines
3.4 KiB
Nix
104 lines
3.4 KiB
Nix
{ lib, ... }: {
|
|
programs.nixvim = {
|
|
extraConfigLua = ''
|
|
function has_words_before()
|
|
unpack = unpack or table.unpack
|
|
local line, col = unpack(vim.api.nvim_win_get_cursor(0))
|
|
return col ~= 0
|
|
and vim.api.nvim_buf_get_lines(0, line - 1, line, true)[1]:sub(col, col):match("%s") == nil
|
|
end
|
|
function leave_snippet()
|
|
if
|
|
((vim.v.event.old_mode == "s" and vim.v.event.new_mode == "n") or vim.v.event.old_mode == "i")
|
|
and require("luasnip").session.current_nodes[vim.api.nvim_get_current_buf()]
|
|
and not require("luasnip").session.jump_active
|
|
then
|
|
require("luasnip").unlink_current()
|
|
end
|
|
end
|
|
|
|
-- stop snippets when you leave to normal mode
|
|
vim.api.nvim_command([[
|
|
autocmd ModeChanged * lua leave_snippet()
|
|
]])
|
|
'';
|
|
plugins = {
|
|
cmp = {
|
|
enable = true;
|
|
settings = {
|
|
formatting.format = lib.mkForce ''
|
|
function(entry, vim_item)
|
|
if vim.tbl_contains({ "path" }, entry.source.name) then
|
|
local icon, hl_group =
|
|
require("nvim-web-devicons").get_icon(entry:get_completion_item().label)
|
|
if icon then
|
|
vim_item.kind = icon
|
|
vim_item.kind_hl_group = hl_group
|
|
return vim_item
|
|
end
|
|
end
|
|
return require("lspkind").cmp_format({ with_text = true })(entry, vim_item)
|
|
end
|
|
'';
|
|
mapping = {
|
|
"<CR>" = "cmp.mapping.confirm({ select = false })";
|
|
"<Tab>" = ''
|
|
cmp.mapping(
|
|
function(callback)
|
|
if cmp.visible() then
|
|
cmp.select_next_item()
|
|
elseif require("luasnip").expand_or_locally_jumpable() then
|
|
require("luasnip").expand_or_jump()
|
|
elseif has_words_before() then
|
|
cmp.complete()
|
|
else
|
|
callback()
|
|
end
|
|
end
|
|
, {"i", "s"})
|
|
'';
|
|
"<S-Tab>" = ''
|
|
cmp.mapping(
|
|
function(callback)
|
|
if cmp.visible() then
|
|
cmp.select_prev_item()
|
|
elseif require("luasnip").jumpable(-1) then
|
|
require("luasnip").jump(-1)
|
|
else
|
|
callback()
|
|
end
|
|
end
|
|
, {"i", "s"})
|
|
'';
|
|
};
|
|
snippet.expand = ''
|
|
function(args)
|
|
require("luasnip").lsp_expand(args.body)
|
|
end
|
|
'';
|
|
sources = [
|
|
{
|
|
name = "luasnip";
|
|
priority = 40;
|
|
}
|
|
{
|
|
name = "nvim_lsp";
|
|
priority = 30;
|
|
entry_filter = ''
|
|
function(entry, _)
|
|
return entry:get_kind() ~= require("cmp").lsp.CompletionItemKind.Text
|
|
end
|
|
'';
|
|
}
|
|
];
|
|
};
|
|
};
|
|
lspkind = { enable = true; };
|
|
luasnip = {
|
|
enable = true;
|
|
fromVscode = [ { } ];
|
|
};
|
|
friendly-snippets.enable = true;
|
|
};
|
|
};
|
|
}
|