refactor: Reorganize modules
Primarily: - Utils - Sidebar (removed the need of writer.lua) - Resolve keymaps shortcut in config eraly - Put highlight functions into highlight.lua - Put functions that do stuff on outline window into view.lua
This commit is contained in:
@@ -1,38 +1,102 @@
|
||||
local M = {}
|
||||
local M = {
|
||||
ns = {
|
||||
hover = vim.api.nvim_create_namespace('outline-current'),
|
||||
items = vim.api.nvim_create_namespace('outline-items-highlight'),
|
||||
vt = vim.api.nvim_create_namespace('outline-virt-text'),
|
||||
},
|
||||
}
|
||||
|
||||
M.hovered_hl_ns = vim.api.nvim_create_namespace('hovered_item')
|
||||
|
||||
function M.clear_hover_highlight(bufnr)
|
||||
vim.api.nvim_buf_clear_namespace(bufnr, M.hovered_hl_ns, 0, -1)
|
||||
---Clear all highlights in buffer
|
||||
---@param bufnr integer
|
||||
function M.clear_all_ns(bufnr)
|
||||
vim.api.nvim_buf_clear_namespace(bufnr, -1, 0, -1)
|
||||
end
|
||||
|
||||
function M.add_hover_highlight(bufnr, line, col_start)
|
||||
vim.api.nvim_buf_add_highlight(bufnr, M.hovered_hl_ns, 'OutlineCurrent', line, col_start, -1)
|
||||
---Clear hover highlights in buffer
|
||||
---@param bufnr integer
|
||||
function M.clear_hovers(bufnr)
|
||||
vim.api.nvim_buf_clear_namespace(bufnr, M.ns.hover, 0, -1)
|
||||
end
|
||||
|
||||
local get_hl_by_name
|
||||
|
||||
if vim.fn.has('nvim-0.9') == 1 then
|
||||
get_hl_by_name = function(name)
|
||||
local hl = vim.api.nvim_get_hl(0, { name = name, link = false })
|
||||
return { fg = hl.fg, bg = hl.bg, ctermfg = hl.ctermfg, ctermbg = hl.ctermbg }
|
||||
end
|
||||
else
|
||||
get_hl_by_name = function(name)
|
||||
---@diagnostic disable-next-line undefined-field
|
||||
local hlrgb = vim.api.nvim_get_hl_by_name(name, true)
|
||||
---@diagnostic disable-next-line undefined-field
|
||||
local hl = vim.api.nvim_get_hl_by_name(name, false)
|
||||
return {
|
||||
fg = hlrgb.foreground,
|
||||
bg = hlrgb.background,
|
||||
ctermfg = hl.foreground,
|
||||
ctermbg = hl.background,
|
||||
}
|
||||
---Add single hover highlights
|
||||
---@param bufnr integer
|
||||
---@param nodes outline.FlatSymbolNode[]
|
||||
function M.hovers(bufnr, nodes)
|
||||
for line, node in ipairs(nodes) do
|
||||
if node.hovered then
|
||||
vim.api.nvim_buf_add_highlight(bufnr, M.ns.hover, 'OutlineCurrent', line - 1, node.prefix_length, -1)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function M.setup_highlights()
|
||||
---Add list of highlights `hl` for outline items
|
||||
---@param bufnr integer
|
||||
---@param hl_list outline.HL[]
|
||||
function M.items(bufnr, hl_list)
|
||||
for _, h in ipairs(hl_list) do
|
||||
-- stylua: ignore start
|
||||
vim.api.nvim_buf_add_highlight(
|
||||
bufnr, M.ns.items,
|
||||
h.name, h.line - 1, h.from, h.to
|
||||
)
|
||||
-- stylua: ignore end
|
||||
end
|
||||
end
|
||||
|
||||
---Add details virtual text
|
||||
---@param bufnr integer Outline buffer
|
||||
---@param details string[] Virtual text to add
|
||||
function M.details(bufnr, details)
|
||||
for index, detail in ipairs(details) do
|
||||
vim.api.nvim_buf_set_extmark(bufnr, M.ns.vt, index - 1, -1, {
|
||||
virt_text = { { detail, 'OutlineDetails' } },
|
||||
virt_text_pos = 'eol',
|
||||
hl_mode = 'combine',
|
||||
})
|
||||
end
|
||||
end
|
||||
|
||||
---Add linenos virtual text
|
||||
---@param bufnr integer Outline buffer
|
||||
---@param linenos string[] Must already be padded
|
||||
---@param hl_mode string Valid value for `buf_set_extmark` option `hl_mode`
|
||||
function M.linenos(bufnr, linenos, hl_mode)
|
||||
-- TODO: Fix lineno not appearing if text in line is truncated on the right
|
||||
-- due to narrow window, after nvim fixes virt_text_hide.
|
||||
for index, lineno in ipairs(linenos) do
|
||||
vim.api.nvim_buf_set_extmark(bufnr, M.ns.vt, index - 1, -1, {
|
||||
virt_text = { { lineno, 'OutlineLineno' } },
|
||||
virt_text_pos = 'overlay',
|
||||
virt_text_win_col = 0,
|
||||
hl_mode = hl_mode,
|
||||
})
|
||||
end
|
||||
end
|
||||
|
||||
---Create Outline highlights with default values if they don't already exist
|
||||
function M.setup()
|
||||
local get_hl_by_name
|
||||
|
||||
if _G._outline_nvim_has[9] then
|
||||
get_hl_by_name = function(name)
|
||||
local hl = vim.api.nvim_get_hl(0, { name = name, link = false })
|
||||
return { fg = hl.fg, bg = hl.bg, ctermfg = hl.ctermfg, ctermbg = hl.ctermbg }
|
||||
end
|
||||
else
|
||||
get_hl_by_name = function(name)
|
||||
---@diagnostic disable-next-line undefined-field
|
||||
local hlrgb = vim.api.nvim_get_hl_by_name(name, true)
|
||||
---@diagnostic disable-next-line undefined-field
|
||||
local hl = vim.api.nvim_get_hl_by_name(name, false)
|
||||
return {
|
||||
fg = hlrgb.foreground,
|
||||
bg = hlrgb.background,
|
||||
ctermfg = hl.foreground,
|
||||
ctermbg = hl.background,
|
||||
}
|
||||
end
|
||||
end
|
||||
|
||||
-- Setup the OutlineCurrent highlight group if it hasn't been done already by
|
||||
-- a theme or manually set
|
||||
if vim.fn.hlexists('OutlineCurrent') == 0 then
|
||||
|
||||
Reference in New Issue
Block a user