dotfiles/.config/nvim/tree.nvim/lua/tree/float.lua

147 lines
3.5 KiB
Lua
Raw Normal View History

2021-11-13 19:24:20 +01:00
-- vim: set sw=2 sts=4 et tw=78 foldlevel=0 foldmethod=marker:
local fn = vim.fn
local api = vim.api
local cmd = vim.api.nvim_command
local function buildContent(info)
local marker = {
ft='',
date='',
size=''
}
local content = {}
for k, v in pairs(info) do
table.insert(content, string.format('%4s: %s', k, v))
end
return content
end
local function winPos(width, height)
local bottom_line = fn.line('w0') + fn.winheight(0) - 1
local curr_pos = fn.getpos('.')
local rownr = curr_pos[2]
local colnr = curr_pos[3]
local columns = vim.o.columns
-- a long wrap line
if colnr > columns then
colnr = colnr % columns
rownr = rownr + colnr / columns
end
local vert, row, hor, col
if rownr + height <= bottom_line then
vert = 'N'
row = 1
else
vert = 'S'
row = 0
end
if colnr + width <= columns then
hor = 'W'
col = 0
else
hor = 'E'
col = 1
end
return row, col, vert, hor
end
local function winSize(info, max_width, max_height)
local width = 0
local height = 0
for i, line in ipairs(info) do
local line_width = fn.strdisplaywidth(line)
if line_width > max_width then
width = max_width
height = height + line_width / max_width + 1
else
width = fn.max({line_width, width})
height = height + 1
end
end
if height > max_height then
height = max_height
end
return width, height
end
function closePopup()
local winnr = fn.winnr('$')
for i=1,winnr do
if fn.getbufvar(fn.winbufnr(i), '&filetype') == 'tree-float' then
cmd(i .. 'wincmd c')
cmd('autocmd! TreeClosePopup * <buffer>')
return
end
end
end
function Tree_display(info)
local content = buildContent(info)
local tree_popup_max_height
local tree_popup_max_width
local max_height = tree_popup_max_height or 0.6*vim.o.lines
local max_width = tree_popup_max_width or 0.6*vim.o.columns
max_height = fn.float2nr(max_height)
max_width = fn.float2nr(max_width)
local width, height = winSize(content, max_width, max_height)
local row, col, vert, hor = winPos(width, height)
-- for i in range(len(content)) do
-- let line = content[i]
-- end
-- `width + 2`? ==> set foldcolumn=1
local options = {
relative='cursor',
anchor=vert .. hor,
row=row,
col=col,
width=width + 2,
height=height,
}
api.nvim_open_win(fn.bufnr('%'), true, options)
cmd('enew!')
fn.append(0, content)
api.nvim_exec([[
normal gg
nmap <silent> <buffer> q :close<CR>
setlocal foldcolumn=1
setlocal buftype=nofile
setlocal bufhidden=wipe
setlocal signcolumn=no
setlocal filetype=tree-float
setlocal noautoindent
setlocal nosmartindent
setlocal wrap
setlocal nobuflisted
setlocal noswapfile
setlocal nocursorline
setlocal nonumber
setlocal norelativenumber
setlocal nospell
if has('nvim')
setlocal winhighlight=Normal:treeFloatingNormal
setlocal winhighlight=FoldColumn:treeFloatingNormal
endif
noautocmd wincmd p
augroup TreeClosePopup
autocmd!
autocmd CursorMoved,CursorMovedI,InsertEnter,BufLeave,WinLeave <buffer> call v:lua.closePopup()
augroup END
]], false)
end
-- print(vim.inspect(buildContent({date='2020-03-08', ft='txt'})))
-- call v:lua.Tree_display({ 'date': '2020-03-08', 'ft': 'txt' })
-- lua Tree_display({ date='2020-03-08', ft='txt', size='1024KB' })
-- autocmd CursorHold <buffer> lua Tree_display({ date='2020-03-08', ft='txt', size='1024KB' })