Files
outline.nvim/lua/symbols-outline/writer.lua
2021-09-30 14:08:53 -07:00

53 lines
1.6 KiB
Lua

local vim = vim
local parser = require('symbols-outline.parser')
local config = require('symbols-outline.config')
local M = {}
local function is_buffer_outline(bufnr)
local isValid = vim.api.nvim_buf_is_valid(bufnr)
local name = vim.api.nvim_buf_get_name(bufnr)
local ft = vim.api.nvim_buf_get_option(bufnr, "filetype")
return string.match(name, "OUTLINE") ~= nil and ft == "Outline" and isValid
end
function M.write_outline(bufnr, lines)
if not is_buffer_outline(bufnr) then return end
vim.api.nvim_buf_set_option(bufnr, "modifiable", true)
vim.api.nvim_buf_set_lines(bufnr, 0, -1, false, lines)
vim.api.nvim_buf_set_option(bufnr, "modifiable", false)
end
local ns = vim.api.nvim_create_namespace("symbols-outline-virt-text")
function M.write_details(bufnr, lines)
if not is_buffer_outline(bufnr) then return end
if not config.options.show_symbol_details then return end
for index, value in ipairs(lines) do
vim.api.nvim_buf_set_extmark(bufnr, ns, index - 1, -1, {
virt_text = {{value, "Comment"}},
virt_text_pos = "eol",
hl_mode = "combine"
})
end
end
local function clear_virt_text(bufnr)
vim.api.nvim_buf_clear_namespace(bufnr, -1, 0, -1)
end
-- runs the whole writing routine where the text is cleared, new data is parsed
-- and then written
function M.parse_and_write(bufnr, flattened_outline_items)
local lines = parser.get_lines(flattened_outline_items)
M.write_outline(bufnr, lines)
clear_virt_text(bufnr)
local details = parser.get_details(flattened_outline_items)
M.write_details(bufnr, details)
end
return M