From f78696f13b80fab564e02baf3a976bc2cc186283 Mon Sep 17 00:00:00 2001 From: NotAShelf Date: Sun, 14 Apr 2024 18:33:16 +0300 Subject: [PATCH] plugins/git: add vim-fugitive; modularize --- configuration.nix | 2 +- flake.lock | 17 ++++ flake.nix | 5 ++ modules/plugins/git/config.nix | 86 ------------------ modules/plugins/git/default.nix | 18 +++- modules/plugins/git/git.nix | 40 --------- modules/plugins/git/gitsigns/config.nix | 88 +++++++++++++++++++ modules/plugins/git/gitsigns/default.nix | 6 ++ modules/plugins/git/gitsigns/gitsigns.nix | 41 +++++++++ modules/plugins/git/vim-fugitive/config.nix | 13 +++ modules/plugins/git/vim-fugitive/default.nix | 6 ++ .../plugins/git/vim-fugitive/vim-fugitive.nix | 14 +++ 12 files changed, 206 insertions(+), 130 deletions(-) delete mode 100644 modules/plugins/git/config.nix delete mode 100644 modules/plugins/git/git.nix create mode 100644 modules/plugins/git/gitsigns/config.nix create mode 100644 modules/plugins/git/gitsigns/default.nix create mode 100644 modules/plugins/git/gitsigns/gitsigns.nix create mode 100644 modules/plugins/git/vim-fugitive/config.nix create mode 100644 modules/plugins/git/vim-fugitive/default.nix create mode 100644 modules/plugins/git/vim-fugitive/vim-fugitive.nix diff --git a/configuration.nix b/configuration.nix index 3f8ea96..7e55050 100644 --- a/configuration.nix +++ b/configuration.nix @@ -148,7 +148,7 @@ inputs: let git = { enable = true; gitsigns.enable = true; - gitsigns.codeActions = false; # throws an annoying debug message + gitsigns.codeActions.enable = false; # throws an annoying debug message }; minimap = { diff --git a/flake.lock b/flake.lock index 3803397..af5c550 100644 --- a/flake.lock +++ b/flake.lock @@ -1653,6 +1653,22 @@ "type": "github" } }, + "plugin-vim-fugitive": { + "flake": false, + "locked": { + "lastModified": 1712554826, + "narHash": "sha256-pmY1EQbupKvsqok9O5omkOWi0BEZ8df7HL0F7ubdY9Q=", + "owner": "tpope", + "repo": "vim-fugitive", + "rev": "dac8e5c2d85926df92672bf2afb4fc48656d96c7", + "type": "github" + }, + "original": { + "owner": "tpope", + "repo": "vim-fugitive", + "type": "github" + } + }, "plugin-vim-illuminate": { "flake": false, "locked": { @@ -1865,6 +1881,7 @@ "plugin-tokyonight": "plugin-tokyonight", "plugin-trouble": "plugin-trouble", "plugin-vim-dirtytalk": "plugin-vim-dirtytalk", + "plugin-vim-fugitive": "plugin-vim-fugitive", "plugin-vim-illuminate": "plugin-vim-illuminate", "plugin-vim-markdown": "plugin-vim-markdown", "plugin-vim-repeat": "plugin-vim-repeat", diff --git a/flake.nix b/flake.nix index 2919af4..78c3447 100644 --- a/flake.nix +++ b/flake.nix @@ -407,6 +407,11 @@ flake = false; }; + plugin-vim-fugitive = { + url = "github:tpope/vim-fugitive"; + flake = false; + }; + plugin-fidget-nvim = { url = "github:j-hui/fidget.nvim"; flake = false; diff --git a/modules/plugins/git/config.nix b/modules/plugins/git/config.nix deleted file mode 100644 index 8fc574a..0000000 --- a/modules/plugins/git/config.nix +++ /dev/null @@ -1,86 +0,0 @@ -{ - config, - lib, - ... -}: let - inherit (builtins) toJSON; - inherit (lib.modules) mkIf mkMerge; - inherit (lib.nvim.binds) addDescriptionsToMappings mkSetExprBinding mkSetLuaBinding pushDownDefault; - inherit (lib.nvim.dag) entryAnywhere; - - cfg = config.vim.git; - - self = import ./git.nix {inherit lib config;}; - gsMappingDefinitions = self.options.vim.git.gitsigns.mappings; - - gsMappings = addDescriptionsToMappings cfg.gitsigns.mappings gsMappingDefinitions; -in { - config = mkIf cfg.enable (mkMerge [ - (mkIf cfg.gitsigns.enable (mkMerge [ - { - vim.startPlugins = ["gitsigns-nvim"]; - - vim.maps.normal = mkMerge [ - (mkSetExprBinding gsMappings.nextHunk '' - function() - if vim.wo.diff then return ${toJSON gsMappings.nextHunk.value} end - - vim.schedule(function() package.loaded.gitsigns.next_hunk() end) - - return '' - end - '') - (mkSetExprBinding gsMappings.previousHunk '' - function() - if vim.wo.diff then return ${toJSON gsMappings.previousHunk.value} end - - vim.schedule(function() package.loaded.gitsigns.prev_hunk() end) - - return '' - end - '') - - (mkSetLuaBinding gsMappings.stageHunk "package.loaded.gitsigns.stage_hunk") - (mkSetLuaBinding gsMappings.resetHunk "package.loaded.gitsigns.reset_hunk") - (mkSetLuaBinding gsMappings.undoStageHunk "package.loaded.gitsigns.undo_stage_hunk") - - (mkSetLuaBinding gsMappings.stageBuffer "package.loaded.gitsigns.stage_buffer") - (mkSetLuaBinding gsMappings.resetBuffer "package.loaded.gitsigns.reset_buffer") - - (mkSetLuaBinding gsMappings.previewHunk "package.loaded.gitsigns.preview_hunk") - - (mkSetLuaBinding gsMappings.blameLine "function() package.loaded.gitsigns.blame_line{full=true} end") - (mkSetLuaBinding gsMappings.toggleBlame "package.loaded.gitsigns.toggle_current_line_blame") - - (mkSetLuaBinding gsMappings.diffThis "package.loaded.gitsigns.diffthis") - (mkSetLuaBinding gsMappings.diffProject "function() package.loaded.gitsigns.diffthis('~') end") - - (mkSetLuaBinding gsMappings.toggleDeleted "package.loaded.gitsigns.toggle_deleted") - ]; - - vim.maps.visual = mkMerge [ - (mkSetLuaBinding gsMappings.stageHunk "function() package.loaded.gitsigns.stage_hunk {vim.fn.line('.'), vim.fn.line('v')} end") - (mkSetLuaBinding gsMappings.resetHunk "function() package.loaded.gitsigns.reset_hunk {vim.fn.line('.'), vim.fn.line('v')} end") - ]; - - vim.binds.whichKey.register = pushDownDefault { - "g" = "+Gitsigns"; - }; - - vim.luaConfigRC.gitsigns = entryAnywhere '' - require('gitsigns').setup{} - ''; - } - - (mkIf cfg.gitsigns.codeActions { - vim.lsp.null-ls.enable = true; - vim.lsp.null-ls.sources.gitsigns-ca = '' - table.insert( - ls_sources, - null_ls.builtins.code_actions.gitsigns - ) - ''; - }) - ])) - ]); -} diff --git a/modules/plugins/git/default.nix b/modules/plugins/git/default.nix index d3348bc..525cbcf 100644 --- a/modules/plugins/git/default.nix +++ b/modules/plugins/git/default.nix @@ -1,6 +1,18 @@ -{ +{lib, ...}: let + inherit (lib.options) mkEnableOption; +in { imports = [ - ./config.nix - ./git.nix + ./gitsigns + ./vim-fugitive ]; + + options.vim.git = { + enable = mkEnableOption '' + git integration suite. + + Enabling this option will enable the following plugins: + * gitsigns + * vim-fugitive + ''; + }; } diff --git a/modules/plugins/git/git.nix b/modules/plugins/git/git.nix deleted file mode 100644 index 1201982..0000000 --- a/modules/plugins/git/git.nix +++ /dev/null @@ -1,40 +0,0 @@ -{ - config, - lib, - ... -}: let - inherit (lib.options) mkEnableOption; - inherit (lib.nvim.binds) mkMappingOption; -in { - options.vim.git = { - enable = mkEnableOption "git integration"; - - gitsigns = { - enable = mkEnableOption "gitsigns" // {default = config.vim.git.enable;}; - - mappings = { - nextHunk = mkMappingOption "Next hunk [Gitsigns]" "]c"; - previousHunk = mkMappingOption "Previous hunk [Gitsigns]" "[c"; - - stageHunk = mkMappingOption "Stage hunk [Gitsigns]" "hs"; - undoStageHunk = mkMappingOption "Undo stage hunk [Gitsigns]" "hu"; - resetHunk = mkMappingOption "Reset hunk [Gitsigns]" "hr"; - - stageBuffer = mkMappingOption "Stage buffer [Gitsigns]" "hS"; - resetBuffer = mkMappingOption "Reset buffer [Gitsigns]" "hR"; - - previewHunk = mkMappingOption "Preview hunk [Gitsigns]" "hP"; - - blameLine = mkMappingOption "Blame line [Gitsigns]" "hb"; - toggleBlame = mkMappingOption "Toggle blame [Gitsigns]" "tb"; - - diffThis = mkMappingOption "Diff this [Gitsigns]" "hd"; - diffProject = mkMappingOption "Diff project [Gitsigns]" "hD"; - - toggleDeleted = mkMappingOption "Toggle deleted [Gitsigns]" "td"; - }; - - codeActions = mkEnableOption "gitsigns codeactions through null-ls"; - }; - }; -} diff --git a/modules/plugins/git/gitsigns/config.nix b/modules/plugins/git/gitsigns/config.nix new file mode 100644 index 0000000..b0aac94 --- /dev/null +++ b/modules/plugins/git/gitsigns/config.nix @@ -0,0 +1,88 @@ +{ + config, + lib, + ... +}: let + inherit (builtins) toJSON; + inherit (lib.modules) mkIf mkMerge; + inherit (lib.nvim.binds) addDescriptionsToMappings mkSetExprBinding mkSetLuaBinding pushDownDefault; + inherit (lib.nvim.dag) entryAnywhere; + + cfg = config.vim.git.gitsigns; + + self = import ./gitsigns.nix {inherit lib config;}; + gsMappingDefinitions = self.options.vim.git.gitsigns.mappings; + + gsMappings = addDescriptionsToMappings cfg.mappings gsMappingDefinitions; +in { + config = mkIf cfg.enable (mkMerge [ + { + vim = { + startPlugins = ["gitsigns-nvim"]; + + maps = { + normal = mkMerge [ + (mkSetExprBinding gsMappings.nextHunk '' + function() + if vim.wo.diff then return ${toJSON gsMappings.nextHunk.value} end + + vim.schedule(function() package.loaded.gitsigns.next_hunk() end) + + return '' + end + '') + (mkSetExprBinding gsMappings.previousHunk '' + function() + if vim.wo.diff then return ${toJSON gsMappings.previousHunk.value} end + + vim.schedule(function() package.loaded.gitsigns.prev_hunk() end) + + return '' + end + '') + + (mkSetLuaBinding gsMappings.stageHunk "package.loaded.gitsigns.stage_hunk") + (mkSetLuaBinding gsMappings.resetHunk "package.loaded.gitsigns.reset_hunk") + (mkSetLuaBinding gsMappings.undoStageHunk "package.loaded.gitsigns.undo_stage_hunk") + + (mkSetLuaBinding gsMappings.stageBuffer "package.loaded.gitsigns.stage_buffer") + (mkSetLuaBinding gsMappings.resetBuffer "package.loaded.gitsigns.reset_buffer") + + (mkSetLuaBinding gsMappings.previewHunk "package.loaded.gitsigns.preview_hunk") + + (mkSetLuaBinding gsMappings.blameLine "function() package.loaded.gitsigns.blame_line{full=true} end") + (mkSetLuaBinding gsMappings.toggleBlame "package.loaded.gitsigns.toggle_current_line_blame") + + (mkSetLuaBinding gsMappings.diffThis "package.loaded.gitsigns.diffthis") + (mkSetLuaBinding gsMappings.diffProject "function() package.loaded.gitsigns.diffthis('~') end") + + (mkSetLuaBinding gsMappings.toggleDeleted "package.loaded.gitsigns.toggle_deleted") + ]; + + visual = mkMerge [ + (mkSetLuaBinding gsMappings.stageHunk "function() package.loaded.gitsigns.stage_hunk {vim.fn.line('.'), vim.fn.line('v')} end") + (mkSetLuaBinding gsMappings.resetHunk "function() package.loaded.gitsigns.reset_hunk {vim.fn.line('.'), vim.fn.line('v')} end") + ]; + }; + + binds.whichKey.register = pushDownDefault { + "g" = "+Gitsigns"; + }; + + luaConfigRC.gitsigns = entryAnywhere '' + require('gitsigns').setup{} + ''; + }; + } + + (mkIf cfg.codeActions.enable { + vim.lsp.null-ls.enable = true; + vim.lsp.null-ls.sources.gitsigns-ca = '' + table.insert( + ls_sources, + null_ls.builtins.code_actions.gitsigns + ) + ''; + }) + ]); +} diff --git a/modules/plugins/git/gitsigns/default.nix b/modules/plugins/git/gitsigns/default.nix new file mode 100644 index 0000000..905e4bb --- /dev/null +++ b/modules/plugins/git/gitsigns/default.nix @@ -0,0 +1,6 @@ +{ + imports = [ + ./config.nix + ./gitsigns.nix + ]; +} diff --git a/modules/plugins/git/gitsigns/gitsigns.nix b/modules/plugins/git/gitsigns/gitsigns.nix new file mode 100644 index 0000000..e477617 --- /dev/null +++ b/modules/plugins/git/gitsigns/gitsigns.nix @@ -0,0 +1,41 @@ +{ + 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"] ["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]" "hs"; + undoStageHunk = mkMappingOption "Undo stage hunk [Gitsigns]" "hu"; + resetHunk = mkMappingOption "Reset hunk [Gitsigns]" "hr"; + + stageBuffer = mkMappingOption "Stage buffer [Gitsigns]" "hS"; + resetBuffer = mkMappingOption "Reset buffer [Gitsigns]" "hR"; + + previewHunk = mkMappingOption "Preview hunk [Gitsigns]" "hP"; + + blameLine = mkMappingOption "Blame line [Gitsigns]" "hb"; + toggleBlame = mkMappingOption "Toggle blame [Gitsigns]" "tb"; + + diffThis = mkMappingOption "Diff this [Gitsigns]" "hd"; + diffProject = mkMappingOption "Diff project [Gitsigns]" "hD"; + + toggleDeleted = mkMappingOption "Toggle deleted [Gitsigns]" "td"; + }; + }; +} diff --git a/modules/plugins/git/vim-fugitive/config.nix b/modules/plugins/git/vim-fugitive/config.nix new file mode 100644 index 0000000..db920ca --- /dev/null +++ b/modules/plugins/git/vim-fugitive/config.nix @@ -0,0 +1,13 @@ +{ + config, + lib, + ... +}: let + inherit (lib.modules) mkIf; + + cfg = config.vim.git.vim-fugitive; +in { + config = mkIf cfg.enable { + vim.startPlugins = ["vim-fugitive"]; + }; +} diff --git a/modules/plugins/git/vim-fugitive/default.nix b/modules/plugins/git/vim-fugitive/default.nix new file mode 100644 index 0000000..80e287c --- /dev/null +++ b/modules/plugins/git/vim-fugitive/default.nix @@ -0,0 +1,6 @@ +{ + imports = [ + ./config.nix + ./vim-fugitive.nix + ]; +} diff --git a/modules/plugins/git/vim-fugitive/vim-fugitive.nix b/modules/plugins/git/vim-fugitive/vim-fugitive.nix new file mode 100644 index 0000000..b7a26eb --- /dev/null +++ b/modules/plugins/git/vim-fugitive/vim-fugitive.nix @@ -0,0 +1,14 @@ +{ + config, + lib, + ... +}: let + inherit (lib.options) mkEnableOption; +in { + options.vim.git.vim-fugitive = { + enable = mkEnableOption "vim-fugitive" // {default = config.vim.git.enable;}; + + # TODO: sane default keybinds for vim-fugitive + # mappings = {}; + }; +}