
## Description LazyVim comes with a bunch of smaller QoL plugin like features, but it's not easy for non LazyVim users to use them. That's why I started working on [snacks.nvim](https://github.com/folke/snacks.nvim), a collection of small QoL plugins for Neovim. Snacks also includes a bunch of new improvements to these features. This PR fully integrates with snacks. ## Todo - [ ] add proper deprecations where needed - [ ] create snacks docs - [ ] document all the new improvements relevant to LazyVim users ## Closes - [ ] #4492 - [ ] #4333 - [ ] #4687 ## Screenshots <!-- Add screenshots of the changes if applicable. --> ## Checklist - [ ] I've read the [CONTRIBUTING](https://github.com/LazyVim/LazyVim/blob/main/CONTRIBUTING.md) guidelines.
130 lines
3.3 KiB
Lua
130 lines
3.3 KiB
Lua
---@class lazyvim.util.ui
|
|
local M = {}
|
|
|
|
function M.foldtext()
|
|
local ok = pcall(vim.treesitter.get_parser, vim.api.nvim_get_current_buf())
|
|
local ret = ok and vim.treesitter.foldtext and vim.treesitter.foldtext()
|
|
if not ret or type(ret) == "string" then
|
|
ret = { { vim.api.nvim_buf_get_lines(0, vim.v.lnum - 1, vim.v.lnum, false)[1], {} } }
|
|
end
|
|
table.insert(ret, { " " .. LazyVim.config.icons.misc.dots })
|
|
|
|
if not vim.treesitter.foldtext then
|
|
return table.concat(
|
|
vim.tbl_map(function(line)
|
|
return line[1]
|
|
end, ret),
|
|
" "
|
|
)
|
|
end
|
|
return ret
|
|
end
|
|
|
|
---@return {fg?:string}?
|
|
function M.fg(name)
|
|
local color = M.color(name)
|
|
return color and { fg = color } or nil
|
|
end
|
|
|
|
---@param name string
|
|
---@param bg? boolean
|
|
---@return string?
|
|
function M.color(name, bg)
|
|
---@type {foreground?:number}?
|
|
---@diagnostic disable-next-line: deprecated
|
|
local hl = vim.api.nvim_get_hl and vim.api.nvim_get_hl(0, { name = name, link = false })
|
|
or vim.api.nvim_get_hl_by_name(name, true)
|
|
---@diagnostic disable-next-line: undefined-field
|
|
---@type string?
|
|
local color = nil
|
|
if hl then
|
|
if bg then
|
|
color = hl.bg or hl.background
|
|
else
|
|
color = hl.fg or hl.foreground
|
|
end
|
|
end
|
|
return color and string.format("#%06x", color) or nil
|
|
end
|
|
|
|
M.skip_foldexpr = {} ---@type table<number,boolean>
|
|
local skip_check = assert(vim.uv.new_check())
|
|
|
|
function M.foldexpr()
|
|
local buf = vim.api.nvim_get_current_buf()
|
|
|
|
-- still in the same tick and no parser
|
|
if M.skip_foldexpr[buf] then
|
|
return "0"
|
|
end
|
|
|
|
-- don't use treesitter folds for terminal
|
|
if vim.bo[buf].buftype == "terminal" then
|
|
return "0"
|
|
end
|
|
|
|
-- as long as we don't have a filetype, don't bother
|
|
-- checking if treesitter is available (it won't)
|
|
if vim.bo[buf].filetype == "" then
|
|
return "0"
|
|
end
|
|
|
|
local ok = pcall(vim.treesitter.get_parser, buf)
|
|
|
|
if ok then
|
|
return vim.treesitter.foldexpr()
|
|
end
|
|
|
|
-- no parser available, so mark it as skip
|
|
-- in the next tick, all skip marks will be reset
|
|
M.skip_foldexpr[buf] = true
|
|
skip_check:start(function()
|
|
M.skip_foldexpr = {}
|
|
skip_check:stop()
|
|
end)
|
|
return "0"
|
|
end
|
|
|
|
function M.maximize()
|
|
---@type {k:string, v:any}[]?
|
|
local maximized = nil
|
|
return Snacks.toggle({
|
|
name = "Maximize",
|
|
get = function()
|
|
return maximized ~= nil
|
|
end,
|
|
set = function(state)
|
|
if state then
|
|
maximized = {}
|
|
local function set(k, v)
|
|
table.insert(maximized, 1, { k = k, v = vim.o[k] })
|
|
vim.o[k] = v
|
|
end
|
|
set("winwidth", 999)
|
|
set("winheight", 999)
|
|
set("winminwidth", 10)
|
|
set("winminheight", 4)
|
|
vim.cmd("wincmd =")
|
|
-- `QuitPre` seems to be executed even if we quit a normal window, so we don't want that
|
|
-- `VimLeavePre` might be another consideration? Not sure about differences between the 2
|
|
vim.api.nvim_create_autocmd("ExitPre", {
|
|
once = true,
|
|
group = vim.api.nvim_create_augroup("lazyvim_restore_max_exit_pre", { clear = true }),
|
|
desc = "Restore width/height when close Neovim while maximized",
|
|
callback = function()
|
|
M.maximize.set(false)
|
|
end,
|
|
})
|
|
else
|
|
for _, opt in ipairs(maximized) do
|
|
vim.o[opt.k] = opt.v
|
|
end
|
|
maximized = nil
|
|
vim.cmd("wincmd =")
|
|
end
|
|
end,
|
|
})
|
|
end
|
|
|
|
return M
|