mirror of https://github.com/folke/lazy.nvim.git
feat: lazy view
This commit is contained in:
parent
a612e6f6f4
commit
a87982ff15
|
@ -0,0 +1,57 @@
|
||||||
|
local M = {}
|
||||||
|
|
||||||
|
M.colors = {
|
||||||
|
Error = "Error",
|
||||||
|
H1 = "Title",
|
||||||
|
H2 = "Title",
|
||||||
|
Muted = "Comment",
|
||||||
|
Normal = "NormalFloat",
|
||||||
|
ProgressDone = {
|
||||||
|
bold = true,
|
||||||
|
default = true,
|
||||||
|
fg = "#ff007c",
|
||||||
|
},
|
||||||
|
ProgressTodo = "LineNr",
|
||||||
|
Special = "@punctuation.special",
|
||||||
|
}
|
||||||
|
|
||||||
|
M.did_setup = true
|
||||||
|
|
||||||
|
function M.set_hl()
|
||||||
|
for hl_group, opts in pairs(M.colors) do
|
||||||
|
hl_group = "Lazy" .. hl_group
|
||||||
|
|
||||||
|
if type(opts) == "string" then
|
||||||
|
opts = {
|
||||||
|
link = opts,
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
opts.default = true
|
||||||
|
|
||||||
|
vim.api.nvim_set_hl(0, hl_group, opts)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function M.setup()
|
||||||
|
if M.did_setup then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
M.did_setup = true
|
||||||
|
|
||||||
|
M.set_hl()
|
||||||
|
vim.api.nvim_create_autocmd("ColorScheme", {
|
||||||
|
callback = function()
|
||||||
|
M.set_hl()
|
||||||
|
end,
|
||||||
|
})
|
||||||
|
vim.api.nvim_create_autocmd("User", {
|
||||||
|
pattern = "VeryLazy",
|
||||||
|
callback = function()
|
||||||
|
M.set_hl()
|
||||||
|
end,
|
||||||
|
})
|
||||||
|
end
|
||||||
|
|
||||||
|
return M
|
|
@ -0,0 +1,95 @@
|
||||||
|
local Render = require("lazy.view.render")
|
||||||
|
|
||||||
|
local M = {}
|
||||||
|
|
||||||
|
function M.setup()
|
||||||
|
require("lazy.view.commands").setup()
|
||||||
|
require("lazy.view.colors").setup()
|
||||||
|
end
|
||||||
|
|
||||||
|
function M.show()
|
||||||
|
require("lazy.view.colors").setup()
|
||||||
|
|
||||||
|
if M._buf and vim.api.nvim_buf_is_valid(M._buf) then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
local buf = vim.api.nvim_create_buf(false, false)
|
||||||
|
M._buf = buf
|
||||||
|
local vpad = 6
|
||||||
|
local hpad = 20
|
||||||
|
local opts = {
|
||||||
|
relative = "editor",
|
||||||
|
style = "minimal",
|
||||||
|
width = math.min(vim.o.columns - hpad * 2, 150),
|
||||||
|
height = math.min(vim.o.lines - vpad * 2, 50),
|
||||||
|
}
|
||||||
|
opts.row = (vim.o.lines - opts.height) / 2
|
||||||
|
opts.col = (vim.o.columns - opts.width) / 2
|
||||||
|
local win = vim.api.nvim_open_win(buf, true, opts)
|
||||||
|
|
||||||
|
vim.api.nvim_set_current_win(win)
|
||||||
|
|
||||||
|
vim.bo[buf].buftype = "nofile"
|
||||||
|
vim.bo[buf].bufhidden = "wipe"
|
||||||
|
vim.wo[win].conceallevel = 3
|
||||||
|
vim.wo[win].spell = false
|
||||||
|
vim.wo[win].wrap = true
|
||||||
|
vim.wo[win].winhighlight = "Normal:LazyNormal"
|
||||||
|
|
||||||
|
local function close()
|
||||||
|
M._buf = nil
|
||||||
|
|
||||||
|
if vim.api.nvim_buf_is_valid(buf) then
|
||||||
|
vim.api.nvim_buf_delete(buf, {
|
||||||
|
force = true,
|
||||||
|
})
|
||||||
|
end
|
||||||
|
|
||||||
|
if vim.api.nvim_win_is_valid(win) then
|
||||||
|
vim.api.nvim_win_close(win, true)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
vim.keymap.set("n", "<ESC>", close, {
|
||||||
|
nowait = true,
|
||||||
|
buffer = buf,
|
||||||
|
})
|
||||||
|
vim.keymap.set("n", "q", close, {
|
||||||
|
nowait = true,
|
||||||
|
buffer = buf,
|
||||||
|
})
|
||||||
|
vim.api.nvim_create_autocmd({
|
||||||
|
"BufDelete",
|
||||||
|
"BufLeave",
|
||||||
|
"BufHidden",
|
||||||
|
}, {
|
||||||
|
once = true,
|
||||||
|
buffer = buf,
|
||||||
|
callback = close,
|
||||||
|
})
|
||||||
|
|
||||||
|
local render = Util.throttle(30, function()
|
||||||
|
vim.bo[buf].modifiable = true
|
||||||
|
|
||||||
|
Render.render_plugins(buf, win, 2)
|
||||||
|
|
||||||
|
vim.bo[buf].modifiable = false
|
||||||
|
|
||||||
|
vim.cmd.redraw()
|
||||||
|
end)
|
||||||
|
|
||||||
|
vim.api.nvim_create_autocmd("User", {
|
||||||
|
pattern = "LazyRender",
|
||||||
|
callback = function()
|
||||||
|
if not vim.api.nvim_buf_is_valid(buf) then
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
|
||||||
|
render()
|
||||||
|
end,
|
||||||
|
})
|
||||||
|
render()
|
||||||
|
end
|
||||||
|
|
||||||
|
return M
|
|
@ -0,0 +1,84 @@
|
||||||
|
---@param plugin LazyPlugin
|
||||||
|
---@param filter fun(task:LazyTask):boolean?
|
||||||
|
local function has_task(plugin, filter)
|
||||||
|
if plugin.tasks then
|
||||||
|
for _, task in ipairs(plugin.tasks) do
|
||||||
|
if filter(task) then
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return {
|
||||||
|
{
|
||||||
|
filter = function(plugin)
|
||||||
|
return has_task(plugin, function(task)
|
||||||
|
return task.error ~= nil
|
||||||
|
end)
|
||||||
|
end,
|
||||||
|
title = "Failed",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
filter = function(plugin)
|
||||||
|
return has_task(plugin, function(task)
|
||||||
|
return task.running and task.type == "install"
|
||||||
|
end)
|
||||||
|
end,
|
||||||
|
title = "Installing",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
filter = function(plugin)
|
||||||
|
return has_task(plugin, function(task)
|
||||||
|
return task.running and task.type == "update"
|
||||||
|
end)
|
||||||
|
end,
|
||||||
|
title = "Updating",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
filter = function(plugin)
|
||||||
|
return has_task(plugin, function(task)
|
||||||
|
return task.running and task.type == "clean"
|
||||||
|
end)
|
||||||
|
end,
|
||||||
|
title = "Cleaning",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
filter = function(plugin)
|
||||||
|
return has_task(plugin, function(task)
|
||||||
|
return task.running
|
||||||
|
end)
|
||||||
|
end,
|
||||||
|
title = "Running",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
filter = function(plugin)
|
||||||
|
return plugin.installed and not plugin.uri
|
||||||
|
end,
|
||||||
|
title = "Clean",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
filter = function(plugin)
|
||||||
|
return not plugin.installed and not plugin.uri
|
||||||
|
end,
|
||||||
|
title = "Cleaned",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
filter = function(plugin)
|
||||||
|
return plugin.loaded
|
||||||
|
end,
|
||||||
|
title = "Loaded",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
filter = function(plugin)
|
||||||
|
return plugin.installed
|
||||||
|
end,
|
||||||
|
title = "Installed",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
filter = function()
|
||||||
|
return true
|
||||||
|
end,
|
||||||
|
title = "Not Installed",
|
||||||
|
},
|
||||||
|
}
|
|
@ -0,0 +1,86 @@
|
||||||
|
---@alias TextString {str: string, hl?:string, extmark?:table}
|
||||||
|
---@alias TextLine TextString[]
|
||||||
|
|
||||||
|
---@class Text
|
||||||
|
---@field _lines TextLine[]
|
||||||
|
local Text = {}
|
||||||
|
|
||||||
|
function Text.new()
|
||||||
|
local self = setmetatable({}, {
|
||||||
|
__index = Text,
|
||||||
|
})
|
||||||
|
self._lines = {}
|
||||||
|
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
|
||||||
|
---@param str string
|
||||||
|
---@param hl string|table
|
||||||
|
function Text:append(str, hl)
|
||||||
|
if #self._lines == 0 then
|
||||||
|
self:nl()
|
||||||
|
end
|
||||||
|
|
||||||
|
table.insert(self._lines[#self._lines], {
|
||||||
|
str = str,
|
||||||
|
hl = type(hl) == "string" and hl or nil,
|
||||||
|
extmark = type(hl) == "table" and hl or nil,
|
||||||
|
})
|
||||||
|
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
|
||||||
|
function Text:nl()
|
||||||
|
table.insert(self._lines, {})
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
|
||||||
|
function Text:render(buf, padding)
|
||||||
|
padding = padding or 0
|
||||||
|
local lines = {}
|
||||||
|
|
||||||
|
for _, line in ipairs(self._lines) do
|
||||||
|
local str = (" "):rep(padding)
|
||||||
|
|
||||||
|
for _, segment in ipairs(line) do
|
||||||
|
str = str .. segment.str
|
||||||
|
end
|
||||||
|
|
||||||
|
table.insert(lines, str)
|
||||||
|
end
|
||||||
|
|
||||||
|
vim.api.nvim_buf_set_lines(buf, 0, -1, false, lines)
|
||||||
|
|
||||||
|
for l, line in ipairs(self._lines) do
|
||||||
|
local col = padding
|
||||||
|
|
||||||
|
for _, segment in ipairs(line) do
|
||||||
|
local width = vim.fn.strlen(segment.str)
|
||||||
|
|
||||||
|
if segment.hl then
|
||||||
|
vim.api.nvim_buf_set_extmark(buf, Config.ns, l - 1, col, {
|
||||||
|
hl_group = segment.hl,
|
||||||
|
end_col = col + width,
|
||||||
|
})
|
||||||
|
end
|
||||||
|
|
||||||
|
if segment.extmark then
|
||||||
|
vim.api.nvim_buf_set_extmark(buf, Config.ns, l - 1, col, segment.extmark)
|
||||||
|
end
|
||||||
|
|
||||||
|
col = col + width
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function Text:trim()
|
||||||
|
while #self._lines > 0 and #self._lines[1] == 0 do
|
||||||
|
table.remove(self._lines, 1)
|
||||||
|
end
|
||||||
|
|
||||||
|
while #self._lines > 0 and #self._lines[#self._lines] == 0 do
|
||||||
|
table.remove(self._lines)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return Text
|
Loading…
Reference in New Issue