feat(octo): re-open octo windows when restoring session + cleanup
This commit is contained in:
@ -48,53 +48,20 @@ return {
|
|||||||
else
|
else
|
||||||
LazyVim.error("`octo.nvim` requires `telescope.nvim` or `fzf-lua`")
|
LazyVim.error("`octo.nvim` requires `telescope.nvim` or `fzf-lua`")
|
||||||
end
|
end
|
||||||
local Signs = require("octo.ui.signs")
|
|
||||||
|
|
||||||
---@type {buf: number, from: number, to: number, dirty: boolean}[]
|
-- Keep some empty windows in sessions
|
||||||
local signs = {}
|
vim.api.nvim_create_autocmd("ExitPre", {
|
||||||
|
group = vim.api.nvim_create_augroup("octo_exit_pre", { clear = true }),
|
||||||
local unplace = Signs.unplace
|
callback = function(ev)
|
||||||
function Signs.unplace(bufnr)
|
local keep = { "octo" }
|
||||||
signs = vim.tbl_filter(function(s)
|
for _, win in ipairs(vim.api.nvim_list_wins()) do
|
||||||
return s.buf ~= bufnr
|
local buf = vim.api.nvim_win_get_buf(win)
|
||||||
end, signs)
|
if vim.tbl_contains(keep, vim.bo[buf].filetype) then
|
||||||
return unplace(bufnr)
|
vim.bo[buf].buftype = "" -- set buftype to empty to keep the window
|
||||||
end
|
|
||||||
|
|
||||||
function Signs.place_signs(bufnr, start_line, end_line, is_dirty)
|
|
||||||
signs[#signs + 1] = { buf = bufnr, from = start_line, to = end_line, dirty = is_dirty }
|
|
||||||
end
|
|
||||||
-- stylua: ignore
|
|
||||||
local corners = {
|
|
||||||
top = "┌╴",
|
|
||||||
middle = "│ ",
|
|
||||||
last = "└╴",
|
|
||||||
single = "[ ",
|
|
||||||
}
|
|
||||||
|
|
||||||
--- Fixes octo's comment rendering to take wrapping into account
|
|
||||||
---@param buf number
|
|
||||||
---@param lnum number
|
|
||||||
---@param vnum number
|
|
||||||
---@param win number
|
|
||||||
table.insert(LazyVim.ui.virtual, function(buf, lnum, vnum, win)
|
|
||||||
lnum = lnum - 1
|
|
||||||
for _, s in ipairs(signs) do
|
|
||||||
if buf == s.buf and lnum >= s.from and lnum <= s.to then
|
|
||||||
local height = vim.api.nvim_win_text_height(win, { start_row = s.from, end_row = s.to }).all
|
|
||||||
local height_end = vim.api.nvim_win_text_height(win, { start_row = s.to, end_row = s.to }).all
|
|
||||||
local corner = corners.middle
|
|
||||||
if height == 1 then
|
|
||||||
corner = corners.single
|
|
||||||
elseif lnum == s.from and vnum == 0 then
|
|
||||||
corner = corners.top
|
|
||||||
elseif lnum == s.to and vnum == height_end - 1 then
|
|
||||||
corner = corners.last
|
|
||||||
end
|
|
||||||
return { { text = corner, texthl = s.dirty and "OctoDirty" or "IblScope" } }
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end)
|
end,
|
||||||
|
})
|
||||||
end,
|
end,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
@ -1,9 +1,6 @@
|
|||||||
---@class lazyvim.util.ui
|
---@class lazyvim.util.ui
|
||||||
local M = {}
|
local M = {}
|
||||||
|
|
||||||
---@type (fun(buf:number, lnum:number, vnum:number, win:number):Sign[]?)[]
|
|
||||||
M.virtual = {}
|
|
||||||
|
|
||||||
---@alias Sign {name:string, text:string, texthl:string, priority:number}
|
---@alias Sign {name:string, text:string, texthl:string, priority:number}
|
||||||
|
|
||||||
-- Returns a list of regular and extmark signs sorted by priority (low to high)
|
-- Returns a list of regular and extmark signs sorted by priority (low to high)
|
||||||
@ -108,21 +105,9 @@ function M.statuscolumn()
|
|||||||
if show_signs then
|
if show_signs then
|
||||||
local signs = M.get_signs(buf, vim.v.lnum)
|
local signs = M.get_signs(buf, vim.v.lnum)
|
||||||
|
|
||||||
local has_virtual = false
|
|
||||||
for _, fn in ipairs(M.virtual) do
|
|
||||||
local virtual = fn(buf, vim.v.lnum, vim.v.virtnum, win)
|
|
||||||
if virtual then
|
|
||||||
has_virtual = true
|
|
||||||
vim.list_extend(signs, virtual)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
---@type Sign?,Sign?,Sign?
|
---@type Sign?,Sign?,Sign?
|
||||||
local left, right, fold, githl
|
local left, right, fold, githl
|
||||||
for _, s in ipairs(signs) do
|
for _, s in ipairs(signs) do
|
||||||
if s.name and s.name:lower():find("^octo_clean") then
|
|
||||||
s.texthl = "IblScope"
|
|
||||||
end
|
|
||||||
if s.name and (s.name:find("GitSign") or s.name:find("MiniDiffSign")) then
|
if s.name and (s.name:find("GitSign") or s.name:find("MiniDiffSign")) then
|
||||||
right = s
|
right = s
|
||||||
if use_githl then
|
if use_githl then
|
||||||
@ -132,9 +117,6 @@ function M.statuscolumn()
|
|||||||
left = s
|
left = s
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
if vim.v.virtnum ~= 0 and not has_virtual then
|
|
||||||
left = nil
|
|
||||||
end
|
|
||||||
|
|
||||||
vim.api.nvim_win_call(win, function()
|
vim.api.nvim_win_call(win, function()
|
||||||
if vim.fn.foldclosed(vim.v.lnum) >= 0 then
|
if vim.fn.foldclosed(vim.v.lnum) >= 0 then
|
||||||
|
Reference in New Issue
Block a user