outline: Rework how lines and details are set

Does not mess with the cursor position
This commit is contained in:
simrat39
2021-04-19 18:17:48 -07:00
parent 3ee7b6ef0d
commit 9c2e6b1976

View File

@@ -17,7 +17,10 @@ local function setupCommands()
end end
local function setup_autocmd() local function setup_autocmd()
vim.cmd("autocmd InsertLeave,BufEnter,BufWinEnter,TabEnter,BufWritePost * :lua require('symbols-outline')._refresh()") vim.cmd(
"autocmd InsertLeave,BufEnter,BufWinEnter,TabEnter,BufWritePost * :lua require('symbols-outline')._refresh()")
vim.cmd(
"autocmd BufEnter,TabEnter * :lua print('Bruh')")
end end
local function getParams() local function getParams()
@@ -32,7 +35,7 @@ D.state = {
linear_outline_items = {}, linear_outline_items = {},
outline_win = nil, outline_win = nil,
outline_buf = nil, outline_buf = nil,
code_win = nil, code_win = nil
} }
local function wipe_state() local function wipe_state()
@@ -110,39 +113,49 @@ local function setup_highlights()
end end
end end
local function write(outline_items, bufnr, winnr) local function get_lines(outline_items, bufnr, winnr, lines)
lines = lines or {}
for _, value in ipairs(outline_items) do for _, value in ipairs(outline_items) do
local line = string.rep(" ", value.depth) local line = string.rep(" ", value.depth)
vim.api.nvim_buf_set_lines(bufnr, -2, -2, false, table.insert(lines, line .. value.icon .. " " .. value.name)
{line .. value.icon .. " " .. value.name})
if value.detail ~= nil then if value.children ~= nil then
local lines = vim.fn.line('$') get_lines(value.children, bufnr, winnr, lines)
vim.api.nvim_buf_set_virtual_text(bufnr, -1, lines - 2,
{{value.detail, "Comment"}}, {})
end end
end
vim.api.nvim_buf_set_keymap(bufnr, "n", "<Cr>",
":lua require('symbols-outline').goto_location()<Cr>",
{})
return lines
end
vim.api.nvim_buf_set_keymap(bufnr, "n", "<Cr>", local function get_details(outline_items, bufnr, winnr, lines)
":lua require('symbols-outline').goto_location()<Cr>", lines = lines or {}
{}) for _, value in ipairs(outline_items) do
if value.children ~= nil then write(value.children, bufnr, winnr) end table.insert(lines, value.detail or "")
if value.children ~= nil then
get_details(value.children, bufnr, winnr, lines)
end
end
return lines
end
local function write_outline(bufnr, lines)
vim.api.nvim_buf_set_lines(bufnr, 0, -1, false, lines)
end
local function write_details(bufnr, lines)
for index, value in ipairs(lines) do
vim.api.nvim_buf_set_virtual_text(bufnr, -1, index - 1,
{{value, "Comment"}}, {})
end end
end end
local function delete_last_line(bufnr)
vim.api.nvim_buf_set_lines(bufnr, -2, -1, false, {})
end
local function goto_first_line() vim.fn.cursor(1, 1) end
local function disable_nums(winnr) local function disable_nums(winnr)
vim.api.nvim_win_set_option(winnr, "number", false) vim.api.nvim_win_set_option(winnr, "number", false)
end end
local function delete_all_lines(bufnr)
vim.api.nvim_buf_set_lines(bufnr, 0, -2, false, {})
end
local function clear_virt_text(bufnr) local function clear_virt_text(bufnr)
vim.api.nvim_buf_clear_namespace(bufnr, -1, 0, -1) vim.api.nvim_buf_clear_namespace(bufnr, -1, 0, -1)
end end
@@ -156,16 +169,24 @@ function D._refresh()
D.state.outline_items = parse(result) D.state.outline_items = parse(result)
D.state.linear_outline_items = make_linear(parse(result)) D.state.linear_outline_items = make_linear(parse(result))
local lines = get_lines(D.state.outline_items, D.state.outline_buf,
D.state.outline_win)
write_outline(D.state.outline_buf, lines)
clear_virt_text(D.state.outline_buf) clear_virt_text(D.state.outline_buf)
delete_all_lines(D.state.outline_buf) local details = get_details(D.state.outline_items,
write(D.state.outline_items, D.state.outline_buf, D.state.outline_buf, D.state.outline_win)
D.state.outline_win) write_details(D.state.outline_buf, details)
delete_last_line(D.state.outline_buf)
-- goto_first_line()
end) end)
end end
end end
local function set_onEnter_keymap(bufnr)
vim.api.nvim_buf_set_keymap(bufnr, "n", "<Cr>",
":lua require('symbols-outline').goto_location()<Cr>",
{})
end
local function handler(_, _, result) local function handler(_, _, result)
D.state.code_win = vim.api.nvim_get_current_win() D.state.code_win = vim.api.nvim_get_current_win()
@@ -185,10 +206,17 @@ local function handler(_, _, result)
D.state.linear_outline_items = make_linear(parse(result)) D.state.linear_outline_items = make_linear(parse(result))
disable_nums(D.state.outline_win) disable_nums(D.state.outline_win)
write(D.state.outline_items, D.state.outline_buf, D.state.outline_win)
local lines = get_lines(D.state.outline_items, D.state.outline_buf,
D.state.outline_win)
write_outline(D.state.outline_buf, lines)
local details = get_details(D.state.outline_items, D.state.outline_buf,
D.state.outline_win)
write_details(D.state.outline_buf, details)
set_onEnter_keymap(D.state.outline_buf)
setup_highlights() setup_highlights()
delete_last_line(D.state.outline_buf)
goto_first_line()
end end
function D.toggle_outline() function D.toggle_outline()