diff --git a/plugins/default.nix b/plugins/default.nix index a4921f60..a62a626f 100644 --- a/plugins/default.nix +++ b/plugins/default.nix @@ -31,6 +31,7 @@ ./git/diffview.nix ./git/fugitive.nix + ./git/gitblame.nix ./git/gitgutter.nix ./git/gitmessenger.nix ./git/gitsigns.nix diff --git a/plugins/git/gitblame.nix b/plugins/git/gitblame.nix new file mode 100644 index 00000000..bb51e841 --- /dev/null +++ b/plugins/git/gitblame.nix @@ -0,0 +1,64 @@ +{ + pkgs, + config, + lib, + ... +}: +with lib; let + cfg = config.plugins.gitblame; + helpers = import ../helpers.nix {inherit lib;}; +in { + options = { + plugins.gitblame = { + enable = mkEnableOption "gitblame"; + + package = helpers.mkPackageOption "gitblame" pkgs.vimPlugins.git-blame-nvim; + + messageTemplate = helpers.defaultNullOpts.mkStr " " "The template for the blame message that will be shown."; + + dateFormat = helpers.defaultNullOpts.mkStr "%c" "The format of the date fields in messageTemplate."; + + messageWhenNotCommitted = helpers.defaultNullOpts.mkStr " Not Committed Yet" "The blame message that will be shown when the current modification hasn't been committed yet."; + + highlightGroup = helpers.defaultNullOpts.mkStr "Comment" "The highlight group for virtual text."; + + displayVirtualText = helpers.defaultNullOpts.mkNullable (types.nullOr types.bool) (toString true) "If the blame message should be displayed as virtual text. You may want to disable this if you display the blame message in statusline."; + + ignoredFiletypes = helpers.defaultNullOpts.mkNullable (types.listOf types.str) (toString []) "A list of filetypes for which gitblame information will not be displayed."; + + delay = helpers.defaultNullOpts.mkUnsignedInt 0 "The delay in milliseconds after which the blame info will be displayed."; + + virtualTextColumn = helpers.defaultNullOpts.mkNullable types.ints.unsigned (toString null) "Have the blame message start at a given column instead of EOL. If the current line is longer than the specified column value the blame message will default to being displayed at EOL."; + + extmarkOptions = helpers.defaultNullOpts.mkAttributeSet (toString null) "nvim_buf_set_extmark optional parameters. (Warning: overwriting id and virt_text will break the plugin behavior)"; + }; + }; + + config = let + setupOptions = { + enabled = cfg.enable; + message_template = cfg.messageTemplate; + date_format = cfg.dateFormat; + message_when_not_committed = cfg.messageWhenNotCommitted; + highlight_group = cfg.highlightGroup; + display_virtual_text = helpers.ifNonNull' cfg.displayVirtualText ( + if cfg.displayVirtualText + then 1 + else 0 + ); + ignored_filetypes = cfg.ignoredFiletypes; + inherit (cfg) delay; + virtual_text_column = cfg.virtualTextColumn; + set_extmark_options = cfg.extmarkOptions; + }; + in + mkIf cfg.enable { + extraPlugins = [cfg.package]; + + extraPackages = [pkgs.git]; + + extraConfigLua = '' + require('gitblame').setup${helpers.toLuaObject setupOptions} + ''; + }; +} diff --git a/tests/test-sources/plugins/git/gitblame.nix b/tests/test-sources/plugins/git/gitblame.nix new file mode 100644 index 00000000..0bae0eec --- /dev/null +++ b/tests/test-sources/plugins/git/gitblame.nix @@ -0,0 +1,19 @@ +{ + empty = { + plugins.gitblame.enable = true; + }; + + defaults = { + plugins.gitblame = { + enable = true; + messageTemplate = " "; + dateFormat = "%c"; + messageWhenNotCommitted = " Not Committed Yet"; + highlightGroup = "Comment"; + displayVirtualText = true; + delay = 0; + virtualTextColumn = null; + extmarkOptions = null; + }; + }; +}