diff --git a/common/home/neovim/default.nix b/common/home/neovim/default.nix
index 5845075d..f0da7775 100644
--- a/common/home/neovim/default.nix
+++ b/common/home/neovim/default.nix
@@ -161,7 +161,7 @@ in {
         {
           plugin = gitsigns-nvim;
           type = "lua";
-          config = "require('gitsigns').setup()";
+          config = fileContents ./plugins/gitsigns.lua;
         }
         {
           plugin = nvim-autopairs;
diff --git a/common/home/neovim/plugins/gitsigns.lua b/common/home/neovim/plugins/gitsigns.lua
new file mode 100644
index 00000000..75da4fd2
--- /dev/null
+++ b/common/home/neovim/plugins/gitsigns.lua
@@ -0,0 +1,15 @@
+local gitsigns = require("gitsigns")
+
+local function visual_stage()
+    local first_line = vim.fn.line('v')
+    local last_line = vim.fn.getpos('.')[2]
+    gitsigns.stage_hunk({ first_line, last_line })
+    -- Switch back to normal mode, there may be a cleaner way to do this
+    vim.api.nvim_feedkeys(vim.api.nvim_replace_termcodes('<Esc>', true, false, true), 't', false)
+end
+
+vim.keymap.set("v", "gbhs", function()
+    visual_stage()
+end)
+
+gitsigns.setup();