{ ... }: {
  programs.nixvim.plugins = {
    # Snippet engine for neovim
    luasnip.enable = true;
    cmp_luasnip.enable = true;
    # CMP  Addons
    cmp-buffer.enable = true;
    cmp-path.enable = true;
    cmp-nvim-lsp.enable = true;
    cmp-nvim-lsp-document-symbol.enable = true;
    cmp-nvim-lsp-signature-help.enable = true;

    cmp = {
      enable = true;
      autoEnableSources = true;
      settings = { 
        mapping = {
          "<C-Space>" = "cmp.mapping.complete()";
          "<C-d>" = "cmp.mapping.scroll_docs(-4)";
          "<C-e>" = "cmp.mapping.close()";
          "<C-f>" = "cmp.mapping.scroll_docs(4)";
          "<CR>"  = "cmp.mapping.confirm({ select = true })";
          "<S-Tab>" =  "cmp.mapping.select_prev_item()";
          "<Tab>"   = "cmp.mapping.select_next_item()";
        };
        window = {
          completion.border = "rounded"; 
          documentation.border = "rounded";
        };
        sources = [
          { name = "nvim_lua"; }
          { name = "nvim_lsp"; }
          { name = "calc"; }
          { name = "path"; }
          { name = "buffer"; }
          { name = "luasnip"; }
        ];
        snippet.expand = "luasnip";
        formatting = {
          fields = [ "menu" "abbr" "kind" ];
          # https://rsdlt.github.io/posts/rust-nvim-ide-guide-walkthrough-development-debug/
          format = ''
            function(entry, item)
              local menu_icon = {
                nvim_lsp = 'λ',
                luasnip = '⋗',
                buffer = 'Ω',
                path = '🖫',
              }
              item.menu = menu_icon[entry.source.name]
              return item
            end,
            '';
        };
      };
    };
  };
}