From 509b16f5430b265df1397b2126f3781884e5f07b Mon Sep 17 00:00:00 2001 From: Jonny Barnes Date: Sat, 8 Aug 2026 13:57:02 +0100 Subject: [PATCH] Add gitsigns via vim.pack, track the pack lockfile Restores plugin management after the v0.12 config rewrite dropped the earlier `vim.pack.add` calls. Plugins now live in `config/plugins/`, one file per plugin, so adding the next is a single require. Sets `` to Space for the gitsigns hunk mappings, and pins 'signcolumn' open so git and diagnostic signs don't shift text. The lockfile moves into the repo and is symlinked by bootstrap.sh, as the vim.pack docs recommend, giving reproducible plugin revisions across machines and a rollback path via git. vim.pack writes it with a truncating open, so it follows the symlink rather than replacing it. Drops the orphaned nvim-tree entry, unreferenced since the rewrite. Co-Authored-By: Claude Opus 5 (1M context) --- bootstrap.sh | 1 + neovim/config/init.lua | 1 + neovim/config/options.lua | 6 ++++ neovim/config/plugins/gitsigns.lua | 55 ++++++++++++++++++++++++++++++ neovim/config/plugins/init.lua | 1 + neovim/nvim-pack-lock.json | 8 +++++ 6 files changed, 72 insertions(+) create mode 100644 neovim/config/plugins/gitsigns.lua create mode 100644 neovim/config/plugins/init.lua create mode 100644 neovim/nvim-pack-lock.json diff --git a/bootstrap.sh b/bootstrap.sh index bed56a8..61f3a61 100755 --- a/bootstrap.sh +++ b/bootstrap.sh @@ -38,6 +38,7 @@ echo "Setting up NeoVim" test -d $HOME/.config/nvim || mkdir -p $HOME/.config/nvim test -d $HOME/.local/share/nvim || mkdir -p $HOME/.local/share/nvim test -L $HOME/.config/nvim/init.lua || ln -f -s $BASEDIR/neovim/init.lua $HOME/.config/nvim/init.lua +test -L $HOME/.config/nvim/nvim-pack-lock.json || ln -f -s $BASEDIR/neovim/nvim-pack-lock.json $HOME/.config/nvim/nvim-pack-lock.json test -d $HOME/.config/nvim/lua || mkdir -p $HOME/.config/nvim/lua test -L $HOME/.config/nvim/lua/config || ln -f -s $BASEDIR/neovim/config $HOME/.config/nvim/lua/config test -d $HOME/.config/nvim/lsp || mkdir -p $HOME/.config/nvim/lsp diff --git a/neovim/config/init.lua b/neovim/config/init.lua index f9db727..379cf15 100644 --- a/neovim/config/init.lua +++ b/neovim/config/init.lua @@ -1,3 +1,4 @@ require('config.options') +require('config.plugins') require('config.diagnostics') require('config.lsp') diff --git a/neovim/config/options.lua b/neovim/config/options.lua index 5b0dff4..b66b348 100644 --- a/neovim/config/options.lua +++ b/neovim/config/options.lua @@ -1,8 +1,14 @@ +-- Set before any plugin defines a mapping +vim.g.mapleader = ' ' +vim.g.maplocalleader = '\\' + vim.o.autocomplete = true vim.o.pumborder = 'rounded' vim.o.pummaxwidth = 40 vim.o.completeopt = 'menu,menuone,noinsert,nearest' vim.o.number = true +-- Always shown, so git/diagnostic signs don't shift the text around +vim.o.signcolumn = 'yes' vim.o.spelllang = 'en_gb' vim.o.spell = true vim.o.termguicolors = true diff --git a/neovim/config/plugins/gitsigns.lua b/neovim/config/plugins/gitsigns.lua new file mode 100644 index 0000000..58df528 --- /dev/null +++ b/neovim/config/plugins/gitsigns.lua @@ -0,0 +1,55 @@ +vim.pack.add({ 'https://github.com/lewis6991/gitsigns.nvim' }) + +require('gitsigns').setup({ + on_attach = function(bufnr) + local gitsigns = require('gitsigns') + + local function map(mode, lhs, rhs, desc) + vim.keymap.set(mode, lhs, rhs, { buffer = bufnr, desc = desc }) + end + + -- Navigation, falling back to vim's own diff motions in diff mode + map('n', ']c', function() + if vim.wo.diff then + vim.cmd.normal({ ']c', bang = true }) + else + gitsigns.nav_hunk('next') + end + end, 'Next git hunk') + + map('n', '[c', function() + if vim.wo.diff then + vim.cmd.normal({ '[c', bang = true }) + else + gitsigns.nav_hunk('prev') + end + end, 'Previous git hunk') + + -- Actions + map('n', 'hs', gitsigns.stage_hunk, 'Stage hunk') + map('n', 'hr', gitsigns.reset_hunk, 'Reset hunk') + + map('v', 'hs', function() + gitsigns.stage_hunk({ vim.fn.line('.'), vim.fn.line('v') }) + end, 'Stage selected hunk') + + map('v', 'hr', function() + gitsigns.reset_hunk({ vim.fn.line('.'), vim.fn.line('v') }) + end, 'Reset selected hunk') + + map('n', 'hS', gitsigns.stage_buffer, 'Stage buffer') + map('n', 'hR', gitsigns.reset_buffer, 'Reset buffer') + map('n', 'hp', gitsigns.preview_hunk, 'Preview hunk') + map('n', 'hd', gitsigns.diffthis, 'Diff against index') + + map('n', 'hb', function() + gitsigns.blame_line({ full = true }) + end, 'Blame line') + + map('n', 'hq', gitsigns.setqflist, 'Hunks to quickfix') + + -- Toggles + map('n', 'tb', gitsigns.toggle_current_line_blame, 'Toggle line blame') + map('n', 'td', gitsigns.toggle_deleted, 'Toggle deleted lines') + end, +}) diff --git a/neovim/config/plugins/init.lua b/neovim/config/plugins/init.lua new file mode 100644 index 0000000..3ae1436 --- /dev/null +++ b/neovim/config/plugins/init.lua @@ -0,0 +1 @@ +require('config.plugins.gitsigns') diff --git a/neovim/nvim-pack-lock.json b/neovim/nvim-pack-lock.json new file mode 100644 index 0000000..73f107c --- /dev/null +++ b/neovim/nvim-pack-lock.json @@ -0,0 +1,8 @@ +{ + "plugins": { + "gitsigns.nvim": { + "rev": "31d6fb2d618bca1482b9f274751ead5f03461408", + "src": "https://github.com/lewis6991/gitsigns.nvim" + } + } +}