mirror of
https://github.com/nix-community/nixvim.git
synced 2025-06-20 16:15:43 +02:00
338 lines
11 KiB
Nix
338 lines
11 KiB
Nix
{
|
|
lib,
|
|
helpers,
|
|
config,
|
|
...
|
|
}:
|
|
with lib;
|
|
let
|
|
cfg = config.plugins.cmp-git;
|
|
in
|
|
{
|
|
options.plugins.cmp-git.settings = helpers.neovim-plugin.mkSettingsOption {
|
|
pluginName = "cmp_git";
|
|
options = {
|
|
filetypes = helpers.defaultNullOpts.mkListOf types.str ''["gitcommit" "octo"]'' ''
|
|
Filetypes for which to trigger.
|
|
'';
|
|
|
|
remotes = helpers.defaultNullOpts.mkListOf types.str ''["upstream" "origin"]'' ''
|
|
List of git remotes.
|
|
'';
|
|
|
|
enableRemoteUrlRewrites = helpers.defaultNullOpts.mkBool false ''
|
|
Whether to enable remote URL rewrites.
|
|
'';
|
|
|
|
git = {
|
|
commits = {
|
|
limit = helpers.defaultNullOpts.mkUnsignedInt 100 ''
|
|
Max number of git commits to fetch.
|
|
'';
|
|
|
|
sort_by =
|
|
helpers.defaultNullOpts.mkNullable types.anything
|
|
''{__raw = "require('cmp_git.sort').git.commits";}''
|
|
"Function used to sort the commits.";
|
|
|
|
format =
|
|
helpers.defaultNullOpts.mkNullable types.anything
|
|
''{__raw = "require('cmp_git.format').git.commits";}''
|
|
"Function used to format the commits.";
|
|
};
|
|
};
|
|
|
|
github = {
|
|
hosts = helpers.defaultNullOpts.mkListOf types.str "[]" ''
|
|
List of private instances of github.
|
|
'';
|
|
|
|
issues = {
|
|
fields =
|
|
helpers.defaultNullOpts.mkListOf types.str ''["title" "number" "body" "updatedAt" "state"]''
|
|
"The fields used for issues.";
|
|
|
|
filter = helpers.defaultNullOpts.mkStr "all" ''
|
|
The filter to use when fetching issues.
|
|
'';
|
|
|
|
limit = helpers.defaultNullOpts.mkUnsignedInt 100 ''
|
|
Max number of issues to fetch.
|
|
'';
|
|
|
|
state = helpers.defaultNullOpts.mkStr "open" ''
|
|
Which issues to fetch (`"open"`, `"closed"` or `"all"`).
|
|
'';
|
|
|
|
sort_by =
|
|
helpers.defaultNullOpts.mkNullable types.anything
|
|
''{__raw = "require('cmp_git.sort').github.issues";}''
|
|
"Function used to sort the issues.";
|
|
|
|
format =
|
|
helpers.defaultNullOpts.mkNullable types.anything
|
|
''{__raw = "require('cmp_git.format').github.issues";}''
|
|
"Function used to format the issues.";
|
|
};
|
|
|
|
mentions = {
|
|
limit = helpers.defaultNullOpts.mkUnsignedInt 100 ''
|
|
Max number of mentions to fetch.
|
|
'';
|
|
|
|
sort_by =
|
|
helpers.defaultNullOpts.mkNullable types.anything
|
|
''{__raw = "require('cmp_git.sort').github.mentions";}''
|
|
"Function used to sort the mentions.";
|
|
|
|
format =
|
|
helpers.defaultNullOpts.mkNullable types.anything
|
|
''{__raw = "require('cmp_git.format').github.mentions";}''
|
|
"Function used to format the mentions.";
|
|
};
|
|
|
|
pull_requests = {
|
|
fields =
|
|
helpers.defaultNullOpts.mkListOf types.str ''["title" "number" "body" "updatedAt" "state"]''
|
|
"The fields used for pull requests.";
|
|
|
|
limit = helpers.defaultNullOpts.mkUnsignedInt 100 ''
|
|
Max number of pull requests to fetch.
|
|
'';
|
|
|
|
state = helpers.defaultNullOpts.mkStr "open" ''
|
|
Which issues to fetch (`"open"`, `"closed"`, `"merged"` or `"all"`).
|
|
'';
|
|
|
|
sort_by =
|
|
helpers.defaultNullOpts.mkNullable types.anything
|
|
''{__raw = "require('cmp_git.sort').github.pull_requests";}''
|
|
"Function used to sort the pull requests.";
|
|
|
|
format =
|
|
helpers.defaultNullOpts.mkNullable types.anything
|
|
''{__raw = "require('cmp_git.format').github.pull_requests";}''
|
|
"Function used to format the pull requests.";
|
|
};
|
|
};
|
|
|
|
gitlab = {
|
|
hosts = helpers.defaultNullOpts.mkListOf types.str "[]" ''
|
|
List of private instances of gitlab.
|
|
'';
|
|
|
|
issues = {
|
|
limit = helpers.defaultNullOpts.mkUnsignedInt 100 ''
|
|
Max number of issues to fetch.
|
|
'';
|
|
|
|
state = helpers.defaultNullOpts.mkStr "open" ''
|
|
Which issues to fetch (`"open"`, `"closed"` or `"all"`).
|
|
'';
|
|
|
|
sort_by =
|
|
helpers.defaultNullOpts.mkNullable types.anything
|
|
''{__raw = "require('cmp_git.sort').gitlab.issues";}''
|
|
"Function used to sort the issues.";
|
|
|
|
format =
|
|
helpers.defaultNullOpts.mkNullable types.anything
|
|
''{__raw = "require('cmp_git.format').gitlab.issues";}''
|
|
"Function used to format the issues.";
|
|
};
|
|
|
|
mentions = {
|
|
limit = helpers.defaultNullOpts.mkUnsignedInt 100 ''
|
|
Max number of mentions to fetch.
|
|
'';
|
|
|
|
sort_by =
|
|
helpers.defaultNullOpts.mkNullable types.anything
|
|
''{__raw = "require('cmp_git.sort').gitlab.mentions";}''
|
|
"Function used to sort the mentions.";
|
|
|
|
format =
|
|
helpers.defaultNullOpts.mkNullable types.anything
|
|
''{__raw = "require('cmp_git.format').gitlab.mentions";}''
|
|
"Function used to format the mentions.";
|
|
};
|
|
|
|
merge_requests = {
|
|
limit = helpers.defaultNullOpts.mkUnsignedInt 100 ''
|
|
Max number of merge requests to fetch.
|
|
'';
|
|
|
|
state = helpers.defaultNullOpts.mkStr "open" ''
|
|
Which issues to fetch (`"open"`, `"closed"`, `"locked"` or `"merged"`).
|
|
'';
|
|
|
|
sort_by =
|
|
helpers.defaultNullOpts.mkNullable types.anything
|
|
''{__raw = "require('cmp_git.sort').gitlab.merge_requests";}''
|
|
"Function used to sort the merge requests.";
|
|
|
|
format =
|
|
helpers.defaultNullOpts.mkNullable types.anything
|
|
''{__raw = "require('cmp_git.format').gitlab.merge_requests";}''
|
|
"Function used to format the merge requests.";
|
|
};
|
|
};
|
|
|
|
trigger_actions =
|
|
helpers.defaultNullOpts.mkListOf
|
|
(types.submodule {
|
|
options = {
|
|
debug_name = helpers.mkNullOrStr "Debug name.";
|
|
|
|
trigger_character = mkOption {
|
|
type = types.str;
|
|
example = ":";
|
|
description = ''
|
|
The trigger character.
|
|
Has to be a single character
|
|
'';
|
|
};
|
|
|
|
action = mkOption {
|
|
type = helpers.nixvimTypes.strLuaFn;
|
|
apply = helpers.mkRaw;
|
|
description = ''
|
|
The parameters to the action function are the different sources (currently `git`,
|
|
`gitlab` and `github`), the completion callback, the trigger character, the
|
|
parameters passed to complete from nvim-cmp, and the current git info.
|
|
'';
|
|
example = ''
|
|
function(sources, trigger_char, callback, params, git_info)
|
|
return sources.git:get_commits(callback, params, trigger_char)
|
|
end
|
|
'';
|
|
};
|
|
};
|
|
})
|
|
''
|
|
[
|
|
{
|
|
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
|
|
\'\';
|
|
}
|
|
]
|
|
''
|
|
''
|
|
If you want specific behaviour for a trigger or new behaviour for a trigger, you need to
|
|
add an entry in the `trigger_actions` list of the config.
|
|
The two necessary fields are the `trigger_character` and the `action`.
|
|
'';
|
|
};
|
|
|
|
example = {
|
|
remotes = [
|
|
"upstream"
|
|
"origin"
|
|
"foo"
|
|
];
|
|
github.issues = {
|
|
filter = "all";
|
|
limit = 250;
|
|
state = "all";
|
|
format.label.__raw = ''
|
|
function(_, issue)
|
|
local icon = ({
|
|
open = '',
|
|
closed = '',
|
|
})[string.lower(issue.state)]
|
|
return string.format('%s #%d: %s', icon, issue.number, issue.title)
|
|
end
|
|
'';
|
|
sort_by.__raw = ''
|
|
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
|
|
'';
|
|
};
|
|
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
|
|
'';
|
|
}
|
|
];
|
|
};
|
|
};
|
|
|
|
config = mkIf cfg.enable {
|
|
extraConfigLua = ''
|
|
require('cmp_git').setup(${helpers.toLuaObject cfg.settings})
|
|
'';
|
|
};
|
|
}
|