diff --git a/nvim/.config/nvim/lua/DarthMooMancer/ui.lua b/nvim/.config/nvim/lua/DarthMooMancer/ui.lua index b104ffa..ffb5a55 100644 --- a/nvim/.config/nvim/lua/DarthMooMancer/ui.lua +++ b/nvim/.config/nvim/lua/DarthMooMancer/ui.lua @@ -28,7 +28,7 @@ local function setup_statusline_highlights() derive_mode_hl('StatusModeCommand', 'PreProc') derive_mode_hl('StatusModeReplace', 'WarningMsg') derive_mode_hl('StatusModeTerminal', 'Special') - derive_hl('StatusGit', { base = 'StatusLine', fg = 'LineNr' }) + derive_hl('StatusGit', { base = 'CursorLine', fg = 'LineNr' }) derive_hl('StatusLsp', { base = 'StatusLine', fg = 'DiagnosticInfo' }) derive_hl('StatusLspSpinner', { base = 'StatusLine', fg = 'Constant' }) derive_hl( @@ -37,7 +37,12 @@ local function setup_statusline_highlights() ) derive_hl('StatusDiagWarn', { base = 'StatusLine', fg = 'DiagnosticWarn' }) derive_hl('StatusDiagHint', { base = 'StatusLine', fg = 'DiagnosticHint' }) - derive_hl('StatusCursor', { base = 'StatusLine', fg = 'Normal' }) + derive_hl('StatusCursor', { base = 'CursorLine', fg = 'Normal' }) + derive_hl('StatusGitAdded', { base = 'StatusLine', fg = 'OkMsg' }) + derive_hl( + 'StatusGitRemoved', + { base = 'StatusLine', fg = 'DiagnosticError' } + ) end vim.api.nvim_create_autocmd('ColorScheme', { callback = setup_statusline_highlights, @@ -81,7 +86,7 @@ local function update_git_branch() end ) end -vim.uv.new_timer():start(5000, 5000, update_git_branch) +vim.uv.new_timer():start(5000, 5000, vim.schedule_wrap(update_git_branch)) vim.api.nvim_create_autocmd({ 'BufEnter', 'FocusGained' }, { callback = function() update_git_branch() @@ -217,23 +222,66 @@ vim.api.nvim_create_autocmd( { callback = update_diag_cache } ) +local function update_git_diff() + if vim.bo.buftype ~= '' then + return + end + local file = vim.fn.expand('%:p') + if file == '' then + return + end + vim.system( + { 'git', 'diff', '--numstat', 'HEAD', '--', file }, + { text = true }, + function(out) + if out.code ~= 0 or out.stdout == '' then + vim.b.git_diff = nil + return + end + local added, removed = out.stdout:match('(%d+)%s+(%d+)') + vim.b.git_diff = { + added = tonumber(added) or 0, + removed = tonumber(removed) or 0, + } + end + ) +end +vim.api.nvim_create_autocmd({ 'BufEnter', 'FocusGained', 'BufWritePost' }, { + callback = update_git_diff, +}) + function _G.__statusline() local m = vim.fn.mode() local mode_hl = mode_hl_map[m] or 'StatusModeNormal' local git = vim.b.git_branch or '' local cur_buf = vim.api.nvim_get_current_buf() - local parts = { '%#' .. mode_hl .. '#' .. (mode_map[m] or ' ?? ') .. '%*', git ~= '' and ('%#StatusGit#  ' .. git .. ' %*') or '', - lsp_section(), - '%=', - diag_cache[cur_buf] or build_diag_string(vim.diagnostic.count(cur_buf)), - '%#StatusCursor# %l:%-2c %*', - '%#' .. mode_hl .. '# %p%% %*', } + local diff = vim.b.git_diff + if diff and (diff.added > 0 or diff.removed > 0) then + if diff.added > 0 then + table.insert(parts, '%#StatusGitAdded# +' .. diff.added .. ' %*') + end + if diff.removed > 0 then + table.insert( + parts, + '%#StatusGitRemoved# -' .. diff.removed .. ' %*' + ) + end + end + table.insert(parts, lsp_section()) + table.insert(parts, '%=') + table.insert( + parts, + diag_cache[cur_buf] or build_diag_string(vim.diagnostic.count(cur_buf)) + ) + table.insert(parts, '%#StatusCursor# %l:%-2c %*') + table.insert(parts, '%#' .. mode_hl .. '# %p%% %*') return table.concat(parts) end + vim.o.statusline = '%!v:lua.__statusline()' require('incline').setup({