diff --git a/lua/git/init.lua b/lua/git/init.lua index b9a8bc2..095f9ef 100644 --- a/lua/git/init.lua +++ b/lua/git/init.lua @@ -93,7 +93,7 @@ function M.setup() }) vim.keymap.set("n", "gg", function() - require("git.status_win").toggle() + require("git.sidebar").toggle() end, { desc = "Toggle git status sidebar" }) vim.keymap.set("n", "gl", function() require("git.log_win").show() diff --git a/lua/git/status_win.lua b/lua/git/sidebar.lua similarity index 96% rename from lua/git/status_win.lua rename to lua/git/sidebar.lua index 375eb16..2c0784e 100644 --- a/lua/git/status_win.lua +++ b/lua/git/sidebar.lua @@ -27,12 +27,12 @@ local SIDEBAR_WIDTH = 50 ---@field sha string ---@field subject string? ----@alias ow.Git.StatusEntry ow.Git.FileEntry | ow.Git.CommitEntry +---@alias ow.Git.SidebarEntry ow.Git.FileEntry | ow.Git.CommitEntry ----@class ow.Git.StatusState +---@class ow.Git.SidebarState ---@field gitdir string ---@field worktree string ----@field lines table +---@field lines table ---@field sidebar_win integer? ---@field diff_left_win integer? ---@field diff_right_win integer? @@ -40,21 +40,20 @@ local SIDEBAR_WIDTH = 50 ---@field last_shown_key string? ---@field last_render_key string? fingerprint of the last rendered state ----@type table +---@type table local state = {} -local group = - vim.api.nvim_create_augroup("ow.git.status_win", { clear = false }) -local ns = vim.api.nvim_create_namespace("ow.git.status_win") +local group = vim.api.nvim_create_augroup("ow.git.sidebar", { clear = false }) +local ns = vim.api.nvim_create_namespace("ow.git.sidebar") ---Find the sidebar window in the current tabpage by filetype. Used as a ----fallback when we don't have a `StatusState` handy (e.g. M.toggle). +---fallback when we don't have a `SidebarState` handy (e.g. M.toggle). ---@return integer? win ---@return integer? bufnr local function find_sidebar() for _, win in ipairs(vim.api.nvim_tabpage_list_wins(0)) do local buf = vim.api.nvim_win_get_buf(win) - if vim.bo[buf].filetype == "gitstatus" then + if vim.bo[buf].filetype == "gitsidebar" then return win, buf end end @@ -62,7 +61,7 @@ end ---Return the sidebar window stashed on `s`, validating that it's still ---live. Falls back to `find_sidebar` if the stashed handle is gone. ----@param s ow.Git.StatusState +---@param s ow.Git.SidebarState ---@return integer? local function sidebar_win_for(s) local win = s.sidebar_win @@ -74,7 +73,7 @@ local function sidebar_win_for(s) return win end ----@param entry ow.Git.StatusEntry +---@param entry ow.Git.SidebarEntry ---@return string? local function entry_code(entry) if entry.section == "Untracked" then @@ -88,7 +87,7 @@ local function entry_code(entry) end end ----@param entry ow.Git.StatusEntry +---@param entry ow.Git.SidebarEntry ---@return string? line ---@return string? hl_group ---@return integer? hl_len byte length of the symbol portion at column 2 @@ -147,7 +146,7 @@ end ---pair. `Unpushed` and `Unpulled` start empty here; ahead/behind commits are ---filled in by a follow-up `git log` once we know the upstream is set. ---@param stdout string ----@return ow.Git.BranchInfo, table +---@return ow.Git.BranchInfo, table local function parse_porcelain(stdout) local branch = { ahead = 0, behind = 0 } local groups = { @@ -219,8 +218,8 @@ end ---there's nothing to fetch). ---@param worktree string ---@param branch ow.Git.BranchInfo ----@param groups table ----@param callback fun(branch: ow.Git.BranchInfo, groups: table) +---@param groups table +---@param callback fun(branch: ow.Git.BranchInfo, groups: table) local function enrich_with_log(worktree, branch, groups, callback) local fetches = {} if branch.upstream and branch.ahead > 0 then @@ -283,7 +282,7 @@ end ---we skip the duplicate subprocess. Otherwise the sidebar fetches its own. ---@param worktree string ---@param prefetched_stdout string? ----@param callback fun(branch: ow.Git.BranchInfo, groups: table) +---@param callback fun(branch: ow.Git.BranchInfo, groups: table) local function fetch_status(worktree, prefetched_stdout, callback) if prefetched_stdout then local branch, groups = parse_porcelain(prefetched_stdout) @@ -323,7 +322,7 @@ end ---@param bufnr integer ---@param branch ow.Git.BranchInfo ----@param groups table +---@param groups table local function render(bufnr, branch, groups) local lines = { "Head: " .. (branch.head or "?") } if branch.upstream then @@ -380,7 +379,7 @@ end ---short-circuit when the porcelain state is byte-identical to the last ---successful render. ---@param branch ow.Git.BranchInfo ----@param groups table +---@param groups table ---@return string local function fingerprint(branch, groups) local parts = { @@ -463,8 +462,8 @@ local function refresh(bufnr, prefetched_stdout) end ---@param bufnr integer ----@return ow.Git.StatusState? ----@return ow.Git.StatusEntry? +---@return ow.Git.SidebarState? +---@return ow.Git.SidebarEntry? local function current_entry(bufnr) local s = state[bufnr] if not s then @@ -514,7 +513,7 @@ local function worktree_empty_pane(path) return { buf = diff.empty_buf(), name = "git://worktree/" .. path } end ----@param s ow.Git.StatusState +---@param s ow.Git.SidebarState ---@param entry ow.Git.FileEntry ---@return ow.Git.DiffSide local function index_pane(s, entry) @@ -529,7 +528,7 @@ local function index_pane(s, entry) } end ----@param s ow.Git.StatusState +---@param s ow.Git.SidebarState ---@param entry ow.Git.FileEntry ---@return ow.Git.DiffSide? local function other_pane(s, entry) @@ -556,7 +555,7 @@ local function other_pane(s, entry) end end ----@param s ow.Git.StatusState +---@param s ow.Git.SidebarState ---@param entry ow.Git.FileEntry ---@return ow.Git.DiffPair? local function compute_pair(s, entry) @@ -610,7 +609,7 @@ local function set_diff(win, enabled) end end ----@param s ow.Git.StatusState +---@param s ow.Git.SidebarState ---@param sidebar_win integer ---@return integer? left ---@return integer? right @@ -660,8 +659,8 @@ local function vsplit_at(target_win, dir) ) end ----@param s ow.Git.StatusState ----@param entry ow.Git.StatusEntry +---@param s ow.Git.SidebarState +---@param entry ow.Git.SidebarEntry ---@param focus_left boolean local function show_diff(s, entry, focus_left) if not entry.path then @@ -883,7 +882,7 @@ local function open(worktree) local previous_win = vim.api.nvim_get_current_win() local bufnr, win = git.new_scratch({ split = "left", bufhidden = "wipe" }) - vim.bo[bufnr].filetype = "gitstatus" + vim.bo[bufnr].filetype = "gitsidebar" vim.wo[win].number = false vim.wo[win].relativenumber = false diff --git a/syntax/gitstatus.vim b/syntax/gitstatus.vim index bea8b08..01e4522 100644 --- a/syntax/gitstatus.vim +++ b/syntax/gitstatus.vim @@ -2,43 +2,43 @@ if exists("b:current_syntax") finish endif -syntax match gitstatusLabel /\v^(Head|Push)\ze:/ -syntax match gitstatusBranch /\v(^(Head|Push):\s+)@<=\S+/ -syntax match gitstatusAhead /\v\+\d+/ -syntax match gitstatusBehind /\v-\d+/ +syntax match gitsidebarLabel /\v^(Head|Push)\ze:/ +syntax match gitsidebarBranch /\v(^(Head|Push):\s+)@<=\S+/ +syntax match gitsidebarAhead /\v\+\d+/ +syntax match gitsidebarBehind /\v-\d+/ -syntax region gitstatusUntrackedHeader start=/\v^Untracked>/ end=/\v^$/ -syntax region gitstatusUnstagedHeader start=/\v^Unstaged>/ end=/\v^$/ -syntax region gitstatusStagedHeader start=/\v^Staged>/ end=/\v^$/ -syntax region gitstatusUnmergedHeader start=/\v^Unmerged>/ end=/\v^$/ -syntax region gitstatusUnpushedHeader start=/\v^Unpushed>/ end=/\v^$/ -syntax region gitstatusUnpulledHeader start=/\v^Unpulled>/ end=/\v^$/ +syntax region gitsidebarUntrackedHeader start=/\v^Untracked>/ end=/\v^$/ +syntax region gitsidebarUnstagedHeader start=/\v^Unstaged>/ end=/\v^$/ +syntax region gitsidebarStagedHeader start=/\v^Staged>/ end=/\v^$/ +syntax region gitsidebarUnmergedHeader start=/\v^Unmerged>/ end=/\v^$/ +syntax region gitsidebarUnpushedHeader start=/\v^Unpushed>/ end=/\v^$/ +syntax region gitsidebarUnpulledHeader start=/\v^Unpulled>/ end=/\v^$/ -syntax match gitstatusUntrackedLabel /\v^Untracked/ contained containedin=gitstatusUntrackedHeader -syntax match gitstatusUnstagedLabel /\v^Unstaged/ contained containedin=gitstatusUnstagedHeader -syntax match gitstatusStagedLabel /\v^Staged/ contained containedin=gitstatusStagedHeader -syntax match gitstatusUnmergedLabel /\v^Unmerged/ contained containedin=gitstatusUnmergedHeader -syntax match gitstatusUnpushedLabel /\v^Unpushed/ contained containedin=gitstatusUnpushedHeader -syntax match gitstatusUnpulledLabel /\v^Unpulled/ contained containedin=gitstatusUnpulledHeader +syntax match gitsidebarUntrackedLabel /\v^Untracked/ contained containedin=gitsidebarUntrackedHeader +syntax match gitsidebarUnstagedLabel /\v^Unstaged/ contained containedin=gitsidebarUnstagedHeader +syntax match gitsidebarStagedLabel /\v^Staged/ contained containedin=gitsidebarStagedHeader +syntax match gitsidebarUnmergedLabel /\v^Unmerged/ contained containedin=gitsidebarUnmergedHeader +syntax match gitsidebarUnpushedLabel /\v^Unpushed/ contained containedin=gitsidebarUnpushedHeader +syntax match gitsidebarUnpulledLabel /\v^Unpulled/ contained containedin=gitsidebarUnpulledHeader -syntax match gitstatusHeaderCount /\v\(\zs\d+\ze\)/ contained containedin=gitstatusUntrackedHeader, - \ gitstatusUnstagedHeader, - \ gitstatusStagedHeader, - \ gitstatusUnmergedHeader, - \ gitstatusUnpushedHeader, - \ gitstatusUnpulledHeader +syntax match gitsidebarHeaderCount /\v\(\zs\d+\ze\)/ contained containedin=gitsidebarUntrackedHeader, + \ gitsidebarUnstagedHeader, + \ gitsidebarStagedHeader, + \ gitsidebarUnmergedHeader, + \ gitsidebarUnpushedHeader, + \ gitsidebarUnpulledHeader -highlight default link gitstatusLabel Label -highlight default link gitstatusBranch None -highlight default link gitstatusAhead GitUnpushed -highlight default link gitstatusBehind GitUnpulled -highlight default link gitstatusHeaderCount Number +highlight default link gitsidebarLabel Label +highlight default link gitsidebarBranch None +highlight default link gitsidebarAhead GitUnpushed +highlight default link gitsidebarBehind GitUnpulled +highlight default link gitsidebarHeaderCount Number -highlight default link gitstatusUntrackedLabel gitstatusLabel -highlight default link gitstatusUnstagedLabel gitstatusLabel -highlight default link gitstatusStagedLabel gitstatusLabel -highlight default link gitstatusUnmergedLabel gitstatusLabel -highlight default link gitstatusUnpushedLabel gitstatusLabel -highlight default link gitstatusUnpulledLabel gitstatusLabel +highlight default link gitsidebarUntrackedLabel gitsidebarLabel +highlight default link gitsidebarUnstagedLabel gitsidebarLabel +highlight default link gitsidebarStagedLabel gitsidebarLabel +highlight default link gitsidebarUnmergedLabel gitsidebarLabel +highlight default link gitsidebarUnpushedLabel gitsidebarLabel +highlight default link gitsidebarUnpulledLabel gitsidebarLabel -let b:current_syntax = "gitstatus" +let b:current_syntax = "gitsidebar"