mirror of
https://github.com/SpaceVim/SpaceVim.git
synced 2025-01-24 06:20:05 +08:00
144 lines
4.1 KiB
Lua
144 lines
4.1 KiB
Lua
local M = {}
|
|
|
|
function M.support_float()
|
|
return vim.fn.exists('*nvim_open_win') == 1
|
|
end
|
|
|
|
function M.opened()
|
|
return vim.fn.win_id2tabwin(M.__winid)[1] == vim.fn.tabpagenr()
|
|
end
|
|
|
|
function M.show()
|
|
if vim.api.nvim_win_is_valid(M.__winid) and vim.fn.has('nvim-0.10.0') == 1 then
|
|
vim.api.nvim_win_set_config(M.__winid, { hide = false })
|
|
end
|
|
end
|
|
|
|
function M.open_float(sl, ...)
|
|
local hide = select(1, ...)
|
|
if hide == true or hide == false then
|
|
else
|
|
hide = false
|
|
end
|
|
if M.__bufnr == nil or vim.fn.bufexists(M.__bufnr) == 0 then
|
|
M.__bufnr = vim.api.nvim_create_buf(false, true)
|
|
end
|
|
if M.__winid == nil or not M.opened() then
|
|
local opt = {
|
|
relative = 'editor',
|
|
width = vim.o.columns,
|
|
height = 1,
|
|
-- highlight = 'SpaceVim_statusline_a_bold',
|
|
row = vim.o.lines - 2,
|
|
col = 0,
|
|
}
|
|
if vim.fn.has('nvim-0.10.0') == 1 then
|
|
opt.hide = hide
|
|
end
|
|
M.__winid = vim.api.nvim_open_win(M.__bufnr, false, opt)
|
|
end
|
|
vim.fn.setwinvar(M.__winid, '&winhighlight', 'Normal:SpaceVim_statusline_a_bold')
|
|
vim.fn.setbufvar(M.__bufnr, '&relativenumber', 0)
|
|
vim.fn.setbufvar(M.__bufnr, '&number', 0)
|
|
vim.fn.setbufvar(M.__bufnr, '&bufhidden', 'wipe')
|
|
vim.fn.setbufvar(M.__bufnr, '&cursorline', 0)
|
|
vim.fn.setbufvar(M.__bufnr, '&modifiable', 1)
|
|
vim.fn.setwinvar(vim.fn.win_id2win(M.__winid), '&cursorline', 0)
|
|
vim.api.nvim_buf_set_virtual_text(M.__bufnr, -1, 0, sl, {})
|
|
vim.fn.setbufvar(M.__bufnr, '&modifiable', 0)
|
|
return M.__winid
|
|
end
|
|
|
|
function M.close_float()
|
|
if M.__winid ~= nil then
|
|
vim.api.nvim_win_close(M.__winid, true)
|
|
end
|
|
end
|
|
|
|
function M.check_width(len, sec, winwidth)
|
|
return len + M.len(sec) < winwidth
|
|
|
|
end
|
|
|
|
function M.len(sec)
|
|
if not sec then return 0 end
|
|
local str = vim.fn.matchstr(sec, '%{.*}')
|
|
if vim.fn.empty(str) == 0 then
|
|
local pos = vim.fn.match(str, '}')
|
|
return vim.fn.len(sec) - vim.fn.len(str) + vim.fn.len(vim.fn.eval(string.sub(str, 3, pos))) + 4
|
|
else
|
|
return vim.fn.len(sec) + 4
|
|
end
|
|
end
|
|
|
|
function M.eval(sec)
|
|
return vim.fn.substitute(sec, '%{.*}', '', 'g')
|
|
end
|
|
|
|
function M.build(left_sections, right_sections, lsep, rsep, fname, tag, hi_a, hi_b, hi_c, hi_z, winwidth)
|
|
local l = '%#' .. hi_a .. '#' .. left_sections[1]
|
|
l = l .. '%#' .. hi_a .. '_' .. hi_b .. '#' .. lsep
|
|
local flag = true
|
|
local len = 0
|
|
for _, sec in ipairs(vim.tbl_filter(function(v)
|
|
return vim.fn.empty(v) == 0
|
|
end, vim.list_slice(left_sections, 2))) do
|
|
if M.check_width(len, sec, winwidth) then
|
|
if flag then
|
|
l = l .. '%#' .. hi_b .. '#' .. sec
|
|
l = l .. '%#' .. hi_b .. '_' .. hi_c .. '#' .. lsep
|
|
else
|
|
l = l .. '%#' .. hi_c .. '#' .. sec
|
|
l = l .. '%#' .. hi_c .. '_' .. hi_b .. '#' .. lsep
|
|
end
|
|
flag = not flag
|
|
end
|
|
end
|
|
l = string.sub(l, 1, #l - #lsep)
|
|
if #right_sections == 0 then
|
|
if flag then
|
|
return l .. '%#' .. hi_c .. '#'
|
|
else
|
|
return l .. '%#' .. hi_b .. '#'
|
|
end
|
|
end
|
|
if M.check_width(len, fname, winwidth) then
|
|
len = len + M.len(fname)
|
|
if flag then
|
|
l = l .. '%#' .. hi_c .. '_' .. hi_z .. '#' .. lsep .. '%#' .. hi_z .. '#' .. fname .. '%='
|
|
else
|
|
l = l .. '%#' .. hi_b .. '_' .. hi_z .. '#' .. lsep .. '%#' .. hi_z .. '#' .. fname .. '%='
|
|
end
|
|
else
|
|
if flag then
|
|
l = l .. '%#' .. hi_c .. '_' .. hi_z .. '#' .. lsep .. '%='
|
|
else
|
|
l = l .. '%#' .. hi_b .. '_' .. hi_z .. '#' .. lsep .. '%='
|
|
end
|
|
end
|
|
if M.check_width(len, tag, winwidth) and vim.g.spacevim_enable_statusline_tag == 1 then
|
|
l = l .. '%#' .. hi_z .. '#' .. tag
|
|
end
|
|
l = l .. '%#' .. hi_b .. '_' .. hi_z .. '#' .. rsep
|
|
flag = true
|
|
for _, sec in ipairs(vim.tbl_filter(function(v)
|
|
return vim.fn.empty(v) == 0
|
|
end, right_sections)) do
|
|
if M.check_width(len, sec, winwidth) then
|
|
len = len + M.len(sec)
|
|
if flag then
|
|
l = l .. '%#' .. hi_b .. '#' .. sec
|
|
l = l .. '%#' .. hi_c .. '_' .. hi_b .. '#' .. rsep
|
|
else
|
|
l = l .. '%#' .. hi_c .. '#' .. sec
|
|
l = l .. '%#' .. hi_b .. '_' .. hi_c .. '#' .. rsep
|
|
end
|
|
flag = not flag
|
|
end
|
|
end
|
|
l = string.sub(l, 1, #l - #rsep)
|
|
return l
|
|
end
|
|
|
|
return M
|