diff --git a/nix/neovim-overlay.nix b/nix/neovim-overlay.nix index f3219ea..3a1addb 100644 --- a/nix/neovim-overlay.nix +++ b/nix/neovim-overlay.nix @@ -20,7 +20,6 @@ with final.pkgs.lib; let copilot-lua diffview-nvim eyeliner-nvim - gitsigns-nvim lazy-nvim mini-nvim neogit diff --git a/nvim/lua/plugins/mini.lua b/nvim/lua/plugins/mini.lua index 4a0ca07..c676575 100644 --- a/nvim/lua/plugins/mini.lua +++ b/nvim/lua/plugins/mini.lua @@ -3,6 +3,44 @@ return { 'echasnovski/mini.nvim', lazy = false, dependencies = { 'folke/snacks.nvim' }, + keys = { + { + 'gp', + function() + MiniDiff.toggle_overlay(0) + end, + noremap = true, + desc = 'git diff overlay', + }, + { + 'gr', + function() + return MiniDiff.operator('reset') .. 'gh' + end, + noremap = true, + desc = 'git diff reset', + }, + { + 'gd', + function() + return MiniGit.show_at_cursor() + end, + noremap = true, + desc = 'git show at cursor', + }, + { + 'gb', + 'vert Git blame -- %', + noremap = true, + desc = 'git blame', + }, + { + 'gg', + ':Git ', + noremap = true, + desc = 'git command', + }, + }, config = function() require('mini.basics').setup { mappings = { windows = true } } require('mini.tabline').setup { @@ -13,17 +51,10 @@ return { content = { active = function() local mode, mode_hl = MiniStatusline.section_mode {} - local git = function() - local g = vim.b.gitsigns_head - return (g == nil) and '' or g - end - local diff = function() - local g = vim.b.gitsigns_status - return (g == nil) and '' or g - end + local filename = MiniStatusline.section_filename { trunc_width = 140 } + local diff = MiniStatusline.section_diff { trunc_width = 75, icon = '' } local diagnostics = MiniStatusline.section_diagnostics { trunc_width = 75 } local lsp = MiniStatusline.section_lsp { trunc_width = 75 } - local filename = MiniStatusline.section_filename { trunc_width = 140 } local search = MiniStatusline.section_searchcount { trunc_width = 75 } return MiniStatusline.combine_groups { @@ -31,7 +62,7 @@ return { '%<', -- Mark general truncate point { hl = 'MiniStatuslineFilename', strings = { filename } }, '%=', -- End left alignment - { hl = 'MiniStatusDevinfo', strings = { git(), diff(), diagnostics, lsp } }, + { hl = 'MiniStatusDevinfo', strings = { diff, diagnostics, lsp } }, { hl = mode_hl, strings = { search } }, } end, @@ -51,12 +82,29 @@ return { require('mini.jump2d').setup { mappings = { start_jumping = 'S' } } require('mini.operators').setup { replace = { - prefix = "gR" - } + prefix = 'gR', + }, } + require('mini.git').setup() + local align_blame = function(au_data) + if au_data.data.git_subcommand ~= 'blame' then + return + end + + -- Align blame output with source + local win_src = au_data.data.win_source + vim.wo.wrap = false + vim.fn.winrestview { topline = vim.fn.line('w0', win_src) } + vim.api.nvim_win_set_cursor(0, { vim.fn.line('.', win_src), 0 }) + + -- Bind both windows so that they scroll together + vim.wo[win_src].scrollbind, vim.wo.scrollbind = true, true + end + vim.api.nvim_create_autocmd('User', { pattern = 'MiniGitCommandSplit', callback = align_blame }) + require('mini.surround').setup() require('mini.splitjoin').setup { detect = { separator = '[,;\n]' } } - + require('mini.diff').setup { options = { wrap_goto = true } } local miniclue = require('mini.clue') miniclue.setup { triggers = { @@ -99,12 +147,10 @@ return { integrations = { map.gen_integration.builtin_search(), map.gen_integration.diagnostic(), - map.gen_integration.gitsigns(), + map.gen_integration.diff(), }, window = { show_integration_count = false, - winblend = 0, - width = 5, }, } vim.keymap.set('n', 'nm', map.toggle, { noremap = true, desc = 'minimap open' }) diff --git a/nvim/lua/plugins/misc.lua b/nvim/lua/plugins/misc.lua index c5da54a..10143cb 100644 --- a/nvim/lua/plugins/misc.lua +++ b/nvim/lua/plugins/misc.lua @@ -107,55 +107,11 @@ return { vim.cmd('colorscheme terafox') vim.api.nvim_set_hl(0, 'StatusLine', { bg = 'none' }) vim.api.nvim_set_hl(0, 'StatusLineNC', { bg = 'none' }) - vim.api.nvim_set_hl(0, 'GitSignsAdd', { fg = 'green', bold = true }) - vim.api.nvim_set_hl(0, 'GitSignsDelete', { fg = 'red', bold = true }) - vim.api.nvim_set_hl(0, 'GitSignsChange', { fg = 'green', bold = true }) - vim.api.nvim_set_hl(0, 'GitSignsCurrentLineBlame', { link = 'Comment' }) + vim.api.nvim_set_hl(0, 'MiniDiffSignAdd', { fg = 'green', bold = true }) + vim.api.nvim_set_hl(0, 'MiniDiffSignDelete', { fg = 'red', bold = true }) + vim.api.nvim_set_hl(0, 'MiniDiffSignChange', { fg = 'green', bold = true }) end, }, - { - 'lewis6991/gitsigns.nvim', - event = 'VeryLazy', - opts = { - signcolumn = false, - numhl = true, - on_attach = function() - local gs = package.loaded.gitsigns - vim.keymap.set('n', 'gg', gs.preview_hunk, { desc = 'git preview hunk' }) - vim.keymap.set('n', 'gR', gs.reset_hunk, { desc = 'git reset hunk' }) - vim.keymap.set('n', 'gs', gs.stage_hunk, { desc = 'git stage hunk' }) - vim.keymap.set('n', 'gd', gs.diffthis, { desc = 'git diff hunk' }) - vim.keymap.set('n', 'gb', function() - gs.blame_line { full = true } - end, { desc = 'git blame_line current' }) - vim.keymap.set('n', 'gB', gs.toggle_current_line_blame, { desc = 'git blame_line toggle' }) - vim.keymap.set('v', 'gR', function() - gs.reset_hunk { vim.fn.line('.'), vim.fn.line('v') } - end, { desc = 'git reset hunk' }) - - -- Navigation - vim.keymap.set('n', ']g', function() - if vim.wo.diff then - return ']c' - end - vim.schedule(function() - gs.next_hunk { target = 'all' } - end) - return '' - end, { expr = true }) - - vim.keymap.set('n', '[g', function() - if vim.wo.diff then - return '[c' - end - vim.schedule(function() - gs.prev_hunk { target = 'all' } - end) - return '' - end, { expr = true }) - end, - }, - }, { 'gbprod/yanky.nvim', opts = { diff --git a/nvim/lua/plugins/snacks.lua b/nvim/lua/plugins/snacks.lua index 9e22dae..2e8d55f 100644 --- a/nvim/lua/plugins/snacks.lua +++ b/nvim/lua/plugins/snacks.lua @@ -124,91 +124,115 @@ return { function() Snacks.picker.smart() end, - { noremap = true, silent = true, desc = 'Fuzzy find files' }, + noremap = true, + desc = 'Fuzzy find files', }, { 'fe', function() Snacks.explorer() end, - { noremap = true, silent = true, desc = 'snacks explorer' }, + noremap = true, + desc = 'snacks explorer', }, { 'fE', function() Snacks.explorer.reveal() end, - { noremap = true, silent = true, desc = 'snacks explorer open current file' }, + noremap = true, + silent = true, + desc = 'snacks explorer open current file', }, { 'fg', function() Snacks.picker.git_files() end, - { noremap = true, silent = true, desc = 'Fuzzy find files' }, + noremap = true, + silent = true, + desc = 'Fuzzy find files', }, { 'fa', function() Snacks.picker.grep() end, - { noremap = true, silent = true, desc = 'Fuzzy find grep' }, + noremap = true, + silent = true, + desc = 'Fuzzy find grep', }, { 'f8', function() Snacks.picker.grep_word() end, - { noremap = true, silent = true, desc = 'Fuzzy find grep word' }, + noremap = true, + silent = true, + desc = 'Fuzzy find grep word', }, { 'f?', function() Snacks.picker.pickers() end, - { noremap = true, silent = true, desc = 'See all pickers' }, + noremap = true, + silent = true, + desc = 'See all pickers', }, { "f'", function() Snacks.picker.marks() end, - { noremap = true, silent = true, desc = 'Pick marks' }, + noremap = true, + silent = true, + desc = 'Pick marks', }, { 'fu', function() Snacks.picker.undo() end, - { noremap = true, silent = true, desc = 'Pick undotree' }, + noremap = true, + silent = true, + desc = 'Pick undotree', }, { 'fj', function() Snacks.picker.jumps() end, - { noremap = true, silent = true, desc = 'Pick jumps' }, + noremap = true, + silent = true, + desc = 'Pick jumps', }, { 'f.', function() Snacks.picker.resume() end, - { noremap = true, silent = true, desc = 'Fuzzy find resume' }, + noremap = true, + silent = true, + desc = 'Fuzzy find resume', }, { '', function() Snacks.picker.buffers() end, - { noremap = true, silent = true, desc = 'Fuzzy find buffers' }, + noremap = true, + silent = true, + desc = 'Fuzzy find buffers', }, { 'fn', function() Snacks.picker.notifications() end, - { noremap = true, silent = true, desc = 'pick notifications' }, + noremap = true, + silent = true, + desc = 'pick notifications', }, }, },