{
  config,
  lib,
  ...
}: let
  inherit (lib.options) mkEnableOption;
  inherit (lib.modules) mkRenamedOptionModule;
  inherit (lib.nvim.binds) mkMappingOption;
in {
  imports = [
    (mkRenamedOptionModule ["vim" "git" "gitsigns" "codeActions" "vim" "gitsigns" "codeActions"] ["vim" "git" "gitsigns" "codeActions" "enable"])
  ];

  options.vim.git.gitsigns = {
    enable = mkEnableOption "gitsigns" // {default = config.vim.git.enable;};

    codeActions.enable = mkEnableOption "gitsigns codeactions through null-ls";

    mappings = {
      nextHunk = mkMappingOption "Next hunk [Gitsigns]" "]c";
      previousHunk = mkMappingOption "Previous hunk [Gitsigns]" "[c";

      stageHunk = mkMappingOption "Stage hunk [Gitsigns]" "<leader>hs";
      undoStageHunk = mkMappingOption "Undo stage hunk [Gitsigns]" "<leader>hu";
      resetHunk = mkMappingOption "Reset hunk [Gitsigns]" "<leader>hr";

      stageBuffer = mkMappingOption "Stage buffer [Gitsigns]" "<leader>hS";
      resetBuffer = mkMappingOption "Reset buffer [Gitsigns]" "<leader>hR";

      previewHunk = mkMappingOption "Preview hunk [Gitsigns]" "<leader>hP";

      blameLine = mkMappingOption "Blame line [Gitsigns]" "<leader>hb";
      toggleBlame = mkMappingOption "Toggle blame [Gitsigns]" "<leader>tb";

      diffThis = mkMappingOption "Diff this [Gitsigns]" "<leader>hd";
      diffProject = mkMappingOption "Diff project [Gitsigns]" "<leader>hD";

      toggleDeleted = mkMappingOption "Toggle deleted [Gitsigns]" "<leader>td";
    };
  };
}