mirror of
https://github.com/nix-community/nixvim.git
synced 2025-06-21 08:35:43 +02:00
plugins/diffview: init + test (#457)
This commit is contained in:
parent
6693b63ff7
commit
27bb28f23e
4 changed files with 877 additions and 0 deletions
|
@ -141,6 +141,7 @@ with lib; rec {
|
||||||
else "false"
|
else "false"
|
||||||
);
|
);
|
||||||
mkStr = default: mkNullable lib.types.str ''${builtins.toString default}'';
|
mkStr = default: mkNullable lib.types.str ''${builtins.toString default}'';
|
||||||
|
mkAttributeSet = default: mkNullable lib.types.attrs ''"${default}"'';
|
||||||
mkEnum = enum: default: mkNullable (lib.types.enum enum) ''"${default}"'';
|
mkEnum = enum: default: mkNullable (lib.types.enum enum) ''"${default}"'';
|
||||||
mkEnumFirstDefault = enum: mkEnum enum (head enum);
|
mkEnumFirstDefault = enum: mkEnum enum (head enum);
|
||||||
mkBorder = default: name: desc:
|
mkBorder = default: name: desc:
|
||||||
|
|
|
@ -25,6 +25,7 @@
|
||||||
./filetrees/neo-tree.nix
|
./filetrees/neo-tree.nix
|
||||||
./filetrees/nvim-tree.nix
|
./filetrees/nvim-tree.nix
|
||||||
|
|
||||||
|
./git/diffview.nix
|
||||||
./git/fugitive.nix
|
./git/fugitive.nix
|
||||||
./git/gitgutter.nix
|
./git/gitgutter.nix
|
||||||
./git/gitmessenger.nix
|
./git/gitmessenger.nix
|
||||||
|
|
711
plugins/git/diffview.nix
Normal file
711
plugins/git/diffview.nix
Normal file
|
@ -0,0 +1,711 @@
|
||||||
|
{
|
||||||
|
pkgs,
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
with lib; let
|
||||||
|
cfg = config.plugins.diffview;
|
||||||
|
helpers = import ../helpers.nix {inherit lib;};
|
||||||
|
mkWinConfig = type: width: height: position:
|
||||||
|
with helpers.defaultNullOpts; {
|
||||||
|
type = mkEnum ["split" "float"] type ''
|
||||||
|
Determines whether the window should be a float or a normal
|
||||||
|
split.
|
||||||
|
'';
|
||||||
|
|
||||||
|
width = mkInt width ''
|
||||||
|
The width of the window (in character cells). If `type` is
|
||||||
|
`"split"` then this is only applicable when `position` is
|
||||||
|
`"left"|"right"`.
|
||||||
|
'';
|
||||||
|
|
||||||
|
height = mkInt height ''
|
||||||
|
The height of the window (in character cells). If `type` is
|
||||||
|
`"split"` then this is only applicable when `position` is
|
||||||
|
`"top"|"bottom"`.
|
||||||
|
'';
|
||||||
|
|
||||||
|
position = mkEnum ["left" "top" "right" "bottom"] position ''
|
||||||
|
Determines where the panel is positioned (only when
|
||||||
|
`type="split"`).
|
||||||
|
'';
|
||||||
|
|
||||||
|
relative = mkEnum ["editor" "win"] "editor" ''
|
||||||
|
Determines what the `position` is relative to (when
|
||||||
|
`type="split"`).
|
||||||
|
'';
|
||||||
|
|
||||||
|
win = mkInt 0 ''
|
||||||
|
The window handle of the target relative window (when
|
||||||
|
`type="split"`. Only when `relative="win"`). Use `0` for
|
||||||
|
current window.
|
||||||
|
'';
|
||||||
|
|
||||||
|
winOpts = mkAttributeSet "{}" ''
|
||||||
|
Table of window local options (see |vim.opt_local|).
|
||||||
|
These options are applied whenever the window is opened.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
in {
|
||||||
|
options.plugins.diffview = with helpers.defaultNullOpts;
|
||||||
|
helpers.extraOptionsOptions
|
||||||
|
// {
|
||||||
|
enable = mkEnableOption "diffview";
|
||||||
|
|
||||||
|
package = helpers.mkPackageOption "diffview" pkgs.vimPlugins.diffview-nvim;
|
||||||
|
|
||||||
|
diffBinaries = mkBool false ''
|
||||||
|
Show diffs for binaries
|
||||||
|
'';
|
||||||
|
|
||||||
|
enhancedDiffHl = mkBool false ''
|
||||||
|
See ':h diffview-config-enhanced_diff_hl'
|
||||||
|
'';
|
||||||
|
|
||||||
|
gitCmd = mkNullable (types.listOf types.str) ''[ "git" ]'' ''
|
||||||
|
The git executable followed by default args.
|
||||||
|
'';
|
||||||
|
|
||||||
|
hgCmd = mkNullable (types.listOf types.str) ''[ "hg" ]'' ''
|
||||||
|
The hg executable followed by default args.
|
||||||
|
'';
|
||||||
|
|
||||||
|
useIcons = mkOption {
|
||||||
|
type = types.bool;
|
||||||
|
description = "Requires nvim-web-devicons";
|
||||||
|
default = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
showHelpHints = mkBool true ''
|
||||||
|
Show hints for how to open the help panel
|
||||||
|
'';
|
||||||
|
|
||||||
|
watchIndex = mkBool true ''
|
||||||
|
Update views and index buffers when the git index changes.
|
||||||
|
'';
|
||||||
|
|
||||||
|
icons = {
|
||||||
|
folderClosed = mkStr "" ''
|
||||||
|
Only applies when use_icons is true.
|
||||||
|
'';
|
||||||
|
|
||||||
|
folderOpen = mkStr "" ''
|
||||||
|
Only applies when use_icons is true.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
signs = {
|
||||||
|
foldClosed = mkStr "" "";
|
||||||
|
|
||||||
|
foldOpen = mkStr "" "";
|
||||||
|
|
||||||
|
done = mkStr "✓" "";
|
||||||
|
};
|
||||||
|
|
||||||
|
view = let
|
||||||
|
layoutsDescription = ''
|
||||||
|
Configure the layout and behavior of different types of views.
|
||||||
|
For more info, see ':h diffview-config-view.x.layout'.
|
||||||
|
'';
|
||||||
|
diff2HorizontalDescription = ''
|
||||||
|
diff2_horizontal:
|
||||||
|
|
||||||
|
| A | B |
|
||||||
|
'';
|
||||||
|
diff2VerticalDescription = ''
|
||||||
|
diff2_vertical:
|
||||||
|
|
||||||
|
|
||||||
|
A
|
||||||
|
|
||||||
|
─
|
||||||
|
|
||||||
|
B
|
||||||
|
'';
|
||||||
|
in {
|
||||||
|
default = {
|
||||||
|
layout = mkEnum ["diff2_horizontal" "diff2_vertical"] "diff2_horizontal" ''
|
||||||
|
Config for changed files, and staged files in diff views.
|
||||||
|
${layoutsDescription}
|
||||||
|
- A: Old state
|
||||||
|
- B: New state
|
||||||
|
|
||||||
|
${diff2HorizontalDescription}
|
||||||
|
|
||||||
|
${diff2VerticalDescription}
|
||||||
|
'';
|
||||||
|
|
||||||
|
winbarInfo = mkBool false ''
|
||||||
|
See ':h diffview-config-view.x.winbar_info'
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
mergeTool = {
|
||||||
|
layout = mkEnum ["diff1_plain" "diff3_horizontal" "diff3_vertical" "diff3_mixed" "diff4_mixed"] "diff3_horizontal" ''
|
||||||
|
Config for conflicted files in diff views during a merge or rebase.
|
||||||
|
${layoutsDescription}
|
||||||
|
- A: OURS (current branch)
|
||||||
|
- B: LOCAL (the file as it currently exists on disk)
|
||||||
|
- C: THEIRS (incoming branch)
|
||||||
|
- D: BASE (common ancestor)
|
||||||
|
|
||||||
|
diff1_plain:
|
||||||
|
|
||||||
|
B
|
||||||
|
|
||||||
|
diff3_horizontal:
|
||||||
|
|
||||||
|
A | B | C
|
||||||
|
|
||||||
|
diff3_vertical:
|
||||||
|
|
||||||
|
A
|
||||||
|
|
||||||
|
B
|
||||||
|
|
||||||
|
C
|
||||||
|
|
||||||
|
diff3_mixed:
|
||||||
|
|
||||||
|
A | C
|
||||||
|
|
||||||
|
B
|
||||||
|
|
||||||
|
diff4_mixed:
|
||||||
|
|
||||||
|
A | D | C
|
||||||
|
|
||||||
|
B
|
||||||
|
|
||||||
|
'';
|
||||||
|
|
||||||
|
disableDiagnostics = mkBool true ''
|
||||||
|
Temporarily disable diagnostics for conflict buffers while in the view.
|
||||||
|
'';
|
||||||
|
|
||||||
|
winbarInfo = mkBool true ''
|
||||||
|
See ':h diffview-config-view.x.winbar_info'
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
fileHistory = {
|
||||||
|
layout = mkEnum ["diff2_horizontal" "diff2_vertical"] "diff2_horizontal" ''
|
||||||
|
Config for changed files in file history views.
|
||||||
|
${layoutsDescription}
|
||||||
|
- A: Old state
|
||||||
|
- B: New state
|
||||||
|
|
||||||
|
${diff2HorizontalDescription}
|
||||||
|
|
||||||
|
${diff2VerticalDescription}
|
||||||
|
'';
|
||||||
|
|
||||||
|
winbarInfo = mkBool false ''
|
||||||
|
See ':h diffview-config-view.x.winbar_info'
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
filePanel = {
|
||||||
|
listingStyle = mkEnum ["list" "tree"] "tree" ''
|
||||||
|
One of 'list' or 'tree'
|
||||||
|
'';
|
||||||
|
|
||||||
|
treeOptions = let
|
||||||
|
commonDesc = "Only applies when listing_style is 'tree'";
|
||||||
|
in {
|
||||||
|
flattenDirs = mkBool true ''
|
||||||
|
Flatten dirs that only contain one single dir
|
||||||
|
${commonDesc}
|
||||||
|
'';
|
||||||
|
|
||||||
|
folderStatuses = mkEnum ["never" "only_folded" "always"] "only_folded" ''
|
||||||
|
One of 'never', 'only_folded' or 'always'.
|
||||||
|
${commonDesc}
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
winConfig = mkWinConfig "split" 35 "" "left";
|
||||||
|
};
|
||||||
|
fileHistoryPanel = {
|
||||||
|
logOptions = let
|
||||||
|
mkNullStr = helpers.mkNullOrOption types.str;
|
||||||
|
mkNullBool = helpers.mkNullOrOption types.bool;
|
||||||
|
logOptions = {
|
||||||
|
base = mkNullStr ''
|
||||||
|
Specify a base git rev from which the right side of the diff
|
||||||
|
will be created. Use the special value `LOCAL` to use the
|
||||||
|
local version of the file.
|
||||||
|
'';
|
||||||
|
|
||||||
|
revRange = mkNullStr ''
|
||||||
|
List only the commits in the specified revision range.
|
||||||
|
'';
|
||||||
|
|
||||||
|
pathArgs = mkNullable (types.listOf types.str) "[]" ''
|
||||||
|
Limit the target files to only the files matching the given
|
||||||
|
path arguments (git pathspec is supported).
|
||||||
|
'';
|
||||||
|
|
||||||
|
follow = mkNullBool ''
|
||||||
|
Follow renames (only for single file).
|
||||||
|
'';
|
||||||
|
|
||||||
|
firstParent = mkNullBool ''
|
||||||
|
Follow only the first parent upon seeing a merge commit.
|
||||||
|
'';
|
||||||
|
|
||||||
|
showPulls = mkNullBool ''
|
||||||
|
Show merge commits that are not TREESAME to its first parent,
|
||||||
|
but are to a later parent.
|
||||||
|
'';
|
||||||
|
|
||||||
|
reflog = mkNullBool ''
|
||||||
|
Include all reachable objects mentioned by reflogs.
|
||||||
|
'';
|
||||||
|
|
||||||
|
all = mkNullBool ''
|
||||||
|
Include all refs.
|
||||||
|
'';
|
||||||
|
|
||||||
|
merges = mkNullBool ''
|
||||||
|
List only merge commits.
|
||||||
|
'';
|
||||||
|
|
||||||
|
noMerges = mkNullBool ''
|
||||||
|
List no merge commits.
|
||||||
|
'';
|
||||||
|
|
||||||
|
reverse = mkNullBool ''
|
||||||
|
List commits in reverse order.
|
||||||
|
'';
|
||||||
|
|
||||||
|
cherryPick = mkNullBool ''
|
||||||
|
Omit commits that introduce the same change as another commit
|
||||||
|
on the "other side" when the set of commits are limited with
|
||||||
|
symmetric difference.
|
||||||
|
'';
|
||||||
|
|
||||||
|
leftOnly = mkNullBool ''
|
||||||
|
List only the commits on the left side of a symmetric
|
||||||
|
difference.
|
||||||
|
'';
|
||||||
|
|
||||||
|
rightOnly = mkNullBool ''
|
||||||
|
List only the commits on the right side of a symmetric
|
||||||
|
difference.
|
||||||
|
'';
|
||||||
|
|
||||||
|
maxCount = helpers.mkNullOrOption types.int ''
|
||||||
|
Limit the number of commits.
|
||||||
|
'';
|
||||||
|
|
||||||
|
l = mkNullable (types.listOf types.str) "[]" ''
|
||||||
|
`{ ("<start>,<end>:<file>" | ":<funcname>:<file>")... }`
|
||||||
|
|
||||||
|
Trace the evolution of the line range given by <start>,<end>,
|
||||||
|
or by the function name regex <funcname>, within the <file>.
|
||||||
|
'';
|
||||||
|
|
||||||
|
diffMerges = helpers.mkNullOrOption (types.enum ["off" "on" "first-parent" "separate" "combined" "dense-combined" "remerge"]) ''
|
||||||
|
Determines how merge commits are treated.
|
||||||
|
'';
|
||||||
|
|
||||||
|
author = mkNullStr ''
|
||||||
|
Limit the commits output to ones with author/committer header
|
||||||
|
lines that match the specified pattern (regular expression).
|
||||||
|
'';
|
||||||
|
|
||||||
|
grep = mkNullStr ''
|
||||||
|
Limit the commits output to ones with log message that matches
|
||||||
|
the specified pattern (regular expression).
|
||||||
|
'';
|
||||||
|
|
||||||
|
g = mkNullStr ''
|
||||||
|
Look for differences whose patch text contains added/removed
|
||||||
|
lines that match the specified pattern (extended regular
|
||||||
|
expression).
|
||||||
|
'';
|
||||||
|
|
||||||
|
s = mkNullStr ''
|
||||||
|
Look for differences that change the number of occurences of
|
||||||
|
the specified pattern (extended regular expression) in a
|
||||||
|
file.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
in {
|
||||||
|
git = {
|
||||||
|
singleFile = logOptions;
|
||||||
|
|
||||||
|
multiFile = logOptions;
|
||||||
|
};
|
||||||
|
hg = {
|
||||||
|
singleFile = logOptions;
|
||||||
|
|
||||||
|
multiFile = logOptions;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
winConfig = mkWinConfig "split" "" 16 "bottom";
|
||||||
|
};
|
||||||
|
|
||||||
|
commitLogPanel = {
|
||||||
|
winConfig = mkWinConfig "float" "" "" "";
|
||||||
|
};
|
||||||
|
|
||||||
|
defaultArgs = let
|
||||||
|
commonDesc = "Default args prepended to the arg-list for the listed commands";
|
||||||
|
in {
|
||||||
|
diffviewOpen = mkNullable (types.listOf types.str) "[ ]" commonDesc;
|
||||||
|
|
||||||
|
diffviewFileHistory = mkNullable (types.listOf types.str) "[ ]" commonDesc;
|
||||||
|
};
|
||||||
|
|
||||||
|
hooks = let
|
||||||
|
mkNullStr = helpers.mkNullOrOption types.str;
|
||||||
|
in {
|
||||||
|
viewOpened = mkNullStr ''
|
||||||
|
{view_opened} (`fun(view: View)`)
|
||||||
|
|
||||||
|
Emitted after a new view has been opened. It's called after
|
||||||
|
initializing the layout in the new tabpage (all windows are
|
||||||
|
ready).
|
||||||
|
|
||||||
|
Callback Parameters:
|
||||||
|
{view} (`View`)
|
||||||
|
The `View` instance that was opened.
|
||||||
|
'';
|
||||||
|
|
||||||
|
viewClosed = mkNullStr ''
|
||||||
|
{view_closed} (`fun(view: View)`)
|
||||||
|
|
||||||
|
Emitted after closing a view.
|
||||||
|
|
||||||
|
Callback Parameters:
|
||||||
|
{view} (`View`)
|
||||||
|
The `View` instance that was closed.
|
||||||
|
'';
|
||||||
|
|
||||||
|
viewEnter = mkNullStr ''
|
||||||
|
{view_enter} (`fun(view: View)`)
|
||||||
|
|
||||||
|
Emitted just after entering the tabpage of a view.
|
||||||
|
|
||||||
|
Callback Parameters:
|
||||||
|
{view} (`View`)
|
||||||
|
The `View` instance that was entered.
|
||||||
|
'';
|
||||||
|
|
||||||
|
viewLeave = mkNullStr ''
|
||||||
|
{view_leave} (`fun(view: View)`)
|
||||||
|
|
||||||
|
Emitted just before leaving the tabpage of a view.
|
||||||
|
|
||||||
|
Callback Parameters:
|
||||||
|
{view} (`View`)
|
||||||
|
The `View` instance that's about to be left.
|
||||||
|
'';
|
||||||
|
|
||||||
|
viewPostLayout = mkNullStr ''
|
||||||
|
{view_post_layout} (`fun(view: View)`)
|
||||||
|
|
||||||
|
Emitted after the window layout in a view has been adjusted.
|
||||||
|
|
||||||
|
Callback Parameters:
|
||||||
|
{view} (`View`)
|
||||||
|
The `View` whose layout was adjusted.
|
||||||
|
'';
|
||||||
|
|
||||||
|
diffBufRead = mkNullStr ''
|
||||||
|
{diff_buf_read} (`fun(bufnr: integer, ctx: table)`)
|
||||||
|
|
||||||
|
Emitted after a new diff buffer is ready (the first time it's
|
||||||
|
created and loaded into a window). Diff buffers are all
|
||||||
|
buffers with |diff-mode| enabled. That includes buffers of
|
||||||
|
local files (not created from git).
|
||||||
|
|
||||||
|
This is always called with the new buffer as the current
|
||||||
|
buffer and the correct diff window as the current window such
|
||||||
|
that |:setlocal| will apply settings to the relevant buffer /
|
||||||
|
window.
|
||||||
|
|
||||||
|
Callback Parameters:
|
||||||
|
{bufnr} (`integer`)
|
||||||
|
The buffer number of the new buffer.
|
||||||
|
{ctx} (`table`)
|
||||||
|
• {symbol} (string)
|
||||||
|
A symbol that identifies the window's position in
|
||||||
|
the layout. These symbols correspond with the
|
||||||
|
figures under |diffview-config-view.x.layout|.
|
||||||
|
• {layout_name} (string)
|
||||||
|
The name of the current layout.
|
||||||
|
'';
|
||||||
|
|
||||||
|
diffBufWinEnter = mkNullStr ''
|
||||||
|
{diff_buf_win_enter} (`fun(bufnr: integer, winid: integer, ctx: table)`)
|
||||||
|
|
||||||
|
Emitted after a diff buffer is displayed in a window.
|
||||||
|
|
||||||
|
This is always called with the new buffer as the current
|
||||||
|
buffer and the correct diff window as the current window such
|
||||||
|
that |:setlocal| will apply settings to the relevant buffer /
|
||||||
|
window.
|
||||||
|
|
||||||
|
Callback Parameters:
|
||||||
|
{bufnr} (`integer`)
|
||||||
|
The buffer number of the new buffer.
|
||||||
|
{winid} (`integer`)
|
||||||
|
The window id of window inside which the buffer was
|
||||||
|
displayed.
|
||||||
|
{ctx} (`table`)
|
||||||
|
• {symbol} (string)
|
||||||
|
A symbol that identifies the window's position in
|
||||||
|
the layout. These symbols correspond with the
|
||||||
|
figures under |diffview-config-view.x.layout|.
|
||||||
|
• {layout_name} (string)
|
||||||
|
The name of the current layout.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
keymaps = let
|
||||||
|
keymapList = desc:
|
||||||
|
mkOption {
|
||||||
|
type = types.listOf (types.submodule {
|
||||||
|
options = {
|
||||||
|
mode = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
description = "mode to bind keybinding to";
|
||||||
|
example = "n";
|
||||||
|
};
|
||||||
|
key = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
description = "key to bind keybinding to";
|
||||||
|
example = "<tab>";
|
||||||
|
};
|
||||||
|
action = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
description = "action for keybinding";
|
||||||
|
example = "action.select_next_entry";
|
||||||
|
};
|
||||||
|
description = mkOption {
|
||||||
|
type = types.nullOr types.str;
|
||||||
|
description = "description for keybinding";
|
||||||
|
default = null;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
});
|
||||||
|
description = ''
|
||||||
|
List of keybindings.
|
||||||
|
${desc}
|
||||||
|
'';
|
||||||
|
default = [];
|
||||||
|
example = [
|
||||||
|
{
|
||||||
|
mode = "n";
|
||||||
|
key = "<tab>";
|
||||||
|
action = "actions.select_next_entry";
|
||||||
|
description = "Open the diff for the next file";
|
||||||
|
}
|
||||||
|
];
|
||||||
|
};
|
||||||
|
in {
|
||||||
|
disableDefaults = mkBool false ''
|
||||||
|
Disable the default keymaps.
|
||||||
|
'';
|
||||||
|
|
||||||
|
view = keymapList ''
|
||||||
|
The `view` bindings are active in the diff buffers, only when the current
|
||||||
|
tabpage is a Diffview.
|
||||||
|
'';
|
||||||
|
|
||||||
|
diff1 = keymapList ''
|
||||||
|
Mappings in single window diff layouts
|
||||||
|
'';
|
||||||
|
|
||||||
|
diff2 = keymapList ''
|
||||||
|
Mappings in 2-way diff layouts
|
||||||
|
'';
|
||||||
|
diff3 = keymapList ''
|
||||||
|
Mappings in 3-way diff layouts
|
||||||
|
'';
|
||||||
|
diff4 = keymapList ''
|
||||||
|
Mappings in 4-way diff layouts
|
||||||
|
'';
|
||||||
|
filePanel = keymapList ''
|
||||||
|
Mappings in file panel.
|
||||||
|
'';
|
||||||
|
fileHistoryPanel = keymapList ''
|
||||||
|
Mappings in file history panel.
|
||||||
|
'';
|
||||||
|
optionPanel = keymapList ''
|
||||||
|
Mappings in options panel.
|
||||||
|
'';
|
||||||
|
helpPanel = keymapList ''
|
||||||
|
Mappings in help panel.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
disableDefaultKeymaps = mkBool false ''
|
||||||
|
Disable the default keymaps;
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
config = let
|
||||||
|
setupOptions = with cfg; {
|
||||||
|
diff_binaries = diffBinaries;
|
||||||
|
enhanced_diff_hl = enhancedDiffHl;
|
||||||
|
git_cmd = gitCmd;
|
||||||
|
hg_cmd = hgCmd;
|
||||||
|
use_icons = useIcons;
|
||||||
|
show_help_hints = showHelpHints;
|
||||||
|
watch_index = watchIndex;
|
||||||
|
|
||||||
|
icons = {
|
||||||
|
folder_closed = icons.folderClosed;
|
||||||
|
folder_open = icons.folderOpen;
|
||||||
|
};
|
||||||
|
|
||||||
|
signs = with signs; {
|
||||||
|
fold_closed = foldClosed;
|
||||||
|
fold_open = foldOpen;
|
||||||
|
inherit done;
|
||||||
|
};
|
||||||
|
|
||||||
|
view = with view; {
|
||||||
|
default = with default; {
|
||||||
|
inherit layout;
|
||||||
|
winbar_info = winbarInfo;
|
||||||
|
};
|
||||||
|
|
||||||
|
merge_tool = with mergeTool; {
|
||||||
|
inherit layout;
|
||||||
|
disable_diagnostics = disableDiagnostics;
|
||||||
|
winbar_info = winbarInfo;
|
||||||
|
};
|
||||||
|
|
||||||
|
file_history = with fileHistory; {
|
||||||
|
inherit layout;
|
||||||
|
winbar_info = winbarInfo;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
file_panel = with filePanel; {
|
||||||
|
listing_style = listingStyle;
|
||||||
|
|
||||||
|
tree_options = with treeOptions; {
|
||||||
|
flatten_dirs = flattenDirs;
|
||||||
|
folder_statuses = folderStatuses;
|
||||||
|
};
|
||||||
|
|
||||||
|
win_config = with winConfig; {
|
||||||
|
inherit type;
|
||||||
|
inherit width;
|
||||||
|
inherit height;
|
||||||
|
inherit position;
|
||||||
|
inherit relative;
|
||||||
|
inherit win;
|
||||||
|
win_opts = winOpts;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
file_history_panel = with fileHistoryPanel; {
|
||||||
|
log_options = with logOptions; let
|
||||||
|
setupLogOptions = opts:
|
||||||
|
with opts; {
|
||||||
|
inherit base;
|
||||||
|
rev_range = revRange;
|
||||||
|
path_args = pathArgs;
|
||||||
|
inherit follow;
|
||||||
|
first_parent = firstParent;
|
||||||
|
show_pulls = showPulls;
|
||||||
|
inherit reflog;
|
||||||
|
inherit all;
|
||||||
|
inherit merges;
|
||||||
|
no_merges = noMerges;
|
||||||
|
inherit reverse;
|
||||||
|
cherry_pick = cherryPick;
|
||||||
|
left_only = leftOnly;
|
||||||
|
right_only = rightOnly;
|
||||||
|
max_count = maxCount;
|
||||||
|
L = l;
|
||||||
|
diff_merges = diffMerges;
|
||||||
|
inherit author;
|
||||||
|
inherit grep;
|
||||||
|
G = g;
|
||||||
|
S = s;
|
||||||
|
};
|
||||||
|
in {
|
||||||
|
git = with git; {
|
||||||
|
single_file = setupLogOptions singleFile;
|
||||||
|
multi_file = setupLogOptions multiFile;
|
||||||
|
};
|
||||||
|
|
||||||
|
hg = with hg; {
|
||||||
|
single_file = setupLogOptions singleFile;
|
||||||
|
multi_file = setupLogOptions multiFile;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
win_config = with winConfig; {
|
||||||
|
inherit type;
|
||||||
|
inherit width;
|
||||||
|
inherit height;
|
||||||
|
inherit position;
|
||||||
|
inherit relative;
|
||||||
|
inherit win;
|
||||||
|
win_opts = winOpts;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
commit_log_panel = with commitLogPanel; {
|
||||||
|
win_config = with winConfig; {
|
||||||
|
inherit type;
|
||||||
|
inherit width;
|
||||||
|
inherit height;
|
||||||
|
inherit position;
|
||||||
|
inherit relative;
|
||||||
|
inherit win;
|
||||||
|
win_opts = winOpts;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
default_args = with defaultArgs; {
|
||||||
|
DiffviewOpen = diffviewOpen;
|
||||||
|
DiffviewFileHistory = diffviewFileHistory;
|
||||||
|
};
|
||||||
|
|
||||||
|
hooks = with hooks; {
|
||||||
|
view_opened = viewOpened;
|
||||||
|
view_closed = viewClosed;
|
||||||
|
view_enter = viewEnter;
|
||||||
|
view_leave = viewLeave;
|
||||||
|
view_post_layout = viewPostLayout;
|
||||||
|
diff_buf_read = diffBufRead;
|
||||||
|
diff_buf_win_enter = diffBufWinEnter;
|
||||||
|
};
|
||||||
|
|
||||||
|
keymaps = with keymaps; let
|
||||||
|
convertToKeybinding = attr: [attr.mode attr.key attr.action {"desc" = attr.description;}];
|
||||||
|
in {
|
||||||
|
view = map convertToKeybinding view;
|
||||||
|
diff1 = map convertToKeybinding diff1;
|
||||||
|
diff2 = map convertToKeybinding diff2;
|
||||||
|
diff3 = map convertToKeybinding diff3;
|
||||||
|
diff4 = map convertToKeybinding diff4;
|
||||||
|
file_panel = map convertToKeybinding filePanel;
|
||||||
|
file_history_panel = map convertToKeybinding fileHistoryPanel;
|
||||||
|
option_panel = map convertToKeybinding optionPanel;
|
||||||
|
help_panel = map convertToKeybinding helpPanel;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
in
|
||||||
|
mkIf
|
||||||
|
cfg.enable
|
||||||
|
{
|
||||||
|
extraPlugins =
|
||||||
|
[cfg.package]
|
||||||
|
++ (optional cfg.useIcons pkgs.vimPlugins.nvim-web-devicons);
|
||||||
|
extraConfigLua = ''
|
||||||
|
require("diffview").setup(${helpers.toLuaObject setupOptions})
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
}
|
164
tests/test-sources/plugins/git/diffview.nix
Normal file
164
tests/test-sources/plugins/git/diffview.nix
Normal file
|
@ -0,0 +1,164 @@
|
||||||
|
{
|
||||||
|
empty = {
|
||||||
|
plugins.diffview.enable = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
example = {
|
||||||
|
plugins.diffview = {
|
||||||
|
enable = true;
|
||||||
|
|
||||||
|
diffBinaries = true;
|
||||||
|
enhancedDiffHl = true;
|
||||||
|
gitCmd = ["git"];
|
||||||
|
hgCmd = ["hg"];
|
||||||
|
useIcons = false;
|
||||||
|
showHelpHints = false;
|
||||||
|
watchIndex = true;
|
||||||
|
icons = {
|
||||||
|
folderClosed = "a";
|
||||||
|
folderOpen = "b";
|
||||||
|
};
|
||||||
|
signs = {
|
||||||
|
foldClosed = "c";
|
||||||
|
foldOpen = "d";
|
||||||
|
done = "e";
|
||||||
|
};
|
||||||
|
view = {
|
||||||
|
default = {
|
||||||
|
layout = "diff2_horizontal";
|
||||||
|
winbarInfo = true;
|
||||||
|
};
|
||||||
|
mergeTool = {
|
||||||
|
layout = "diff1_plain";
|
||||||
|
disableDiagnostics = false;
|
||||||
|
winbarInfo = false;
|
||||||
|
};
|
||||||
|
fileHistory = {
|
||||||
|
layout = "diff2_vertical";
|
||||||
|
winbarInfo = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
filePanel = {
|
||||||
|
listingStyle = "list";
|
||||||
|
treeOptions = {
|
||||||
|
flattenDirs = false;
|
||||||
|
folderStatuses = "never";
|
||||||
|
};
|
||||||
|
winConfig = {
|
||||||
|
position = "right";
|
||||||
|
width = 20;
|
||||||
|
winOpts = {};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
fileHistoryPanel = {
|
||||||
|
logOptions = {
|
||||||
|
git = {
|
||||||
|
singleFile = {
|
||||||
|
base = "a";
|
||||||
|
diffMerges = "combined";
|
||||||
|
};
|
||||||
|
multiFile.diffMerges = "first-parent";
|
||||||
|
};
|
||||||
|
hg = {
|
||||||
|
singleFile = {};
|
||||||
|
multiFile = {};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
winConfig = {
|
||||||
|
position = "top";
|
||||||
|
height = 10;
|
||||||
|
winOpts = {};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
commitLogPanel.winConfig.winOpts = {};
|
||||||
|
defaultArgs = {
|
||||||
|
diffviewOpen = ["HEAD"];
|
||||||
|
diffviewFileHistory = ["%"];
|
||||||
|
};
|
||||||
|
hooks = {
|
||||||
|
viewOpened = ''
|
||||||
|
function(view)
|
||||||
|
print(
|
||||||
|
("A new %s was opened on tab page %d!")
|
||||||
|
:format(view.class:name(), view.tabpage)
|
||||||
|
)
|
||||||
|
end
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
keymaps = {
|
||||||
|
view = [
|
||||||
|
{
|
||||||
|
mode = "n";
|
||||||
|
key = "<tab>";
|
||||||
|
action = "actions.select_next_entry";
|
||||||
|
description = "Open the diff for the next file";
|
||||||
|
}
|
||||||
|
];
|
||||||
|
diff1 = [
|
||||||
|
{
|
||||||
|
mode = "n";
|
||||||
|
key = "<tab>";
|
||||||
|
action = "actions.select_next_entry";
|
||||||
|
}
|
||||||
|
];
|
||||||
|
diff2 = [
|
||||||
|
{
|
||||||
|
mode = "n";
|
||||||
|
key = "<tab>";
|
||||||
|
action = "actions.select_next_entry";
|
||||||
|
description = "Open the diff for the next file";
|
||||||
|
}
|
||||||
|
];
|
||||||
|
diff3 = [
|
||||||
|
{
|
||||||
|
mode = "n";
|
||||||
|
key = "<tab>";
|
||||||
|
action = "actions.select_next_entry";
|
||||||
|
description = "Open the diff for the next file";
|
||||||
|
}
|
||||||
|
];
|
||||||
|
diff4 = [
|
||||||
|
{
|
||||||
|
mode = "n";
|
||||||
|
key = "<tab>";
|
||||||
|
action = "actions.select_next_entry";
|
||||||
|
description = "Open the diff for the next file";
|
||||||
|
}
|
||||||
|
];
|
||||||
|
filePanel = [
|
||||||
|
{
|
||||||
|
mode = "n";
|
||||||
|
key = "<tab>";
|
||||||
|
action = "actions.select_next_entry";
|
||||||
|
description = "Open the diff for the next file";
|
||||||
|
}
|
||||||
|
];
|
||||||
|
fileHistoryPanel = [
|
||||||
|
{
|
||||||
|
mode = "n";
|
||||||
|
key = "<tab>";
|
||||||
|
action = "actions.select_next_entry";
|
||||||
|
description = "Open the diff for the next file";
|
||||||
|
}
|
||||||
|
];
|
||||||
|
optionPanel = [
|
||||||
|
{
|
||||||
|
mode = "n";
|
||||||
|
key = "<tab>";
|
||||||
|
action = "actions.select_next_entry";
|
||||||
|
description = "Open the diff for the next file";
|
||||||
|
}
|
||||||
|
];
|
||||||
|
helpPanel = [
|
||||||
|
{
|
||||||
|
mode = "n";
|
||||||
|
key = "<tab>";
|
||||||
|
action = "actions.select_next_entry";
|
||||||
|
description = "Open the diff for the next file";
|
||||||
|
}
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue