aboutsummaryrefslogtreecommitdiffstats
path: root/modules
diff options
context:
space:
mode:
authorArpit Chakladar <arpitchakladar@gmail.com>2026-09-12 05:57:11 +0530
committerArpit Chakladar <arpitchakladar@gmail.com>2026-09-12 05:57:11 +0530
commit8d0780f666fe7716397e9824624e0aced85670e5 (patch)
tree931ca728e9b142ccdb35de542f1ad42816c1a9a7 /modules
parent34813d1dde1327f1a6214db9d50b12339e47210e (diff)
downloadhome-manager-config-8d0780f666fe7716397e9824624e0aced85670e5.tar.gz
home-manager-config-8d0780f666fe7716397e9824624e0aced85670e5.zip
feat(development/nixvim): gitsigns configurations
Finally made a fully featured gitsigns config integrating all its features.
Diffstat (limited to 'modules')
-rw-r--r--modules/development/nixvim/default.nix1
-rw-r--r--modules/development/nixvim/plugins/gitsigns.nix102
-rw-r--r--modules/development/nixvim/plugins/telescope.nix10
3 files changed, 100 insertions, 13 deletions
diff --git a/modules/development/nixvim/default.nix b/modules/development/nixvim/default.nix
index bf3d143..f1e038a 100644
--- a/modules/development/nixvim/default.nix
+++ b/modules/development/nixvim/default.nix
@@ -34,6 +34,7 @@
clipboard = "unnamedplus";
updatetime = 500;
};
+ globals.mapleader = " ";
clipboard.providers.xclip.enable = true;
extraConfigLuaPre = with config.scheme.withHashtag; ''
vim.opt.fillchars:append({ eob = " " })
diff --git a/modules/development/nixvim/plugins/gitsigns.nix b/modules/development/nixvim/plugins/gitsigns.nix
index 38ad85f..ccfb2c9 100644
--- a/modules/development/nixvim/plugins/gitsigns.nix
+++ b/modules/development/nixvim/plugins/gitsigns.nix
@@ -1,7 +1,103 @@
-# Git status in the sign column
+# Git integration: signs, blame, diffs and hunk operations
{ config, lib, ... }:
{
- config.programs.nixvim.plugins.gitsigns = lib.mkIf config.development.nixvim.enable {
- enable = true;
+ config.programs.nixvim = lib.mkIf config.development.nixvim.enable {
+ plugins.gitsigns = {
+ enable = true;
+
+ settings = {
+ signs = {
+ add.text = "┃";
+ change.text = "┃";
+ delete.text = "▁";
+ topdelete.text = "▔";
+ changedelete.text = "~";
+ untracked.text = "┆";
+ };
+
+ numhl = true;
+ current_line_blame = false;
+ current_line_blame_formatter = "<author>, <author_time:%Y-%m-%d> - <summary>";
+
+ on_attach = ''
+ function(bufnr)
+ local gitsigns = require('gitsigns')
+ local function map(mode, lhs, rhs, desc)
+ vim.keymap.set(mode, lhs, rhs, { buffer = bufnr, silent = true, desc = desc })
+ end
+
+ -- Navigation
+ map('n', ']c', function() gitsigns.nav_hunk('next') end, 'Next hunk')
+ map('n', '[c', function() gitsigns.nav_hunk('prev') end, 'Previous hunk')
+ map('n', ']C', function() gitsigns.nav_hunk('last') end, 'Last hunk')
+ map('n', '[C', function() gitsigns.nav_hunk('first') end, 'First hunk')
+
+ -- Hunk actions
+ map('n', '<leader>gs', gitsigns.stage_hunk, 'Stage hunk')
+ map('v', '<leader>gs', function()
+ gitsigns.stage_hunk({ vim.fn.line('.'), vim.fn.line('v') })
+ end, 'Stage visual range hunk')
+ map('n', '<leader>gr', gitsigns.reset_hunk, 'Reset hunk')
+ map('v', '<leader>gr', function()
+ gitsigns.reset_hunk({ vim.fn.line('.'), vim.fn.line('v') })
+ end, 'Reset visual range hunk')
+ map('n', '<leader>gS', gitsigns.stage_buffer, 'Stage buffer')
+ map('n', '<leader>gR', gitsigns.reset_buffer, 'Reset buffer')
+ map('n', '<leader>gi', gitsigns.reset_buffer_index, 'Unstage buffer (reset index)')
+ map('n', '<leader>gu', gitsigns.undo_stage_hunk, 'Undo stage hunk')
+
+ -- Preview
+ map('n', '<leader>gp', gitsigns.preview_hunk, 'Preview hunk')
+ map('n', '<leader>gP', gitsigns.preview_hunk_inline, 'Preview hunk inline')
+
+ -- Blame
+ map('n', '<leader>gb', gitsigns.blame_line, 'Blame line')
+ map('n', '<leader>gB', function()
+ gitsigns.blame_line({ full = true })
+ end, 'Blame line (full)')
+
+ -- Diffs / base
+ map('n', '<leader>gd', gitsigns.diffthis, 'Diff this (index)')
+ map('n', '<leader>gD', function()
+ gitsigns.diffthis('~')
+ end, 'Diff this (HEAD)')
+ map('n', '<leader>gc', function()
+ gitsigns.change_base(nil, true)
+ end, 'Change diff base')
+
+ -- Quickfix / location list
+ map('n', '<leader>gq', gitsigns.setqflist, 'Hunks to quickfix')
+ map('n', '<leader>gQ', function()
+ gitsigns.setqflist('all')
+ end, 'Repo hunks to quickfix')
+ map('n', '<leader>gl', gitsigns.setloclist, 'Hunks to location list')
+
+ -- Toggles
+ map('n', '<leader>gts', gitsigns.toggle_signs, 'Toggle signs')
+ map('n', '<leader>gtl', gitsigns.toggle_linehl, 'Toggle line highlight')
+ map('n', '<leader>gtn', gitsigns.toggle_numhl, 'Toggle number highlight')
+ map('n', '<leader>gtw', gitsigns.toggle_word_diff, 'Toggle word diff')
+ map('n', '<leader>gtb', gitsigns.toggle_current_line_blame, 'Toggle current line blame')
+ map('n', '<leader>gtd', gitsigns.toggle_deleted, 'Toggle deleted lines')
+
+ -- Misc
+ map('n', '<leader>gF', gitsigns.refresh, 'Refresh gitsigns')
+
+ -- Text object
+ map({ 'o', 'x' }, 'ih', gitsigns.select_hunk, 'Select hunk text object')
+ end
+ '';
+ };
+ };
+
+ highlight = with config.scheme.withHashtag; {
+ GitSignsAdd.fg = base0B;
+ GitSignsChange.fg = base0A;
+ GitSignsDelete.fg = base08;
+ GitSignsTopdelete.fg = base08;
+ GitSignsChangedelete.fg = base0A;
+ GitSignsUntracked.fg = base0C;
+ GitSignsCurrentLineBlame.fg = base04;
+ };
};
}
diff --git a/modules/development/nixvim/plugins/telescope.nix b/modules/development/nixvim/plugins/telescope.nix
index 8f06ec9..505a3eb 100644
--- a/modules/development/nixvim/plugins/telescope.nix
+++ b/modules/development/nixvim/plugins/telescope.nix
@@ -56,16 +56,6 @@
options.desc = "Document symbols";
};
- # Git
- "<leader>gc" = {
- action = "git_commits";
- options.desc = "Git commits";
- };
- "<leader>gb" = {
- action = "git_branches";
- options.desc = "Git branches";
- };
-
# Misc
"<leader>fh" = {
action = "help_tags";