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" + } + } +}