mirror of
				https://github.com/NotAShelf/nvf.git
				synced 2025-10-31 19:12:38 +00:00 
			
		
		
		
	 71081d084b
			
		
	
	
	
	
	71081d084b
		
			Some checks are pending
		
		
	
	Set up binary cache / cachix (default) (push) Waiting to run
				
			Set up binary cache / cachix (maximal) (push) Waiting to run
				
			Set up binary cache / cachix (nix) (push) Waiting to run
				
			Validate flake & check formatting / Validate Flake (push) Waiting to run
				
			Validate flake & check formatting / Formatting via Alejandra (push) Waiting to run
				
			Build and deploy documentation / Check latest commit (push) Waiting to run
				
			Build and deploy documentation / publish (push) Blocked by required conditions
				
			Check for typos in the source tree / check-typos (push) Waiting to run
				
			
		
			
				
	
	
		
			123 lines
		
	
	
	
		
			3.9 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
			
		
		
	
	
			123 lines
		
	
	
	
		
			3.9 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
| {
 | |
|   lib,
 | |
|   config,
 | |
|   ...
 | |
| }: let
 | |
|   inherit (lib.modules) mkIf mkMerge;
 | |
|   inherit (lib.strings) optionalString;
 | |
|   inherit (lib.generators) mkLuaInline;
 | |
|   inherit (lib.nvim.lua) toLuaObject;
 | |
|   inherit (lib.nvim.attrsets) mapListToAttrs;
 | |
|   inherit (builtins) attrNames typeOf tryEval concatStringsSep;
 | |
| 
 | |
|   borders = config.vim.ui.borders.plugins.nvim-cmp;
 | |
| 
 | |
|   cfg = config.vim.autocomplete.nvim-cmp;
 | |
|   luasnipEnable = config.vim.snippets.luasnip.enable;
 | |
|   getPluginName = plugin:
 | |
|     if typeOf plugin == "string"
 | |
|     then plugin
 | |
|     else if (plugin ? pname && (tryEval plugin.pname).success)
 | |
|     then plugin.pname
 | |
|     else plugin.name;
 | |
|   inherit (cfg) mappings;
 | |
| in {
 | |
|   config = mkIf cfg.enable {
 | |
|     vim = {
 | |
|       lazy.plugins = {
 | |
|         nvim-cmp = {
 | |
|           package = "nvim-cmp";
 | |
|           after = ''
 | |
|             ${optionalString luasnipEnable "local luasnip = require('luasnip')"}
 | |
|             local cmp = require("cmp")
 | |
| 
 | |
|             local kinds = require("cmp.types").lsp.CompletionItemKind
 | |
|             local deprio = function(kind)
 | |
|               return function(e1, e2)
 | |
|                 if e1:get_kind() == kind then
 | |
|                   return false
 | |
|                 end
 | |
|                 if e2:get_kind() == kind then
 | |
|                   return true
 | |
|                 end
 | |
|                 return nil
 | |
|               end
 | |
|             end
 | |
| 
 | |
|             cmp.setup(${toLuaObject cfg.setupOpts})
 | |
| 
 | |
|             ${optionalString config.vim.lazy.enable
 | |
|               (concatStringsSep "\n" (map
 | |
|                 (package: "require('lz.n').trigger_load(${toLuaObject (getPluginName package)})")
 | |
|                 cfg.sourcePlugins))}
 | |
|           '';
 | |
| 
 | |
|           event = ["InsertEnter" "CmdlineEnter"];
 | |
|         };
 | |
|       };
 | |
| 
 | |
|       autocomplete = {
 | |
|         enableSharedCmpSources = true;
 | |
| 
 | |
|         nvim-cmp = {
 | |
|           sourcePlugins = ["cmp-buffer" "cmp-path"];
 | |
| 
 | |
|           setupOpts = {
 | |
|             sources = map (s: {name = s;}) (attrNames cfg.sources);
 | |
| 
 | |
|             window = mkIf borders.enable {
 | |
|               completion.border = borders.style;
 | |
|               documentation.border = borders.style;
 | |
|             };
 | |
| 
 | |
|             formatting.format = cfg.format;
 | |
| 
 | |
|             # `cmp` and `luasnip` are defined above, in the `nvim-cmp` section
 | |
|             mapping = {
 | |
|               ${mappings.complete} = mkLuaInline "cmp.mapping.complete()";
 | |
|               ${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 ''
 | |
|                 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.select_next_item()
 | |
|                     ${optionalString luasnipEnable ''
 | |
|                   elseif luasnip.locally_jumpable(1) then
 | |
|                     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)
 | |
|               '';
 | |
|             };
 | |
|           };
 | |
|         };
 | |
|       };
 | |
|     };
 | |
|   };
 | |
| }
 |