{lib, ...}: let
  inherit (lib) mkEnableOption mkMappingOption mkOption types;
in {
  options.vim = {
    autocomplete = {
      enable = mkEnableOption "enable autocomplete" // {default = false;};

      mappings = {
        complete = mkMappingOption "Complete [nvim-cmp]" "<C-Space>";
        confirm = mkMappingOption "Confirm [nvim-cmp]" "<CR>";
        next = mkMappingOption "Next item [nvim-cmp]" "<Tab>";
        previous = mkMappingOption "Previous item [nvim-cmp]" "<S-Tab>";
        close = mkMappingOption "Close [nvim-cmp]" "<C-e>";
        scrollDocsUp = mkMappingOption "Scroll docs up [nvim-cmp]" "<C-d>";
        scrollDocsDown = mkMappingOption "Scroll docs down [nvim-cmp]" "<C-f>";
      };

      type = mkOption {
        type = types.enum ["nvim-cmp"];
        default = "nvim-cmp";
        description = "Set the autocomplete plugin. Options: [nvim-cmp]";
      };

      sources = mkOption {
        description = ''
          Attribute set of source names for nvim-cmp.

          If an attribute set is provided, then the menu value of
          `vim_item` in the format will be set to the value (if
          utilizing the `nvim_cmp_menu_map` function).

          Note: only use a single attribute name per attribute set
        '';
        type = with types; attrsOf (nullOr str);
        default = {};
        example = ''
          {nvim-cmp = null; buffer = "[Buffer]";}
        '';
      };

      formatting = {
        format = mkOption {
          description = ''
            The function used to customize the appearance of the completion menu.

            If [](#opt-vim.lsp.lspkind.enable) is true, then the function
            will be called before modifications from lspkind.

            Default is to call the menu mapping function.
          '';
          type = types.str;
          default = "nvim_cmp_menu_map";
          example = lib.literalMD ''
            ```lua
            function(entry, vim_item)
              return vim_item
            end
            ```
          '';
        };
      };
    };
  };
}