{ config, pkgs, lib, ... }: with lib; let cfg = config.plugins.lspkind; helpers = import ../helpers.nix {inherit lib;}; in { options.plugins.lspkind = helpers.extraOptionsOptions // { enable = mkEnableOption "lspkind.nvim"; package = helpers.mkPackageOption "lspkind" pkgs.vimPlugins.lspkind-nvim; mode = helpers.defaultNullOpts.mkEnum ["text" "text_symbol" "symbol_text" "symbol"] "symbol_text" "Defines how annotations are shown"; preset = helpers.defaultNullOpts.mkEnum ["default" "codicons"] "codicons" "Default symbol map"; symbolMap = helpers.mkNullOrOption (types.attrsOf types.str) "Override preset symbols"; cmp = { enable = mkOption { type = types.bool; default = true; description = "Integrate with nvim-cmp"; }; maxWidth = helpers.mkNullOrOption types.int "Maximum number of characters to show in the popup"; ellipsisChar = helpers.mkNullOrOption types.str "Character to show when the popup exceeds maxwidth"; menu = helpers.mkNullOrOption (types.attrsOf types.str) "Show source names in the popup"; after = helpers.mkNullOrOption types.str "Function to run after calculating the formatting. function(entry, vim_item, kind)"; }; }; config = let doCmp = cfg.cmp.enable && config.plugins.nvim-cmp.enable; options = { mode = cfg.mode; preset = cfg.preset; symbol_map = cfg.symbolMap; } // ( if doCmp then { maxwidth = cfg.cmp.maxWidth; ellipsis_char = cfg.cmp.ellipsisChar; menu = cfg.cmp.menu; } else {} ) // cfg.extraOptions; in mkIf cfg.enable { extraPlugins = [cfg.package]; extraConfigLua = optionalString (!doCmp) '' require('lspkind').init(${helpers.toLuaObject options}) ''; plugins.nvim-cmp.formatting.format = if cfg.cmp.after != null then '' function(entry, vim_item) local kind = require('lspkind').cmp_format(${helpers.toLuaObject options})(entry, vim_item) return (${cfg.cmp.after})(entry, vim_after, kind) end '' else '' require('lspkind').cmp_format(${helpers.toLuaObject options}) ''; }; }