feat(git): status_view help hint, mouse open, extmark highlights
This commit is contained in:
+42
-7
@@ -106,29 +106,59 @@ end
|
||||
---@param status ow.Git.Status
|
||||
local function render(bufnr, status)
|
||||
local branch = status.branch
|
||||
local lines = { "Head: " .. (branch.head or "?") }
|
||||
local lines = {}
|
||||
local marks = {}
|
||||
local meta = {}
|
||||
|
||||
local function label(row, len)
|
||||
table.insert(marks, { row = row, col = 0, end_col = len, hl = "Label" })
|
||||
end
|
||||
|
||||
table.insert(lines, "Head: " .. (branch.head or "?"))
|
||||
label(#lines - 1, 4)
|
||||
|
||||
if branch.upstream then
|
||||
local push = "Push: " .. branch.upstream
|
||||
local extras = {}
|
||||
if branch.ahead > 0 then
|
||||
local col = #push + 1
|
||||
push = push .. " +" .. branch.ahead
|
||||
table.insert(extras, { col = col, end_col = #push, hl = "GitUnpushed" })
|
||||
end
|
||||
if branch.behind > 0 then
|
||||
local col = #push + 1
|
||||
push = push .. " -" .. branch.behind
|
||||
table.insert(extras, { col = col, end_col = #push, hl = "GitUnpulled" })
|
||||
end
|
||||
table.insert(lines, push)
|
||||
local row = #lines - 1
|
||||
label(row, 4)
|
||||
for _, e in ipairs(extras) do
|
||||
e.row = row
|
||||
table.insert(marks, e)
|
||||
end
|
||||
end
|
||||
|
||||
table.insert(lines, "Help: g?")
|
||||
label(#lines - 1, 4)
|
||||
|
||||
table.insert(lines, "")
|
||||
|
||||
local meta = {}
|
||||
local marks = {}
|
||||
for _, section in ipairs(SECTIONS) do
|
||||
local rows = status:rows(section)
|
||||
if #rows > 0 then
|
||||
table.insert(
|
||||
lines,
|
||||
string.format("%s (%d)", display_name(section), #rows)
|
||||
)
|
||||
local name = display_name(section)
|
||||
local header = string.format("%s (%d)", name, #rows)
|
||||
table.insert(lines, header)
|
||||
local header_row = #lines - 1
|
||||
meta[#lines] = { is_header = true, section = section }
|
||||
label(header_row, #name)
|
||||
table.insert(marks, {
|
||||
row = header_row,
|
||||
col = #name + 2,
|
||||
end_col = #header - 1,
|
||||
hl = "Number",
|
||||
})
|
||||
for _, row in ipairs(rows) do
|
||||
local line, hl, hl_len = format_row(row)
|
||||
table.insert(lines, line)
|
||||
@@ -519,8 +549,10 @@ local function action_help(placement)
|
||||
if placement == "sidebar" then
|
||||
table.insert(lines, " <Tab> preview diff (keep focus)")
|
||||
table.insert(lines, " <CR> open diff (focus left pane)")
|
||||
table.insert(lines, " <2-LeftMouse> open diff (focus left pane)")
|
||||
else
|
||||
table.insert(lines, " <CR> open file")
|
||||
table.insert(lines, " <2-LeftMouse> open file")
|
||||
end
|
||||
table.insert(lines, " s stage file")
|
||||
table.insert(lines, " u unstage file")
|
||||
@@ -579,6 +611,9 @@ local function setup_buffer(bufnr, r, placement, win)
|
||||
k("<CR>", function()
|
||||
preview_or_open(true)
|
||||
end, "Open")
|
||||
k("<2-LeftMouse>", function()
|
||||
preview_or_open(true)
|
||||
end, "Open")
|
||||
k("s", action_stage, "Stage file")
|
||||
k("u", action_unstage, "Unstage file")
|
||||
k("X", action_discard, "Discard worktree changes")
|
||||
|
||||
@@ -1,44 +0,0 @@
|
||||
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 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 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 gitStatusHeaderCount /\v\(\zs\d+\ze\)/ contained containedin=gitStatusUntrackedHeader,
|
||||
\ gitStatusUnstagedHeader,
|
||||
\ gitStatusStagedHeader,
|
||||
\ gitStatusUnmergedHeader,
|
||||
\ gitStatusUnpushedHeader,
|
||||
\ gitStatusUnpulledHeader
|
||||
|
||||
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 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
|
||||
|
||||
let b:current_syntax = "gitStatus"
|
||||
Reference in New Issue
Block a user