return { {
  'Saghen/blink.cmp',
  -- optional: provides snippets for the snippet source
  dependencies = {
    'rafamadriz/friendly-snippets',
    'xzbdmw/colorful-menu.nvim',
    'disrupted/blink-cmp-conventional-commits',
    'moyiz/blink-emoji.nvim',
    'milanglacier/minuet-ai.nvim',
    'mikavilpas/blink-ripgrep.nvim',
  },

  -- use a release tag to download pre-built binaries
  version = '*',
  -- AND/OR build from source, requires nightly: https://rust-lang.github.io/rustup/concepts/channels.html#working-with-nightly-rust
  -- build = 'cargo build --release',
  -- If you use nix, you can build from source using latest nightly rust with:
  -- build = 'nix run .#build-plugin',

  ---@module 'blink.cmp'
  ---@type blink.cmp.Config
  opts = {
    -- 'default' for mappings similar to built-in completion
    -- 'super-tab' for mappings similar to vscode (tab to accept, arrow keys to navigate)
    -- 'enter' for mappings similar to 'super-tab' but with 'enter' to accept
    -- See the full "keymap" documentation for information on defining your own keymap.
    keymap = {
      preset = 'default',
      --['A-y'] = require('minuet').make_blink_map()
    },

    appearance = {
      -- -- Sets the fallback highlight groups to nvim-cmp's highlight groups
      -- -- Useful for when your theme doesn't support blink.cmp
      -- -- Will be removed in a future release
      -- use_nvim_cmp_as_default = true,
      -- Set to 'mono' for 'Nerd Font Mono' or 'normal' for 'Nerd Font'
      -- Adjusts spacing to ensure icons are aligned
      nerd_font_variant = 'mono'
    },

    -- Default list of enabled providers defined so that you can extend it
    -- elsewhere in your config, without redefining it, due to `opts_extend`
    sources = {
      default = {
          'conventional_commits',
          'lsp',
          'path',
          'snippets',
          'buffer',
          'emoji',
          --'ripgrep',
          --[[ 'minuet' ]]
      },
      providers = {
        conventional_commits = {
          name = "Conventional Commits",
          module = 'blink-cmp-conventional-commits',
          enabled = function()
            return vim.bo.filetype == 'gitcommit'
          end,
          opts = {}
        },
        emoji = {
          module = 'blink-emoji',
          name = "Emoji",
          score_offset = 15,
          opts = { insert = true },
          should_show_items = function()
            return vim.tbl_contains({ "gitcommit", "markdown" }, vim.o.filetype)
          end,
        },
        minuet = {
          name = 'minuet',
          module = 'minuet.blink',
          async = true,
          -- Should match minuet.config.request_timeout * 1000,
          -- since minuet.config.request_timeout is in seconds
          timeout_ms = 3000,
          score_offset = 50, -- Gives minuet higher priority among suggestions
        },
        ripgrep = {
            module = 'blink-ripgrep',
            name = 'Ripgrep',
            opts = {},
        },
      }
    },

    completion = {
      menu = {
        draw = {
          columns = { { "kind_icon" }, { "label", gap = 1 } },
          components = {
            label = {
              text = function(ctx)
                return require("colorful-menu").blink_components_text(ctx)
              end,
              highlight = function(ctx)
                return require("colorful-menu").blink_components_highlight(ctx)
              end,
            }
          }
        }
      },
      --trigger = { prefetch_on_insert = false },

      accept = { auto_brackets = { enabled = false }, },
      ghost_text = { enabled = false },
    },
    -- experimental:
    signature = { enabled = true },
  },
  opts_extend = { "sources.default" }
}, {
  "xzbdmw/colorful-menu.nvim",
  config = function()
    -- You don't need to set these options.
    require("colorful-menu").setup({
      ls = {
        lua_ls = {
          -- Maybe you want to dim arguments a bit.
          arguments_hl = "@comment",
        },
        gopls = {
          -- By default, we render variable/function's type in the right most side,
          -- to make them not to crowd together with the original label.

          -- when true:
          -- foo             *Foo
          -- ast         "go/ast"

          -- when false:
          -- foo *Foo
          -- ast "go/ast"
          align_type_to_right = true,
          -- When true, label for field and variable will format like "foo: Foo"
          -- instead of go's original syntax "foo Foo". If align_type_to_right is
          -- true, this option has no effect.
          add_colon_before_type = false,
        },
        -- for lsp_config or typescript-tools
        ts_ls = {
          extra_info_hl = "@comment",
        },
        vtsls = {
          extra_info_hl = "@comment",
        },
        ["rust-analyzer"] = {
          -- Such as (as Iterator), (use std::io).
          extra_info_hl = "@comment",
          -- Similar to the same setting of gopls.
          align_type_to_right = true,
        },
        clangd = {
          -- Such as "From <stdio.h>".
          extra_info_hl = "@comment",
          -- Similar to the same setting of gopls.
          align_type_to_right = true,
          -- the hl group of leading dot of "•std::filesystem::permissions(..)"
          import_dot_hl = "@comment",
        },
        zls = {
          -- Similar to the same setting of gopls.
          align_type_to_right = true,
        },
        roslyn = {
          extra_info_hl = "@comment",
        },
        -- The same applies to pyright/pylance
        basedpyright = {
          -- It is usually import path such as "os"
          extra_info_hl = "@comment",
        },

        -- If true, try to highlight "not supported" languages.
        fallback = true,
      },
      -- If the built-in logic fails to find a suitable highlight group,
      -- this highlight is applied to the label.
      fallback_highlight = "@variable",
      -- If provided, the plugin truncates the final displayed text to
      -- this width (measured in display cells). Any highlights that extend
      -- beyond the truncation point are ignored. When set to a float
      -- between 0 and 1, it'll be treated as percentage of the width of
      -- the window: math.floor(max_width * vim.api.nvim_win_get_width(0))
      -- Default 60.
      max_width = 60,
    })
  end
} }
