completion: migrate to shared cmp source options

This commit is contained in:
Ching Pei Yang 2024-12-23 02:48:03 +01:00
parent 593ac3b751
commit 0d0c885d70
No known key found for this signature in database
GPG key ID: B3841364253DC4C8
8 changed files with 75 additions and 67 deletions

View file

@ -58,8 +58,8 @@ in {
}; };
}; };
autocomplete.nvim-cmp = { autocomplete = {
sources = {copilot = "[Copilot]";}; nvim-cmp.sources = {copilot = "[Copilot]";};
sourcePlugins = ["copilot-cmp"]; sourcePlugins = ["copilot-cmp"];
}; };

View file

@ -12,6 +12,7 @@
borders = config.vim.ui.borders.plugins.nvim-cmp; borders = config.vim.ui.borders.plugins.nvim-cmp;
cfg = config.vim.autocomplete.nvim-cmp; cfg = config.vim.autocomplete.nvim-cmp;
autocompleteCfg = config.vim.autocomplete;
luasnipEnable = config.vim.snippets.luasnip.enable; luasnipEnable = config.vim.snippets.luasnip.enable;
getPluginName = plugin: getPluginName = plugin:
if typeOf plugin == "string" if typeOf plugin == "string"
@ -23,8 +24,6 @@
in { in {
config = mkIf cfg.enable { config = mkIf cfg.enable {
vim = { vim = {
autocomplete.enableSharedCmpSources = true;
lazy.plugins = { lazy.plugins = {
nvim-cmp = { nvim-cmp = {
package = "nvim-cmp"; package = "nvim-cmp";
@ -50,74 +49,77 @@ in {
${optionalString config.vim.lazy.enable ${optionalString config.vim.lazy.enable
(concatStringsSep "\n" (map (concatStringsSep "\n" (map
(package: "require('lz.n').trigger_load(${toLuaObject (getPluginName package)})") (package: "require('lz.n').trigger_load(${toLuaObject (getPluginName package)})")
cfg.sourcePlugins))} autocompleteCfg.sourcePlugins))}
''; '';
event = ["InsertEnter" "CmdlineEnter"]; event = ["InsertEnter" "CmdlineEnter"];
}; };
}; };
autocomplete.nvim-cmp = { autocomplete = {
sources = { enableSharedCmpSources = true;
nvim-cmp = null;
buffer = "[Buffer]";
path = "[Path]";
};
sourcePlugins = ["cmp-buffer" "cmp-path"]; sourcePlugins = ["cmp-buffer" "cmp-path"];
setupOpts = { nvim-cmp = {
sources = map (s: {name = s;}) (attrNames cfg.sources); sources = {
nvim-cmp = null;
window = mkIf borders.enable { buffer = "[Buffer]";
completion.border = borders.style; path = "[Path]";
documentation.border = borders.style;
}; };
formatting.format = cfg.format; setupOpts = {
sources = map (s: {name = s;}) (attrNames cfg.sources);
# `cmp` and `luasnip` are defined above, in the `nvim-cmp` section window = mkIf borders.enable {
mapping = { completion.border = borders.style;
${mappings.complete} = mkLuaInline "cmp.mapping.complete()"; documentation.border = borders.style;
${mappings.close} = mkLuaInline "cmp.mapping.abort()"; };
${mappings.scrollDocsUp} = mkLuaInline "cmp.mapping.scroll_docs(-4)";
${mappings.scrollDocsDown} = mkLuaInline "cmp.mapping.scroll_docs(4)";
${mappings.confirm} = mkLuaInline "cmp.mapping.confirm({ select = true })";
${mappings.next} = mkLuaInline '' formatting.format = cfg.format;
cmp.mapping(function(fallback)
local has_words_before = function()
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
if cmp.visible() then # `cmp` and `luasnip` are defined above, in the `nvim-cmp` section
cmp.select_next_item() mapping = {
${optionalString luasnipEnable '' ${mappings.complete} = mkLuaInline "cmp.mapping.complete()";
elseif luasnip.locally_jumpable(1) then ${mappings.close} = mkLuaInline "cmp.mapping.abort()";
luasnip.jump(1) ${mappings.scrollDocsUp} = mkLuaInline "cmp.mapping.scroll_docs(-4)";
''} ${mappings.scrollDocsDown} = mkLuaInline "cmp.mapping.scroll_docs(4)";
elseif has_words_before() then ${mappings.confirm} = mkLuaInline "cmp.mapping.confirm({ select = true })";
cmp.complete()
else
fallback()
end
end)
'';
${mappings.previous} = mkLuaInline '' ${mappings.next} = mkLuaInline ''
cmp.mapping(function(fallback) cmp.mapping(function(fallback)
if cmp.visible() then local has_words_before = function()
cmp.select_prev_item() local line, col = unpack(vim.api.nvim_win_get_cursor(0))
${optionalString luasnipEnable '' return col ~= 0 and vim.api.nvim_buf_get_lines(0, line - 1, line, true)[1]:sub(col, col):match("%s") == nil
elseif luasnip.locally_jumpable(-1) then end
luasnip.jump(-1)
''} if cmp.visible() then
else cmp.select_next_item()
fallback() ${optionalString luasnipEnable ''
end elseif luasnip.locally_jumpable(1) then
end) luasnip.jump(1)
''; ''}
elseif has_words_before() then
cmp.complete()
else
fallback()
end
end)
'';
${mappings.previous} = mkLuaInline ''
cmp.mapping(function(fallback)
if cmp.visible() then
cmp.select_prev_item()
${optionalString luasnipEnable ''
elseif luasnip.locally_jumpable(-1) then
luasnip.jump(-1)
''}
else
fallback()
end
end)
'';
};
}; };
}; };
}; };

View file

@ -6,7 +6,7 @@ in {
options.vim.autocomplete = { options.vim.autocomplete = {
enableSharedCmpSources = mkEnableOption "cmp sources shared by nvim-cmp and blink.cmp"; enableSharedCmpSources = mkEnableOption "cmp sources shared by nvim-cmp and blink.cmp";
cmpSourcePlugins = mkOption { sourcePlugins = mkOption {
type = listOf pluginType; type = listOf pluginType;
default = []; default = [];
description = "List of cmp source plugins."; description = "List of cmp source plugins.";

View file

@ -11,6 +11,7 @@
cfg = config.vim.lsp; cfg = config.vim.lsp;
usingNvimCmp = config.vim.autocomplete.nvim-cmp.enable; usingNvimCmp = config.vim.autocomplete.nvim-cmp.enable;
usingBlinkCmp = config.vim.autocomplete.blink-cmp.enable;
self = import ./module.nix {inherit config lib pkgs;}; self = import ./module.nix {inherit config lib pkgs;};
mappingDefinitions = self.options.vim.lsp.mappings; mappingDefinitions = self.options.vim.lsp.mappings;
@ -22,8 +23,8 @@
in { in {
config = mkIf cfg.enable { config = mkIf cfg.enable {
vim = { vim = {
autocomplete.nvim-cmp = { autocomplete = mkIf usingNvimCmp {
sources = {nvim_lsp = "[LSP]";}; nvim-cmp.sources = {nvim_lsp = "[LSP]";};
sourcePlugins = ["cmp-nvim-lsp"]; sourcePlugins = ["cmp-nvim-lsp"];
}; };
@ -170,6 +171,10 @@ in {
}, },
} }
''} ''}
${optionalString usingBlinkCmp ''
-- TODO
''}
''; '';
}; };
}; };

View file

@ -8,11 +8,12 @@
inherit (lib.nvim.lua) toLuaObject; inherit (lib.nvim.lua) toLuaObject;
cfg = config.vim.lsp.lspkind; cfg = config.vim.lsp.lspkind;
inherit (config.vim) autocomplete;
in { in {
config = mkIf cfg.enable { config = mkIf cfg.enable {
assertions = [ assertions = [
{ {
assertion = config.vim.autocomplete.nvim-cmp.enable; assertion = autocomplete.nvim-cmp.enable || autocomplete.blink-cmp.enable;
message = '' message = ''
While lspkind supports Neovim's native lsp upstream, using that over While lspkind supports Neovim's native lsp upstream, using that over
nvim-cmp isn't recommended, nor supported by nvf. nvim-cmp isn't recommended, nor supported by nvf.

View file

@ -48,7 +48,7 @@ in {
# If using nvim-cmp, otherwise set to false # If using nvim-cmp, otherwise set to false
type = bool; type = bool;
description = "If using nvim-cmp, otherwise set to false"; description = "If using nvim-cmp, otherwise set to false";
default = config.vim.autocomplete.nvim-cmp.enable; default = config.vim.autocomplete.enableSharedCmpSources;
}; };
}; };
}; };

View file

@ -17,8 +17,8 @@ in {
}; };
}; };
startPlugins = cfg.providers; startPlugins = cfg.providers;
autocomplete.nvim-cmp = { autocomplete = {
sources = {luasnip = "[LuaSnip]";}; nvim-cmp.sources = {luasnip = "[LuaSnip]";};
sourcePlugins = ["cmp-luasnip"]; sourcePlugins = ["cmp-luasnip"];
}; };
}; };

View file

@ -20,8 +20,8 @@ in {
vim = { vim = {
startPlugins = ["nvim-treesitter"]; startPlugins = ["nvim-treesitter"];
autocomplete.nvim-cmp = { autocomplete = {
sources = {treesitter = "[Treesitter]";}; nvim-cmp.sources = {treesitter = "[Treesitter]";};
sourcePlugins = ["cmp-treesitter"]; sourcePlugins = ["cmp-treesitter"];
}; };