{
  defaults = {
    plugins = {
      cmp = {
        enable = true;
        settings.sources = [ { name = "git"; } ];
      };

      cmp-git.settings = {
        filetypes = [
          "gitcommit"
          "octo"
        ];
        remotes = [
          "upstream"
          "origin"
        ];
        enableRemoteUrlRewrites = false;
        git = {
          commits = {
            limit = 100;
            sort_by = "require('cmp_git.sort').git.commits";
            format = "require('cmp_git.format').git.commits";
          };
        };
        github = {
          hosts = [ ];
          issues = {
            fields = [
              "title"
              "number"
              "body"
              "updatedAt"
              "state"
            ];
            filter = "all";
            limit = 100;
            state = "open";
            sort_by = "require('cmp_git.sort').github.issues";
            format = "require('cmp_git.format').github.issues";
          };
          mentions = {
            limit = 100;
            sort_by = "require('cmp_git.sort').github.mentions";
            format = "require('cmp_git.format').github.mentions";
          };
          pull_requests = {
            fields = [
              "title"
              "number"
              "body"
              "updatedAt"
              "state"
            ];
            limit = 100;
            state = "open";
            sort_by = "require('cmp_git.sort').github.pull_requests";
            format = "require('cmp_git.format').github.pull_requests";
          };
        };
        gitlab = {
          hosts = [ ];
          issues = {
            limit = 100;
            state = "opened";
            sort_by = "require('cmp_git.sort').gitlab.pull_requests";
            format = "require('cmp_git.format').gitlab.pull_requests";
          };
          mentions = {
            limit = 100;
            sort_by = "require('cmp_git.sort').gitlab.mentions";
            format = "require('cmp_git.format').gitlab.mentions";
          };
          merge_requests = {
            limit = 100;
            state = "opened";
            sort_by = "require('cmp_git.sort').gitlab.merge_requests";
            format = "require('cmp_git.format').gitlab.merge_requests";
          };
        };
        trigger_actions = [
          {
            debug_name = "git_commits";
            trigger_character = ":";
            action = ''
              function(sources, trigger_char, callback, params, git_info)
                return sources.git:get_commits(callback, params, trigger_char)
              end
            '';
          }
          {
            debug_name = "gitlab_issues";
            trigger_character = "#";
            action = ''
              function(sources, trigger_char, callback, params, git_info)
                  return sources.gitlab:get_issues(callback, git_info, trigger_char)
              end
            '';
          }
          {
            debug_name = "gitlab_mentions";
            trigger_character = "@";
            action = ''
              function(sources, trigger_char, callback, params, git_info)
                  return sources.gitlab:get_mentions(callback, git_info, trigger_char)
              end
            '';
          }
          {
            debug_name = "gitlab_mrs";
            trigger_character = "!";
            action = ''
              function(sources, trigger_char, callback, params, git_info)
                return sources.gitlab:get_merge_requests(callback, git_info, trigger_char)
              end
            '';
          }
          {
            debug_name = "github_issues_and_pr";
            trigger_character = "#";
            action = ''
              function(sources, trigger_char, callback, params, git_info)
                return sources.github:get_issues_and_prs(callback, git_info, trigger_char)
              end
            '';
          }
          {
            debug_name = "github_mentions";
            trigger_character = "@";
            action = ''
              function(sources, trigger_char, callback, params, git_info)
                return sources.github:get_mentions(callback, git_info, trigger_char)
              end
            '';
          }
        ];
      };
    };
  };

  example = {
    plugins = {
      cmp = {
        enable = true;
        settings.sources = [ { name = "git"; } ];
      };

      cmp-git.settings = {
        remotes = [
          "upstream"
          "origin"
          "foo"
        ];
        github = {
          issues = {
            filter = "all";
            limit = 250;
            state = "all";
            format = ''
              function(_, issue)
                local icon = ({
                  open = '',
                  closed = '',
                })[string.lower(issue.state)]
                return string.format('%s #%d: %s', icon, issue.number, issue.title)
              end
            '';
            sort_by = ''
              function(issue)
                local kind_rank = issue.pull_request and 1 or 0
                local state_rank = issue.state == 'open' and 0 or 1
                local age = os.difftime(os.time(), require('cmp_git.utils').parse_github_date(issue.updatedAt))
                return string.format('%d%d%010d', kind_rank, state_rank, age)
              end
            '';
            filter_fn.__raw = ''
              function(trigger_char, issue)
                return string.format('%s %s %s', trigger_char, issue.number, issue.title)
              end
            '';
          };
          mentions = {
            limit = 250;
            sort_by = null;
            filter_fn.__raw = ''
              function(trigger_char, mention)
                return string.format('%s %s %s', trigger_char, mention.username)
              end
            '';
          };
          pull_requests = {
            limit = 250;
            state = "all";
            format = ''
              function(_, pr)
                local icon = ({
                  open = '',
                  closed = '',
                })[string.lower(pr.state)]
                return string.format('%s #%d: %s', icon, pr.number, pr.title)
              end
            '';
            sort_by = ''
              function(pr)
                local state_rank = pr.state == 'open' and 0 or 1
                local age = os.difftime(os.time(), require('cmp_git.utils').parse_github_date(pr.updatedAt))
                return string.format('%d%010d', state_rank, age)
              end
            '';
            filter_fn.__raw = ''
              function(trigger_char, pr)
                return string.format('%s %s %s', trigger_char, pr.number, pr.title)
              end
            '';
          };
        };
        trigger_actions = [
          {
            debug_name = "git_commits";
            trigger_character = ":";
            action = ''
              function(sources, trigger_char, callback, params, git_info)
                return sources.git:get_commits(callback, params, trigger_char)
              end
            '';
          }
          {
            debug_name = "github_issues";
            trigger_character = "#";
            action = ''
              function(sources, trigger_char, callback, params, git_info)
                return sources.github:get_issues(callback, git_info, trigger_char)
              end
            '';
          }
          {
            debug_name = "github_pulls";
            trigger_character = "!";
            action = ''
              function(sources, trigger_char, callback, params, git_info)
                return sources.github:get_pull_requests(callback, git_info, trigger_char)
              end
            '';
          }
          {
            debug_name = "github_mentions";
            trigger_character = "@";
            action = ''
              function(sources, trigger_char, callback, params, git_info)
                return sources.github:get_mentions(callback, git_info, trigger_char)
              end
            '';
          }
          {
            debug_name = "gitlab_issues";
            trigger_character = "#";
            action = ''
              function(sources, trigger_char, callback, params, git_info)
                return sources.gitlab:get_issues(callback, git_info, trigger_char)
              end
            '';
          }
          {
            debug_name = "gitlab_mentions";
            trigger_character = "@";
            action = ''
              function(sources, trigger_char, callback, params, git_info)
                return sources.gitlab:get_mentions(callback, git_info, trigger_char)
              end
            '';
          }
          {
            debug_name = "gitlab_mrs";
            trigger_character = "!";
            action = ''
              function(sources, trigger_char, callback, params, git_info)
                return sources.gitlab:get_merge_requests(callback, git_info, trigger_char)
              end
            '';
          }
        ];
      };
    };
  };
}